void ProcssUartData(UCHAR *data,int len)
{
DumpHex(data, len, "RECV");
}
UINT Thread_UartGet(LPVOID*arg)
{
// 帧头[MCU->PC] 55.BB+Content_2B+OP_1B+(body_NB)+CheckSum
int index = 0;
char ch = 0;
UCHAR recvBuf[1024 * 10] = { 0 };
DWORD currTick = 0;
DWORD recvTick = 0;
BOOL bStart = FALSE;
SHORT nContentLen = 0;
while (1)
{
currTick = GetTickCount();
if (RingBuffer_pop(g_ringBuffer,&ch))
{
bStart = TRUE;
recvTick = currTick;
recvBuf[index] = ch;
switch (index)
{
case 0:
if (recvBuf[0] == 0x55)
{
index++;
}
break;
case 1:
if (recvBuf[1] == 0xBB)
{
index++;
}
else
{
index = 0;
}
break;
case 2:
nContentLen = recvBuf[2]<<8;
index++;
break;
case 3:
nContentLen |= recvBuf[3];
index++;
break;
default:
index++;
if (--nContentLen <= 0)
{
recvTick = currTick - 999;//强制超时,做数据处理
}
break;
}
}
else
{
Sleep(20);
}
if (bStart)
{
if (currTick - recvTick>120)//接收超时设定
{
ProcssUartData(recvBuf, index);
index = 0;//reset
bStart = FALSE;
}
}
}
return 0;
}
[单片机C] 缓冲接收串口的方案
于 2023-04-11 09:14:55 首次发布
该代码段实现了一个UART数据接收线程,使用RingBuffer处理串口数据。当接收到特定帧头(55.BB)后,它会解析帧内容长度并存储到缓冲区。如果在设定时间内未接收到完整帧,则执行数据处理函数进行错误处理。
摘要由CSDN通过智能技术生成