问个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个回答

  • 10ms应该不是问题。对通讯来说,10ms是一段很长的时间了。是不是你的程序在做别的事情?或者电脑在做别饿耗时任务?而且Windows会帮你做缓冲应该不至于会丢失数据。
  • 你程序里能看到的最主要的问题是:你为什么要转换成字符串再去分析数据?直接用byte[]分析应该可以节约不少。
  • 报头的问题,这样不行。你这样判断的话只说明开始的时候不是88,但是有可能你的报文数据不是在最开始的位置(例如你两个包一起收,第二个包的报文头就在中间)
KyKiske22
KyKiske22 回复知常曰明: 嗯 刚刚我把textbox的内容全部转到新的Byte[5]数组里了,我参考下您的写法,谢谢您的建议!
4 年多之前 回复
gamefinity
知常曰明 回复KyKiske22: for(int i=i;i<length;i++){if (BYTE[i]==0x88){/*开始解析你的数据*/} else continue;}
4 年多之前 回复
gamefinity
知常曰明 回复KyKiske22: for){if (b==0x88){/*开始解析你的数据*/} else continur;}
4 年多之前 回复
KyKiske22
KyKiske22 回复KyKiske22: B = Convert.ToInt32(list1[c].Substring(2, 2), 16); 以此类推
4 年多之前 回复
KyKiske22
KyKiske22 转换成字符串 是为了按照要求方便解析转换数据。我们协议是这样规定的:A = Convert.ToInt32(list1[c].Substring(0, 2), 16);
4 年多之前 回复
KyKiske22
KyKiske22 转换成字符串 是为了按照要求方便解析转换数据。我们协议是这样规定的:A = Convert.ToInt32(list1[c].Substring(0, 2), 16);
4 年多之前 回复
KyKiske22
KyKiske22 转换成字符串 是为了按照要求方便解析转换数据。我们协议是这样规定的:A = Convert.ToInt32(list1[c].Substring(0, 2), 16);
4 年多之前 回复
KyKiske22
KyKiske22 那报头怎么判断?我实在没有头绪?稍微说具体点吧
4 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

1
我在vc++上位机实现usb读写时出现了问题
2
控制器给C#上位机窗口程序发送数据的字节接收问题
4
什么软件可以模拟下位机通过USB向上位机发送数据
5
C# socket接收单片机数据问题
3
C# 如何使用socket实现基于TCP协议传输数据
4
一个物联网方面的问题,做一个基于WiFi的楼宇能耗监测系统,软件部分怎么设计比较好,类似这个文档里的
2
c#上位机与单片机通信,上位机接收不到单片机返回的数据
3
多显示器编程上位机软件(一台主机外接三台显示器,主显示器上的上位机软件要能监控其他两台显示器的内容
0
上位机与usb mass storage设备通信
2
vc++串口上位机 MFC和MSCOMM控件
1
C#做上位机时自定义了一个控件,控件对↑键做出反应,发现方向键不好使,按键事件进不去,求助大神!
0
FPGA操作dm9000接收到数据以后怎么把数据打包上传到网络
1
C#PerformClick可虚拟按钮,但按钮的DOWN和UP怎么表示模拟
2
有没有c#写上位机的教程,写上位机应该不需要知道太多吧,
2
C# 用modbus tcp协议,怎么做一个上未将与多个下位机通讯
2
C#中的serialport.Write与MSCOMM控件的put_output有什么区别?
0
C#写一款ip摄像头上位机,用RealPlayWnd.Handle;为啥是无效的句柄
2
c#串口通信中上位机测试数据组帧
1
stm32不停地发送一个字节的数据,mfc编写的上位机接收到了但是显示乱码
3
关于串口接受数据并实时绘制波形的疑问