Smobiler上海石磨_.NET移动开发平台

标题: 蓝牙接收数据时,发送方发出的一个包被接收方拆成了多个 [打印本页]

作者: bigjimmy8257    时间: 2019-5-29 00:07
标题: 蓝牙接收数据时,发送方发出的一个包被接收方拆成了多个
各位专家,

请教一个问题,我在使用4.7的蓝牙插件,成功连接到外部的一个蓝牙透传模块,该模块然后经由一个USB接口与电脑相连,在电脑上安装USB转串口的驱动,将它识别成一个串口。
这样在电脑侧,我写了一个串口的程序,这样在程序上可以发出数据包,经过蓝牙模块发送到APP上。

现在我的问题是,当我在电脑侧发送一个数据包,比如说一次发送一个字符串“23”,但在APP上收到的数据有时候是1个数据包“23”,有时候是两个数据包“2” 和“3”,这个似乎是随机出现的。我的电脑侧的发包程序如下:
            for(int i = 0; i< 100; i++)
            {
                byte[] WriteBuffer = Encoding.UTF8.GetBytes(i.ToString());
                //将数据缓冲区的数据写入到串口端口
                ComPort.Write(WriteBuffer, 0, WriteBuffer.Length);
                System.Threading.Thread.Sleep(10);
            }

在APP侧,接收代码如下 (代码中的bluetooth1_DataReceived 是 bluetooth插件的 DataRecieved 触发事件)
        private void bluetooth1_DataReceived(object sender, Smobiler.Plugins.BluetoothDataReceivedEventArgs e)
        {
            textBox1.Text += System.Text.Encoding.GetEncoding("utf-8").GetString(e.Data) + "+";
        }



通过看text Box1中的内容大致如下(每次都不一样)
    1+2+3+4+5+6+7+8+9+10+1+1+12+13+1+4+1+5+16+17  .....

相反,从APP中发出的数据包, 可以正确的在电脑侧串口接收程序中正确还原。

我自己猜测是由于一个进入的数据包由于网络的时延,多次触发了蓝牙插件的接收事件。不知道是不是这样。

不知道哪位之前用蓝牙通信的时候,遇到过类似的情况?有何解决的办法?

另外想进一步了解一下,Smobiler的这种服务器+客户端的模式,在处理实时性要求比较高的数据(比如说毫秒级)时候,会不会受制于网络(局域网或公网)的响应速度?

谢谢
大杰米

作者: peter.pan    时间: 2019-5-29 10:49
由于网络与数据发送机制的问题,传输内容是有可能出现接收延迟的,建议发送的数据协议中添加数据长度等协议(比如发送时,第1个byte为长度,后面接数据,最后加个0为结束标识等),组合成一个完整的协议内容,进行数据校验
作者: bigjimmy8257    时间: 2019-5-29 17:27
谢谢指点。




欢迎光临 Smobiler上海石磨_.NET移动开发平台 (https://www.smobiler.com/) Powered by Discuz! X3.2