KyKiske22 2015-05-24 09:43 采纳率: 0%
浏览 2795

问个C#上位机数数据接收的问题

目前用C#编写了一个Winform上位机界面,其中用到SerialPort接收数据
具体流程如下:
this.BeginInvoke(new EventHandler(delegate//调用控件的invoke方法,由主线程UI执行委托
//这里说一下:Begininvoke为"唤醒",异步执行EventHandler类的delegate委托
{
int lenth = serialPort1.BytesToRead;//定义字节数组的长度:每接收一次接收数据读取的字符串长度
if (lenth != 0)
{
Byte[] BYTE = new Byte[lenth];//建立字节数组对象
serialPort1.Read(BYTE, 0, lenth);//读取接收的字节
builder.Clear();//接收数据时清除之前的残余字符串
foreach (byte str in BYTE)
{
builder.Append(str.ToString("X2"));
}
richReceiveText1.AppendText(builder.ToString().Replace(" ", ""));
count += lenth;
if (richReceiveText1.Text.Substring(0, 2) != "88")
{
richReceiveText1.Clear();
count = 0;
}
else
{
if (richReceiveText1.TextLength == 10)
{
list1.Add(richReceiveText1.Text);
SetDSPReceive();
richReceiveText1.Clear();
}
}
receiveDataCount.Text = "接收数据:" + count.ToString() + "字节";
}
else
{
;
}
}));
这里我是先用richBox接收协议字符串,然后根据报头报位把协议存入到一个List中,然后用SetDSPReceive()方法将list的内容通过协议规定先将字符串转换为十六进制然后再转换成十进制并给窗口的参数值进行赋值。
其中SetDSPReceive()为将接收的十六进制字节转换为界面上的参数的协议(比如 88 03 04 01 07 08,88 08是报头报尾巴,01决定了是什么参数,03,04,07决定了参数值是多少,数据一个100多条) 。

但问题来了:由于公司的控制器的数据发送间隔为10ms。而控制器发送数据时上位机winform会出现卡壳、数据不动的情况。之前用串口调试助手尝试了,单个发送一个协议没有问题,发完一个再手动单个发第二个也完全没有问题,间隔100ms以上连续发送数据也没出现卡壳,我想是不是因为发送的间隔比将接收的数据转换为需求的参数短了导致接收数据不全发生卡壳??
还有一个问题:本应该接收到的字符串协议是88 03 04 01 07 08,但有时候接收到的协议是00 00 00 0D 88。。。。。,如何过滤掉表头之前的数据呢?
是不是:if (richBox1.Text.Substring(0, 2) != "88")
                      {
                          richBox1.Clear();
                          count = 0;
                      }
            ?????????????????
  • 写回答

1条回答

  • 知常曰明 2015-05-24 10:51
    关注
    • 10ms应该不是问题。对通讯来说,10ms是一段很长的时间了。是不是你的程序在做别的事情?或者电脑在做别饿耗时任务?而且Windows会帮你做缓冲应该不至于会丢失数据。
    • 你程序里能看到的最主要的问题是:你为什么要转换成字符串再去分析数据?直接用byte[]分析应该可以节约不少。
    • 报头的问题,这样不行。你这样判断的话只说明开始的时候不是88,但是有可能你的报文数据不是在最开始的位置(例如你两个包一起收,第二个包的报文头就在中间)
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况