【问题标题】:Serial port data receive handling串口数据接收处理
【发布时间】:2012-10-20 06:51:22
【问题描述】:

我有一个表单,我可以在其中接收数据并将其显示在富文本框中,但我需要的是读取来自串行端口的连续数据并进行相应的解码。

例如:我以字节为单位接收数据,格式为 36 0 0 0 1 0 0...., 36 用于指示帧的开始 n 其余是触发事件的数据。

我的代码:

 private void serialPort1_DataReceived(object sender,  System.IO.Ports.SerialDataReceivedEventArgs e)
 {
        // get number off bytes in buffer 
        Bytenumber = serialPort1.BytesToRead;

        // read one byte from buffer 
        ByteToRead = serialPort1.ReadByte();                     

        this.Invoke(new EventHandler(DoUpdate));            
    }

以上代码用于接收数据和触发事件。事件代码如下:

 int w=0;

 public void DoUpdate(object sender, System.EventArgs e)
 {
        byte[] t = new byte[Bytenumber];

        for(int g=0; g<Bytenumber;g++)
        {
           t[g] = Convert.ToByte(ByteToRead);
        }

        w++;

       // richTextBox1.Text += ByteToRead;
        if (ByteToRead == 36)
        {
            for (int r = 0; r <= 73; r++)
            {
                if (ByteToRead == 0x01)
                {   
                    timer1.Start();
                    w++;
                }
            }
        }
      }

在收到数据的事件处理程序中,我正在寻找36(即帧的开始),一旦我知道我正在从缓冲区中寻找 1。问题是当我得到36(即帧的开始)时,相同的数据保留在if循环中并尝试与1进行比较,这在任何情况下都不是真的。我只需要在获得 36 后读取来自缓冲区的下一个字节数据。

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    我可以发现一些问题。一点代码审查:

        Bytenumber = serialPort1.BytesToRead;
    

    ByteNumber 是此时的 Bytes-to-Read。将其保存在成员字段中不是线程安全的。

        ByteToRead = serialPort1.ReadByte();    
    

    这只读取 1 个字节。然后,在另一个线程上:

        byte[] t = new byte[Bytenumber];   // ByteNumber may have changed already
        for(int g=0; g<Bytenumber;g++)
        {
            t[g] = Convert.ToByte(ByteToRead);   // store the _same_ byte in all elements
        }
    

    你应该做什么(不完整的代码):

    private void serialPort1_DataReceived(object sender,  System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        // get number off bytes in buffer 
        int n = serialPort1.BytesToRead;
    
        byte[] buffer = new byte[n];
    
        // read one byte from buffer 
        int bytesToProcess = serialPort1.Read(buffer, 0, n);                     
    
        this.Invoke(UpdateMethod, buffer, bytesToProcess);            
    
    }
    

    但一定要在互联网上搜索工作代码。我只是编造了这个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2021-07-24
      相关资源
      最近更新 更多