Browse Source

【待调试】尝试解决串口数据跳变问题

master
Lizongdi 2 days ago
parent
commit
c0b7da0633
  1. 3
      bspMCU/bsp_uart.c
  2. 1
      library/ringbuffer/include/ringbuffer.h
  3. 28
      library/ringbuffer/ringbuffer.c
  4. 7
      peripheral/com.c

3
bspMCU/bsp_uart.c

@ -121,6 +121,7 @@ void UART_DMA_RX_IRQHandler(TComCtrl *_ptComCtrl)
data_len = current_pos - ptUartUserData->m_last_dma_pos; data_len = current_pos - ptUartUserData->m_last_dma_pos;
if (data_len > 0) if (data_len > 0)
{ {
SCB_InvalidateDCache_by_Addr((uint32_t*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], data_len);
rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], data_len); rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], data_len);
} }
} }
@ -133,10 +134,12 @@ void UART_DMA_RX_IRQHandler(TComCtrl *_ptComCtrl)
if (part1 > 0) if (part1 > 0)
{ {
SCB_InvalidateDCache_by_Addr((uint32_t*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], part1);
rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], part1); rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[ptUartUserData->m_last_dma_pos], part1);
} }
if (part2 > 0) if (part2 > 0)
{ {
SCB_InvalidateDCache_by_Addr((uint32_t*)&ptUartUserData->m_dma_rx_buf[0], part2);
rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[0], part2); rd_ComRecvProc(_ptComCtrl, (const char*)&ptUartUserData->m_dma_rx_buf[0], part2);
} }
} }

1
library/ringbuffer/include/ringbuffer.h

@ -118,6 +118,7 @@ extern int rd_RingbufferGet(rd_ringbuf_t *rb, char *ptr, int length);
extern int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch); extern int rd_RingbufferGetchar(rd_ringbuf_t *rb, char *ch);
extern void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size); extern void rd_RingbufferInit(rd_ringbuf_t *rb, char *pool, int size);
extern int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr); extern int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr);
extern int rd_RingbufferPeekLinear(rd_ringbuf_t *rb, char *out, int length);
extern int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length); extern int rd_RingbufferPut(rd_ringbuf_t *rb, const char *ptr, int length);
extern int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch); extern int rd_RingbufferPutchar(rd_ringbuf_t *rb, const char ch);
extern int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch); extern int rd_RingbufferPutcharForce(rd_ringbuf_t *rb, const char ch);

28
library/ringbuffer/ringbuffer.c

@ -249,6 +249,34 @@ int rd_RingbufferPeak(rd_ringbuf_t *rb, char **ptr)
return avail; return avail;
} }
/**
* @brief Peek data from the ring buffer into a linear buffer without consuming.
*
* @param rb A pointer to the ring buffer object.
* @param out A pointer to the output buffer to fill.
* @param length Maximum number of bytes to peek.
*
* @return Return the number of bytes actually copied.
*/
int rd_RingbufferPeekLinear(rd_ringbuf_t *rb, char *out, int length)
{
if (!rb || !out || length <= 0) return RD_INVALUE;
int avail = rd_RingbufferDataLen(rb);
if (avail == 0) return 0;
if (length > avail) length = avail;
unsigned short ri = ATOMIC_LOAD(&rb->m_sReadIndex, unsigned short, ATOMIC_ORDER_RELAXED);
if (rb->m_iBufsize - ri >= length) {
RD_MEMCPY(out, &rb->m_pcBufPtr[ri], length);
} else {
int first = rb->m_iBufsize - ri;
RD_MEMCPY(out, &rb->m_pcBufPtr[ri], first);
RD_MEMCPY(out + first, &rb->m_pcBufPtr[0], length - first);
}
return length;
}
/** /**
* @brief Put a byte into the ring buffer. If ring buffer is full, this operation will fail. * @brief Put a byte into the ring buffer. If ring buffer is full, this operation will fail.
* *

7
peripheral/com.c

@ -229,6 +229,8 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
char *pPeakData = NULL; char *pPeakData = NULL;
int iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData); int iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData);
char cPeekBuf[512];
int iPeekLenLinear = rd_RingbufferPeekLinear(_ptComCtrl->m_stComBuf.m_ptRecv, cPeekBuf, sizeof(cPeekBuf));
if (iPeakLen < 0) if (iPeakLen < 0)
{ {
@ -238,6 +240,7 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
{ {
Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL); Rd_SemWait(&_ptComCtrl->m_stComBuf.m_sem_Recv, __func__, NULL);
iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData); iPeakLen = rd_RingbufferPeak(_ptComCtrl->m_stComBuf.m_ptRecv, &pPeakData);
iPeekLenLinear = rd_RingbufferPeekLinear(_ptComCtrl->m_stComBuf.m_ptRecv, cPeekBuf, sizeof(cPeekBuf));
if (iPeakLen < 0) if (iPeakLen < 0)
{ {
@ -269,7 +272,7 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
iPackLen = 1; iPackLen = 1;
if (NULL != ptMutiDev->m_pfCheck) if (NULL != ptMutiDev->m_pfCheck)
{ {
iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); iPackLen = ptMutiDev->m_pfCheck(cPeekBuf, iPeekLenLinear);
} }
if (iPackLen > 0) if (iPackLen > 0)
@ -341,7 +344,7 @@ int rd_ComRead(TComCtrl *_ptComCtrl, char *_pBuffer, uint32_t _iSize)
iPackLen = 1; iPackLen = 1;
if (NULL != ptMutiDev->m_pfCheck) if (NULL != ptMutiDev->m_pfCheck)
{ {
iPackLen = ptMutiDev->m_pfCheck(pPeakData, iPeakLen); iPackLen = ptMutiDev->m_pfCheck(cPeekBuf, iPeekLenLinear);
} }
} }

Loading…
Cancel
Save