jonahxuworld 2021-10-20 13:42 采纳率: 93.1%
浏览 121
已结题

C#串口接收回来的数据为什么不完整?在测试软件上是完整的,用代码写到程序就不完整而且也不正确!详情如下

我写了循环2次,再加最后一次的复原,一共是三次,正确来说接收到的数据只有三条,但是现在接收到的数据是

img

正确的应该是这样的,在别人写完的测试软件上是这样显示的(x,y值只是测试,所以打的不一样,主要是格式都不同,输出还很多)

img

这是我的接收代码

        void Comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                int len = serialPort.BytesToRead;
                Byte[] InputBuf = new Byte[len];
                serialPort.Read(InputBuf, 0, len);
                ASCIIEncoding encoding = new ASCIIEncoding();
                data = encoding.GetString(InputBuf);
                new Thread(SetReceiveData).Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "错误提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }
        public void SetReceiveData()
        {
            lock (this)

                Invoke(new MethodInvoker(delegate ()

                {

                    this.txtReceive.AppendText(data);

                }));

        }

这是我的发送代码

for(int i=1;i<=2;i++)
                {
                    string valuex = @""""+ini.IniReadValue("坐标值" + i, "x")+ @"""";
                    string valuey = @""""+ini.IniReadValue("坐标值" + i, "y")+ @"""";
                    string valuez = @""""+ini.IniReadValue("坐标值" + i, "z")+ @"""";
                    string valuer = @""""+ini.IniReadValue("坐标值" + i, "r")+ @"""";

                    sd = Encoding.UTF8.GetBytes(@"{""c"":""run""," + @"""x"":" + valuex + "," + @"""y"":" + valuey + "," + @"""z"":" + valuez + "," + @"""r"":" + valuer + "," + @"""v"":""322""}");
                    serialPort.Write(sd, 0, sd.Length);
                    textBox12.AppendText(valuex);
                    Thread.Sleep(10000);
                    
                }
                sd = Encoding.UTF8.GetBytes(@"{""c"":""run"",""x"":""0"",""y"":""0"",""z"":""0"",""r"":""0"",""v"":""322""}");
                serialPort.Write(sd, 0, sd.Length);

  • 写回答

4条回答 默认 最新

  • wanghui0380 2021-10-20 14:45
    关注

    不好说明,只能举个例子你自己理解,“我们有一个水桶,有一个杯子不停向水桶里灌水,下面有龙头会不定时往外出水”
    问上面杯子灌3次,下面的龙头出几次?
    回答是:不知道。因为龙头不定时出水,他什么时候出水,每次出多少是未知数

    你理解这个例子就明白问题原因,那就是无论微软还是其他IBM他们都不知道你杯子有多大,他并不负责跟你负责解析你写入的东西,他只是如实把你写入的字节数组按顺序传输出去(他并不保证你灌3次,他就把龙头开3次。他也许1次,也许6次)

    所以你要做的事情是:自己负责解析,比如找个同样大小的杯子去接,这样的话,不管那个龙头开了几次,你总能得到3杯水

    比如如果你不变协议,你需要做的事情是自己解析这个字符串,让他符合json-------当然这个过程会很复杂,你必须不停查找第一个{ 然后查找后面一个},然后试着解析json看能成功不,如果不行,就继续查找倒数第2个},直到找不到}为止,然后在切换第个{ 重复这个过程,如果能找到就输出,如果能就等待下次龙头开了继续接水后重复上述过程

    这个过程会很麻烦,所以大多数情况下,我们使用更简单的方式,比如在发送阶段你发字符串前加2个回车换行,当我们收到查找到里面存在2个回车换行的时候就认为这是完整的一杯水

    ps:回车换行只是最简单,最原始的一种约定。当然我们有很多更复杂的约定,这种约定就叫“协议”,比如googl protocol协议,apahce thift协议,传统工业modbus协议-----------------

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 已采纳回答 10月20日
  • 创建了问题 10月20日

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题