【问题标题】:Sending a binary byte stream over serial using C# and .net 4.0使用 C# 和 .net 4.0 通过串行发送二进制字节流
【发布时间】:2014-02-27 19:00:32
【问题描述】:

我有一个应用程序,我想通过串行链路与嵌入式设备进行通信。通信协议是二进制的——这意味着我有一个结构化的消息,我想将它从内存复制到未更改的串行字节流中(无编码)。

我正在使用 Microsoft VS 2012 使用 .NET 框架用 C# 编写应用程序。我继承了一个似乎正在使用 System.IO.Ports.SerialPort 类读取/写入 com 端口的应用程序的外壳。

几个同事告诉我,我会遇到问题,因为现代通信库,甚至是 USB 和串行驱动程序,都会假设您使用某种形式的编码(如 ASCII 或 Unicode)进行通信。如果有人知道如何开始这个,请告诉我。感谢您的帮助。

【问题讨论】:

    标签: c# .net serialization binary serial-port


    【解决方案1】:

    您可能正在寻找的起点是Write(byte\[\], int, int) 方法,它允许您将任意块​​二进制数据发送到串行端口。

    不,串行 (RS-232) 通信并不需要字符数据。物理通信并不关心您通过它发送的数据。您是否可以发送“原始二进制”数据或文本命令(例如调制解调器使用的所谓的AT 命令)取决于该通信链路上使用的实际应用程序协议(如果有)。

    【讨论】:

      【解决方案2】:

      C# 让它变得非常简单。

      using System.IO.Ports;
      
      public void TestSerialPort()
      {
          SerialPort serialPort = new SerialPort("COM1", 115200, Parity.None, 8, StopBits.One);
          serialPort.Open();
      
          byte[] data = new byte[] { 1, 2, 3, 4, 5 };
          serialPort.Write(data, 0, data.Length);
      
          serialPort.Close();
      }
      

      如前所述,你可以发送任何你想要的原始二进制值,它不需要是字符数据。

      【讨论】:

      • 实际上并没有那么简单。您的代码在发送数据之前关闭端口。它永远不会被发送。这不是很有帮助。
      • 我能找到的一切都表明 SerialPort.Write 会阻塞,直到所有数据都发送到串行端口。这不是真的吗?
      • 是的,SerialPort.Write 是一个阻塞操作。我的示例只是为了说明命令,在实际程序中,您将保持端口打开,直到通信完成。
      猜你喜欢
      • 1970-01-01
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 2011-12-03
      • 2020-02-17
      • 1970-01-01
      相关资源
      最近更新 更多