日期:2014-05-18  浏览次数:21724 次

C# 接受串口数据处理的问题, 包全粘帖一起了 怎么处理?
发送一个命令后
收到ARM那边传来的数据,其实ARM是打了四次,分别如下:

F0037E018E 
7001 17 01060000FFFF01444444444444444444444444 42 记录一
7001 17 01060000FFFF01555555555555555555555555 76 记录二
F0037E048B

“F0 03 7E 01 8E ”
  头 长度 内容 校验
7001 17 01060000FFFF01555555555555555555555555 76 记录二
头 长度 内容 校验


但是C#里接受时,并不是我想象的那样触发了4次事件,每次刚好接受一个数据包
全部粘帖在一起了,一起过来了



我在 form_load 里做如下
C# code
 comm.ReceivedBytesThreshold = 5;// 触发条件,
//添加事件注册
comm.DataReceived += comm_DataReceived;


接受事件的代码目前这么写:
C# code
 int n = comm.BytesToRead;
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
            string str = "";
            received_count += n;//增加接收计数
            
            comm.Read(buf, 0, n);//读取缓冲数据



            //因为要访问ui资源,所以需要使用invoke方式同步ui。
            this.Invoke((EventHandler)(delegate
            {
                for (int i = 0; i < n; i++)
                {
                    str += buf[i].ToString("X2");
                }
                this.txGet.AppendText(str);
                //修改接收计数
                labelGetCount.Text = "Get:" + received_count.ToString();
            }));


 是可以将所有数据都显示到 texBox上的,

现在是我只想取得数据包中有效的数据,如下记录描述:

 7001 17 01060000FFFF01444444444444444444444444 42 这个数据包中的 “4444444444444444444444”
 
但是通过断点观察,接受事件里,都是2次才能将数据包给收齐。

 如第一次收到如下这么多
 F0 03 7E 01 8E 70 01 
 第二次才把后面的给收全
 17 01 06 00 00 FF FF 01 44 44 44 44 44 44 44 44 44 44 44 44 42 F0 03 7E 04 8B 70 01 17 01060000FFFF01555555555555555555555555 76 F0037E048B

 怎么会出现这样的情况呢? 如何处理是好?

  


------解决方案--------------------
告诉你了,制定协议,包头包尾,校验
------解决方案--------------------
楼主搞硬件比较牛
这个串口接收不关c#语言的事
串口本来就是根据波特率来收发数据的
你应该在接受事件中启动一个线程
在这个线程中根据你的协议去处理数据
------解决方案--------------------
严格按照协议接收数据,读取有效数据,(判断是否是完整数据)
------解决方案--------------------
串口不懂你的通讯协议,当然无法处理粘包
楼主需要根据收到的数据,自己处理粘包的问题
------解决方案--------------------
我的意思是在接收里有一个列表这样的东西,读取的数据添加到列表
存放你收到的数据
然后有一个线程去处理你这个列表
判断是不是你需要的数据,是就处理,不是就丢弃

------解决方案--------------------
呵呵,你的串口问题还没解决啊。

上次忘了给你一个解决方法,请看:SerialPort.DataReceived之“管收不管埋”
------解决方案--------------------
另外,你说的一个数据包总是两次接收才能完全收完,这可能是因为ReceivedBytesThreshold设置过小问题。
不过,SerialPort.DataReceived之“管收不管埋”也能解决这个问题。
------解决方案--------------------
串口哪里有什么包,只有字节流,要lz字节的程序去分包