概述
因为这篇文章自定义的协议没有贴出来,且后面测试发现这个效率有BUG,我目前将这篇文章仅仅作为一个参考,后面再写一篇文章"高效的串口循环Buffer接收处理思路及代码2",请具体参考后面这篇文章经过了MCU和MFC对接确认的代码
//串口
#define UART0_RX_BUFF_LEN (56 * 16)
#define UART0_FRAME_MAX_LEN (56) //单帧最长长度
/****************************************** 全局变量 *********************************************/
/*串口缓存全局变量初始化*/
volatile unsigned char g_u8Uart0RxDataMem[UART0_RX_BUFF_LEN] = {0}; //串口0缓存
volatile unsigned short gUart0RxByteNum = 0; //已经接收到的字节数量
volatile unsigned short gUart0RxIndex = 0; //接收循环写入
volatile unsigned short gUart0RxStartIndex = 0; //处理起始位
//串口一个字节一个字节的收
LONG CAudioProcessorDlg::OnCommunication(WPARAM ch, LPARAM port)
{
unsigned char *pUart0RxDataMem = (unsigned char * )g_u8Uart0RxDataMem;
unsigned char u8DataLen = 0; //解析桢字节长度
CString str;
str.Format(L"%02X", ch);
unsigned char u8Temp[4] = { 0 };
int nRet = 0;
int i = 0;
int nRealLen = 0;
int nRealBeginIndex = 0;
unsigned char u8UartParaBuf[UART0_FRAME_MAX_LEN] = {0}; //临时变量,每次处理一帧数据
Unicode_Cstring2char(str, (char*)u8Temp);
//转换一下
for (i = 0; i < 4; i++ )
{
if (u8Temp[i] >= 'A')
{
u8Temp[i] = u8Temp[i] - 55;
}
else
{
u8Temp[i] = u8Temp[i] - 0x30;
}
}
//按字节接收数据,保证此buf是循环buf
g_u8Uart0RxDataMem[gUart0RxIndex % UART0_RX_BUFF_LEN] = (u8Temp[0] << 4) | u8Temp[1];
gUart0RxIndex = (gUart0RxIndex + 1) % UART0_RX_BUFF_LEN;
gUart0RxByteNum++;
//开始解析数据
while(gUart0RxByteNum) //接收的长度如果大于0
{
if(pUart0RxDataMem[gUart0RxStartIndex] == 0x55)//第一个帧头字节正确
{
break;
}
pUart0RxDataMem[gUart0RxStartIndex % UART0_RX_BUFF_LEN] = 0;
gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
gUart0RxByteNum--;
}
if(gUart0RxByteNum >= UART_RX_PROTOCOL_SIZE) //接收到字节数大于14字节
{
if (0xAA == pUart0RxDataMem[((gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN)])
{
//取桢长度
u8DataLen = pUart0RxDataMem[((gUart0RxStartIndex + 2) % UART0_RX_BUFF_LEN)];
if((UART_RX_PROTOCOL_SIZE == u8DataLen) || (UART_RX_ExPROTOCOL_SIZE == u8DataLen))
{
if(CheckReciveDataCRC(pUart0RxDataMem, u8DataLen))
{
//拷贝一帧数据出来
for(i = 0; i < u8DataLen; i++)
{
//校验通过将数据取出存放到u8UartParaBuf
u8UartParaBuf[i] = pUart0RxDataMem[gUart0RxStartIndex];
pUart0RxDataMem[gUart0RxStartIndex] = 0;
gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
gUart0RxByteNum--;
}
u8DataLen = ProcessingProtocolData(u8UartParaBuf, u8DataLen);
CommunicationSend((char *)u8UartParaBuf, u8DataLen);
}
else
{
pUart0RxDataMem[gUart0RxStartIndex % UART0_RX_BUFF_LEN] = 0;
gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
gUart0RxByteNum--;
}
}
else
{
pUart0RxDataMem[gUart0RxStartIndex % UART0_RX_BUFF_LEN] = 0;
gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
gUart0RxByteNum--;
}
}
else
{
//桢头异常,清除此桢
pUart0RxDataMem[gUart0RxStartIndex % UART0_RX_BUFF_LEN] = 0;
gUart0RxStartIndex = (gUart0RxStartIndex + 1) % UART0_RX_BUFF_LEN;
gUart0RxByteNum--;
}
}
return 0;
}
最后
以上就是安详紫菜为你收集整理的高效的串口循环Buffer接收处理思路及代码的全部内容,希望文章能够帮你解决高效的串口循环Buffer接收处理思路及代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复