C#串口接收数据问题,怎么在处理数据前判断数据接收完毕

上位机接收数据格式如下:
0x53 0x50 0x01 0x01 0x00 0x00 0x00 0x00 0x57 0x23 0x7F 0x3F 0xA6 0xFC 0xBF 0x3A 0x11 0x07 0x17 0x11 0x13 0x39
其中 53 50是包头,后面是有效数据,我现在想把0x00 0x00 0x00 0x00 0x57 0x23 0x7F 0x3F 0xA6 0xFC 0xBF 0x3A 这几个字节分别转化为三个浮点数,但是问题是,我现在无法判断数据是否接收完毕,及完整的一个数据包。
注:通过按下一次单片机上的“确定键”,单片机给上位机发送一次数据,数据格式如上描述。请大家指点下,谢谢!

我是通过绑定串口接收事件实现的,但这样会多次触发串口接收事件,主要卡在数据接收和数据以浮点数显示环节,代码如下:
private void sp_DataReceived(object sender,SerialDataReceivedEventArgs e)
{

        if (isHex==true)
        {
            string str;
            uint i=0;
            int bufferlen = sp.BytesToRead;
            byte[] bytes = new byte[bufferlen];
            sp.Read(bytes, 0, bufferlen);
            for(i=0;i<bytes.Length;i++)
            {
                str= Convert.ToString((byte)bytes[i], 16).ToUpper();
                tbxRecvData.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");
             }
        }   
        else 
        {
            int bufferlen = sp.BytesToRead;
            byte[] bytes = new byte[bufferlen];
            sp.Read(bytes, 0, bufferlen);
            string gb = System.Text.Encoding.Default.GetString(bytes);
            tbxRecvData.AppendText(gb);
        }

    }

2个回答

包头里面是否有包的长度
包结束的时候有没有标识
如果以上都没有,就通过大于一个时间没有新的数据收到,表明已经接受完毕。

qq_15803141
qq_15803141 这个代码具体怎么实现?初次接触这个东西,有点手足无措,请指点
接近 3 年之前 回复

问题已解决,采用了集合缓存机制,项目卡到的主要原因是一个简单的语法问题

wxyadd
wxyadd 你好,请问你用集合缓存机制是怎么实现的呢?我现在是串口读取数据放到缓存区bufferlen后,里面接收到好几个节点发送的数据包,而我是想一条一条数据包来进行处理,接收到一条数据包就放入集合,再接收下一条时通过数据包的头一个字节ID号,在集合里寻找,如果集合里有重复的ID就不存入集合,没有就存入,最后把集合里的一条条数据包显示出来。请问怎么才可以实现呢?我不太懂怎么使用集合,可以麻烦指导下嘛
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐