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,但是有可能你的报文数据不是在最开始的位置(例如你两个包一起收,第二个包的报文头就在中间)
    评论

报告相同问题?

悬赏问题

  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号