处理和显示来自串行端口的数据 - 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;
}

处理和显示来自串行端口的数据 - C#

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