我正在开发一个小程序,它从串口接收模拟数据并将其显示在多个文本框中。 数据是来自micro的10位A2D,以两个Hex字节的形式和一个字母来标识它来自哪个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;
}
答案 0 :(得分:2)
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字节响应的第一个字节。你永远不会得到适当的回应。设备通常会发送额外的字节来指示数据帧的开始和结束,以帮助解决该问题,但这似乎并非如此。在设备端修复这个问题应该是一个强有力的目标。