处理和显示串口数据 - C#

时间:2014-11-25 09:42:58

标签: c#

我正在开发一个小程序,它从串口接收模拟数据并将其显示在多个文本框中。 数据是来自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;
}

1 个答案:

答案 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字节响应的第一个字节。你永远不会得到适当的回应。设备通常会发送额外的字节来指示数据帧的开始和结束,以帮助解决该问题,但这似乎并非如此。在设备端修复这个问题应该是一个强有力的目标。