用串口接收数据,比如 35 36 34 38 37 2 34 36 8 32 31 36 35 34 3138 32 36 35 ...............
其中 2 ,8 ,3138就是不正确的接收,请问如何剔除呢?
接收程序如下
[code=csharp][/private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int n = serialPort1.BytesToRead;
byte[] buf = new byte[n];
received_count += n;
serialPort1.Read(buf, 0, n);
builder.Clear(); this.BeginInvoke((EventHandler)(delegate
{
foreach (byte b in buf)
{
builder.Append(b.ToString("X2"));
}
string[] maxvalue = builder.ToString().Split(new string[] { "FFFF8A","FF", "00AAAA","AA","0"}, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < maxvalue.Length; i++ )
{
textBox3.AppendText(maxvalue[i] + "\r\n");
bb = Convert.ToInt32(maxvalue[i], 16);
textBox8.AppendText(bb.ToString() + "\r\n");
cc = (bb / 10) - 6;
if (1 < cc)
{ textBox5.AppendText(cc + "\r\n");
series.Points.AddY(cc);
}
}
}));
}code]
其中 2 ,8 ,3138就是不正确的接收,请问如何剔除呢?
接收程序如下
[code=csharp][/private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int n = serialPort1.BytesToRead;
byte[] buf = new byte[n];
received_count += n;
serialPort1.Read(buf, 0, n);
builder.Clear(); this.BeginInvoke((EventHandler)(delegate
{
foreach (byte b in buf)
{
builder.Append(b.ToString("X2"));
}
string[] maxvalue = builder.ToString().Split(new string[] { "FFFF8A","FF", "00AAAA","AA","0"}, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < maxvalue.Length; i++ )
{
textBox3.AppendText(maxvalue[i] + "\r\n");
bb = Convert.ToInt32(maxvalue[i], 16);
textBox8.AppendText(bb.ToString() + "\r\n");
cc = (bb / 10) - 6;
if (1 < cc)
{ textBox5.AppendText(cc + "\r\n");
series.Points.AddY(cc);
}
}
}));
}code]
如果通过了 CRC 校验,那么就应视为正常数据
正确的处理还是把数据接收和数据解析分离,
保证不要因为解析异常影响数据接收
串口类似于tcp,需要进行分包和拼包
经 ToString("X2") 处理后,也不可能出现 2 ,8 因为格式化成3个字节后,不会再是单字节
要删除根本就不存在的数据,这是为何呢?
可能本轮数据解析未完成,后一轮数据又来了
公用buffer未加锁,
这个时候就会有“脏数据”了
你是按 new string[] { "FFFF8A","FF", "00AAAA","AA","0"} 切割数组的
你开列的虽然都是预定的分隔符,但你怎么能保证正文里不会出现他们呢?
02、08 被你切割成了 2、8,怎么能说是 干扰 呢
如果 10 也被切割了(16 变成了 1),那还对吗