处理和显示来自串行端口的数据 - C#
本文关键字:数据 串行端口 显示 处理 | 更新日期: 2023-09-27 18:31:55
我正在开发一个小程序,它从串行端口接收模拟数据并将其显示在多个文本框中。数据是来自微的 10 位 A2D,以两个十六进制字节和一个字母的形式识别它来自哪个 A2D 端口。
例如:0x1A、0x02、A
我的程序接收数据正常,如果我一次只显示接收模拟值,它工作正常。我遇到的问题是,当我尝试接收多个 A2D 值时,我不确定如何处理传入的数据。
下面的代码假设在单独的文本框中显示 3 个模拟值,但只有第一个文本框显示任何数据。 实现这一目标的最佳方法是什么?
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//Initialize a buffer to hold the received data
byte[] buffer = new byte[serialPort1.ReadBufferSize];
int bytes = serialPort1.BytesToRead;
//There is no accurate method for checking how many bytes are read
//unless you check the return from the Read method
bytesRead = serialPort1.Read(buffer, 0, bytes);
nValue = buffer[0] + (buffer[1] << 8);
switch1 = Convert.ToChar(buffer[2]);
switch (switch1)
{
case 'A':
DispString1 = nValue.ToString();
this.Invoke(new EventHandler(textBox0_TextChanged));
break;
case 'B':
DispString2 = nValue.ToString();
this.Invoke(new EventHandler(textBox1_TextChanged));
break;
case 'C':
DispString3 = nValue.ToString();
this.Invoke(new EventHandler(textBox2_TextChanged));
break;
}
}
private void textBox0_TextChanged(object sender, EventArgs e)
{
textBox0.Text = DispString1;
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
textBox1.Text = DispString2;
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
textBox2.Text = DispString3;
}
bytesRead = serialPort1.Read(buffer, 0, bytes);
你盲目地假设你会得到 3 个字节,这是使其余代码工作所必需的。 这不是串行端口的工作方式。 实际上,您通常只能获得1或2个字节,串行端口非常慢。 所以当然你的 switch() 语句无法获得匹配。
领先一步:
byte[] buffer = new byte[3];
int len = 0;
while (len < 3) {
len += serialPort1.Read(buffer, 0, 3-len);
}
// etc..
请注意,您有一个棘手的同步问题。 如果在设备发送时调用 Open() 方法,则接收的第一个字节不一定是 3 字节响应的第一个字节。 你永远不会得到正确的回应。 设备通常会发送额外的字节来指示数据帧的开始和结束,以帮助解决这个问题,但这里似乎并非如此。 在设备端解决这个问题应该是一个强有力的目标。