【问题标题】:Using COM port in C# and not getting all sent data在 C# 中使用 COM 端口而不获取所有发送的数据
【发布时间】:2013-02-19 03:01:40
【问题描述】:

只是为了解释一下,我有一个开发板,它根据命令射出 4 个字符(字节)。我用来调试的终端程序(RealTerm)看到所有 4 个字节。我现在开始编写桌面软件,我的程序只关注发送的 4 个字节中的 1 个。澄清一下,我不知道 4 个字节中的哪一个(第一个、最后一个、中间两个),但我可以确定它是否真的有必要。

起初我认为 SerialPort.DataReceived 事件会针对接收到的每个字节触发。这不是真的,我不知道是什么导致它触发但它不是接收单个字节。

所以我尝试遍历 SerialPort.BytesToRead,但这也只获取第一个字节,即使它识别出有 3 个字节要读取(为什么不是 4 个??)

在它到达端口的确切时间接收这些数据对我来说不是必需的,但显然我不想丢失 3/4 的数据。但是它不会总是 4 个字节,这就是它现在所做的。我只想获取所有准备好读取的字节。

事件处理程序:

private void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            while (comPort.BytesToRead > 0)
            {
                RxString = comPort.ReadExisting();
                RxByte = comPort.ReadByte(); 
                byte[] myByte = new byte[6];

                for (int i = 0; i < 6; i++)
                {
                    myByte[i] = 0000000;
                }

                comPort.Read(myByte, 0, comPort.BytesToRead);
                for (int i=0;i<6;i++)
                {
                    if (myByte[i] != null)
                    {
                        thisBytes.Add(myByte[i]);
                    }
                }
                RxString = RxByte + "";
                try
                {
                    this.Invoke(new EventHandler(dealWithByte));
                }
                catch
                {

                }
            }
        }


private void dealWithByte(object sender, EventArgs e)
        {
            foreach (byte item in thisBytes)
            {
                RxByte = Convert.ToInt16(item);
                string binary = Convert.ToString(RxByte, 2).PadLeft(8, '0');
                //processTime(binary);
            }
      }

【问题讨论】:

  • 嗯,代码很破。混合 ReadExisting() 和 Read() 不好,不注意 Read() 的返回值是不好的,希望你能得到所有字节是不好的。不知道这应该做什么,但如果你想要 4 个字节然后调用 ReadByte() 4 次。
  • 是的,我开始觉得我是一个糟糕的、糟糕的程序员。不过谢谢你的回答。但是它总是希望是 4 个字节,这就是它现在正在做的事情。我只想获取所有准备好读取的字节。我将把它编辑到第一篇文章中。
  • 我认为如果 Microsoft 没有将串行端口类与 .NET 捆绑在一起,人们可能会过得更好,因为它已经严重损坏。我建议尽快找到一个更好的图书馆。从长远来看,即使 p/调用 Win32 串行端口功能也会更容易。
  • 如果波特率低,字节可能会比您的 ReadExisiting 执行晚一点到达。您可能希望在接收到的事件触发后延迟,然后阅读所有内容。您可以获得所有 4 个。

标签: c# .net-3.5 serial-port


【解决方案1】:

我不是 C# 人,但是代码很简单,伪代码

    numBytes As Int = SerialPort1.BytesToRead 'get # of bytes available
    buf(numBytes - 1) As Byte 'allocate a buffer
    br As Int = SerialPort1.Read(buf, 0, numBytes) 'read the bytes
    If br <> numBytes {
        Resize(buf, br) 'resize the buffer
    }

此时将字节存储到列表中。然后可以处理此列表以获取消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多