VC下用CSerialPort类进行串口编程,怎样对连续的一帧一帧数据进行实时处理?

在VC中使用CSerialPort类进行串口编程,添加了WM_COMM_RXCHAR消息.现在串口接收到是一帧一帧的数据,一帧数据包括帧头SY,数据个数800,然后是16... 在VC中使用CSerialPort类进行串口编程,添加了WM_COMM_RXCHAR消息.现在串口接收到是一帧一帧的数据,一帧数据包括帧头SY,数据个数800,然后是16进制的具体数据,最后是回车的ASC码,在消息响应函数OnComm中怎样对这些数据进行实时处理?贡献所有分数,求大神赐教! 展开
 我来答
wangpaishi
推荐于2016-04-07 · TA获得超过570个赞
知道小有建树答主
回答量:932
采纳率:52%
帮助的人:761万
展开全部
帧头有几个字节
先读第一个字节,判断是帧头,再读第二个字节,再判断。。。,读完帧头,再读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索引位置。如果数据长度不够,就不处理,等待串口数据上来读,再判断
}


如果已经会读串口数据了,那么你不会的就只是数据帧的判断组织了

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式