C# .NET串口连接,但不读写
我正在使用C#和.NET 4.5,配合Visual Studio 2012编译器/集成开发环境来打开和操作一个串口。我的代码是为了连接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#代码完全一样),它确实可以工作。但是,运行我的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
- 校验位 = 无
- 停止位 = 一位
- 流控制 = 假
- RTS/CTS = 假
- DSR/DTR = 假
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)硬件握手。
这两个参数一起处理串口通信的握手过程,而不需要你在主设备和从设备之间手动定义。