【问题标题】:C# .NET serial port connects, doesn't read or writeC# .NET 串口连接,不读写
【发布时间】:2014-12-25 13:46:59
【问题描述】:

我正在使用 C# 和 .NET 4.5,以及 Visual Studio 2012 编译器/IDE 来打开串行端口并与之交互。我的代码旨在连接到 US Digital 的 QSB 正交至 USB 转换器。

这是我用来打开端口和连接的代码。

this.Port = new SerialPort();

this.Port.BaudRate = 230400;
this.Port.PortName = "COM9";
this.Port.Parity = Parity.None;
this.Port.Handshake = Handshake.None;
this.Port.DataBits = 8;
this.Port.StopBits = StopBits.One;

this.Port.Open();

在 this.Port.Open() 之后立即设置断点允许我验证串行端口是否确实已连接。在另一段代码中,响应按钮按下调用了以下代码:

this.Port.WriteLine("W168");

这个命令 * 应该会导致我的硬件旋转电机,事实上,如果我使用 Putty 发送命令,或者使用我编写的 Python 脚本(两者都使用与 C# 代码完全相同的设置)发送命令,就会发生这种情况。然而什么也没发生。我可以在 Putty 或 Python 中打开端口并执行具有预期结果的命令,然后运行我的 C# 代码,但没有任何反应。

我是否遗漏了一些特定于 C# 的东西来阻止它工作?

不管怎样,这是我的工作 Python 代码:

ser = serial.Serial("COM9", 230400, timeout=1)
ser.write(b"W168\n")

pySerial 文档链接:http://pyserial.sourceforge.net/pyserial_api.html#classes

在 C# 代码中提到但在上面的 python 调用中没有提到的字段的默认值是:

  • 字节大小 = 8
  • 奇偶校验 = 无
  • 停止位 = 一
  • xonxoff = 假
  • rtscts = 假
  • dsrdtr = 假

【问题讨论】:

  • 您可以尝试两件事。首先,由于您没有握手,您需要修改这两个值:this.Port.DtrEnable = true;this.Port.RtsEnable = true;。其次,您可以将波特率降低到更标准的值,例如 9600,以查看是否可以连接。
  • 我将硬件上的波特率切换为 115200(大多数串行端口上的最高标准),与 Putty 连接以验证它是否有效,然后从 C# 尝试。不去。但是,您启用 Dtr 和 Rts 的建议奏效了。 :-D 谢谢,我一直在努力解决这个问题好几个小时了。
  • 不客气,我知道我遇到了类似的串行端口问题,归结为这两种解决方案之一。

标签: c# python .net serial-port


【解决方案1】:

在 C# 中使用串行端口时,在建立连接时要始终记住一件事。如果你像这样将握手值设置为无:

this.Port.Handshake = Handshake.None;

那么你还需要设置几个参数才能完成连接,它们是:

this.Port.DtrEnable = true;
this.Port.RtsEnable = true;

原因是因为 Dtrenable 意味着:

数据终端就绪 (DTR) 信号

MSDN 解释了 DTR 的含义如下:

数据终端就绪 (DTR) 通常在 XON/XOFF 软件握手和请求发送/清除发送 (RTS/CTS) 硬件握手和调制解调器通信期间启用。

Rtsenable 的意思是:

请求发送 (RTS) 信号

MSDN 解释 RTS 的含义如下:

请求发送 (RTS) 信号通常用于请求发送/清除发送 (RTS/CTS) 硬件握手。

这两个参数一起处理串行端口通信的握手,而无需您在主从之间定义它。

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多