目前用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;
}
?????????????????