VC下用CSerialPort类进行串口编程,怎样对连续的一帧一帧数据进行实时处理?
在VC中使用CSerialPort类进行串口编程,添加了WM_COMM_RXCHAR消息.现在串口接收到是一帧一帧的数据,一帧数据包括帧头SY,数据个数800,然后是16...
在VC中使用CSerialPort类进行串口编程,添加了WM_COMM_RXCHAR消息.现在串口接收到是一帧一帧的数据,一帧数据包括帧头SY,数据个数800,然后是16进制的具体数据,最后是回车的ASC码,在消息响应函数OnComm中怎样对这些数据进行实时处理?贡献所有分数,求大神赐教!
展开
1个回答
展开全部
帧头有几个字节
先读第一个字节,判断是帧头,再读第二个字节,再判断。。。,读完帧头,再读800个字节,总之就是读帧头,之后读完整个帧。一整个帧都读到了,之后就是解析了。
也可以串口有多少读多少,读完一次,去分析读到的数据缓冲区中是否有完整的帧,有就处理掉。
实时处理对半个帧的话,就需要设置标记,标识当前解析到帧的哪个部位了
先读第一个字节,判断是帧头,再读第二个字节,再判断。。。,读完帧头,再读800个字节,总之就是读帧头,之后读完整个帧。一整个帧都读到了,之后就是解析了。
也可以串口有多少读多少,读完一次,去分析读到的数据缓冲区中是否有完整的帧,有就处理掉。
实时处理对半个帧的话,就需要设置标记,标识当前解析到帧的哪个部位了
追问
帧头就是SY,除了数据时HEX发送,其他都是ACS码。你说的大致意思我都明白了,但是具体实现还是有难度,第一次用串口,在网上搜了一个CSerialPort类,就会别人博客里的那一点了。能不能麻烦你写一个大致的代码,就一个大致步骤就行。
追答
OnComm是串口数据上来了吧?
int validDataLength = 0;
byte* pDataBuffer = new byte[1024*2];
void OnComm()
{
int curReadCount;
curReadCount = serialPort.Read(pDataBuffer + validDataLength, 1024); // 类似这样,先把串口数据读到数据缓冲区中
validDataLength += curReadCount;
if (2 <= validDataLength)
{
if ((pDataBuffer[0] != 'S') || (pDataBuffer[1] != 'Y'))
{
// 就放弃缓冲区数据
validDataLength = 0;
return;
}
}
if // 如果有效数据长度足够 800 + 2 + 1
if // pDataBuffer[回车的ASC码所在索引位置] != 回车的ASC码
// 就放弃缓冲区数据
validDataLength = 0;
return;
能执行到这里的话,说明足够一帧了而且帧头是SY,帧尾是回车ASC码,之前的代码就是判断数据足够一帧且该帧是真的是一帧
接下来,知道帧头在 pDataBuffer[0],pDataBuffer[1]位置,整个帧在什么索引位置,长度多少都知晓了,就是分析解析帧了
解析完了之后,把该帧长度之后的有效数据移动到索引位置0处,也就是数据缓冲区,字节数组的头部并把剩余有效数据长度减去一个帧的长度,再重新判断该数据缓冲区内的数据头部是否是帧头,长度是否足够一个帧,尾部是否是帧尾,是就继续处理,处理之后同样把该帧移除,把后续数据挪到头部0索引位置。如果数据长度不够,就不处理,等待串口数据上来读,再判断
}
如果已经会读串口数据了,那么你不会的就只是数据帧的判断组织了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询