2017-02-09 42 views
-1

我有从串行端口接收数据的问题。每次发送12个字节,我想读取每个字节并将它们放入一个数组中,然后将它们显示在一个richtextbox中(每个字节将显示在一个单独的行中)。但是有一个问题:当数据连续发送时,我会得到一些额外的0,它们根本不相关,并且我没有在终端程序中收到。 这是我的代码,我很感激你能否帮助我。在C中额外和虚假的串行接收数据#

private void data_received(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
    { 
     richTextBox1.Invoke(new EventHandler(ReadFromPort)); 
    } 

    private void ReadFromPort(object sender, EventArgs e) 
    { 
     int bytes = 0; 
     label2.Text = ""; 
     bytes = serialPort1.BytesToRead; 
     label2.Text = bytes.ToString(); 
     byte[] buffer = new byte[12]; 

     for (int k = 0; k < bytes; k++) 
     { 
      buffer[k] = 0; 
     } 
     serialPort1.Read(buffer, 0, bytes); 
     for (int i = 0; i < buffer.Length ; i++) 
     { 
      richTextBox1.AppendText(buffer[i].ToString() + Environment.NewLine); 
     } 

}

+0

当你创建数组而不是'new byte [bytes]'时,'buffer.Length'设置为'12'。另外,'new byte []'返回一个归零数组,你不需要将这些值设置为零。另外,将值设置为零也没有意义,因为您将在下一行覆盖它们。 – Groo

+0

serialPort1.Read将返回实际读取的字节数,可能小于12.您的代码似乎假设它始终返回12个字节 – Joe

+0

是的,没错,因为我确定总是发送12个字节。终端计划也证实了这一点。现在的问题是为什么我有时会得到不应该在那里的零。 – srt

回答

0

您正在阅读的N个字节到缓冲区,但无论在显示了读入它的字节数的整个缓冲区。有时你不会得到12个字节,但更少。但你还是显示所有12

变化for (int i = 0; i < buffer.Length ; i++)for (int i = 0; i < bytes ; i++)

2

当你read the documentationSerialPort.Read,很明显:如果计数大于字节的输入缓冲区的数目更大

更少的字节数读。

返回值表示从端口实际读取了多少数据。然后只显示你的数组中的字节数量:

int bytesRead = serialPort1.Read(buffer, 0, bytes); 
for (int i = 0; i < bytesRead; i++) 
{ … }