首页 新闻 赞助 找找看

wince 串口接收数据并分析

0
悬赏园豆:15 [已解决问题] 解决于 2012-09-11 13:03

wince做为客户端,从硬件设备通过串口传输数据至客户端。硬件设备有一个开关设置,当设备处于打开状态时,会一秒钟发送一次指令数据至客户端,告知客户端此设备处于打开状态。当用户操作硬件设备时,又会发送另一种指令数据,且此指令会自动发送4遍。而且上述两种指令数据有时会分段发送,也就是说客户端接收的数据是一部分一部分的。我的程序偷了个懒。两种指令分别是9个字节和12个字节,这种方法不好。

我想获得第二种指令的完整数据,但是我写的程序有时接收不到数据。请问大

 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            int n = serialPort1.BytesToRead;
            if (n == 0)
            {
                buf = new byte[n];
                serialPort1.Read(buf, 0, n);
                return;
            }
            if (n == 9)
            {
                buf = new byte[n];
                serialPort1.Read(buf, 0, n);
                return;
            }
            else if (n == 12)
            {
                buf = new byte[n];
                serialPort1.Read(buf, 0, n);
                this.Invoke((EventHandler)delegate
                {
                    this.tbxFirstEnergy.Text = (Convert.ToInt32(buf[7].ToString("X2").ToString() + buf[6].ToString("X2").ToString(), 16)).ToString();

                    System.Collections.BitArray ba = new System.Collections.BitArray(new byte[] { (byte)buf[8] });
                    if (ba[4])
                    {
                        this.tbxFirstPosition.Text = "位置错误";
                    }
                    else
                    {
                        this.tbxFirstPosition.Text = "除颤完成";
                    }
                    if (ba[0])
                    {
                        this.tbxFirstSynchro.Text = "同步";
                    }
                    else
                    {
                        this.tbxFirstSynchro.Text = "异步";
                    }
                    this.btnSearchFirst.Enabled = true;
                });

                serialPort1.DataReceived -= serialPort1_DataReceived;
                this.serialPort1.Close();
                // buf = null;
            }
            else
            {

                return;
            }

 

侠们这个问题如何解决呢?

答应不爱你的主页 答应不爱你 | 初学一级 | 园豆:3
提问于:2012-09-05 16:43
< >
分享
最佳答案
0

根据协议来指定解决方案。一个函数的事情。不是接到数据就解析,而是你的传输数据必须是完备的具有辨识度的完整包。不然大罗神仙也没辙

收获园豆:5
BLoodMaster | 初学一级 |园豆:135 | 2012-09-06 17:20
其他回答(1)
0

虽然你的两种指令分别是9个字节和12个字节,但是serialPort1_DataReceived时不一定为9或12,有可能传输过程中部分数据传输太慢导致一条指令receive两次或者两条指令合并到一起了只receive一次,这是不确定的。

你可以每条指令以0x02开头以0x03结尾,中间是你的指令内容。数据接收时将数据合并到一个缓存中,并解析查找0x02和0x03如果符合特征将数据从缓存中删除,可能会解析出多条指令,当然可能性很小,也可能只有0x02没有0x03说明数据没接收完成,等待下一次接收时再与缓存合并并解析。

收获园豆:10
sweetjian | 园豆:276 (菜鸟二级) | 2012-09-05 17:23

我的这两个指令时这样的0x080C1306360001FFFE和0x080C11091A0005001055FFFE,正如您说的有时一条指令分为好几次接收。您的意思是一接收数据就解析吗?我想要的是第二条指令,接收到了之后需要对其进行分析,后面接收的数据我就不需要了,您能不能再说的详细一些呢?

非常期待您的回答!!谢谢!!!

支持(0) 反对(0) 答应不爱你 | 园豆:3 (初学一级) | 2012-09-06 14:21

@答应不爱你: 当一条指令分好几次接收时将已接收到的部分指令放入一个缓冲区,等到指令接收完整之后再做处理。

支持(0) 反对(0) sweetjian | 园豆:276 (菜鸟二级) | 2012-09-07 14:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册