C#.NET串行端口连接,不读取或写入

问题描述:

我使用C#和.NET 4.5,使用Visual Studio 2012编译器/ IDE打开并与串行端口交互。我的代码被设计为连接到美国数字的QSB正交转USB转换器。C#.NET串行端口连接,不读取或写入

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

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"); 

此命令*应引起我的硬件旋转电机,而事实上它,如果我用腻子发送命令,或使用我编写的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#代码中提到的字段的默认值,但在上面的蟒蛇呼叫未提及有:

  • bytesize = 8
  • 奇偶=无
  • 停止位=一个
  • XONXOFF =假
  • rtscts =假
  • dsrdtr =假
+1

有两件事你可以尝试。首先,由于你没有握手,你需要修改这两个值:'this.Port.DtrEnable = true;'和'this.Port.RtsEnable = true;'。其次,您可以将波特率降至9600等更标准的数量,以查看连接是否可行。 – Ckrempp 2014-10-29 17:59:11

+1

我将硬件上的波特率转换为115200(大多数串行端口上的最高标准),与Putty连接以验证它的工作原理,然后从C#尝试。不行。 但是,你的建议,使DTR和RTS工作。 :-D谢谢,我一直在这个问题上打了几个小时。 – 2014-10-29 18:24:50

+0

不客气,我知道我有一个类似的串口问题,它归结为这两种解决方案之一。 – Ckrempp 2014-10-29 18:25:39

在C#中的串行端口的工作有一两件事是建立连接时要永远记住。如果您握手值设置为none这样的:

this.Port.Handshake = Handshake.None; 

然后,你需要设置几个参数,以及对要完成的连接,它们是:

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

的reaso是因为Dtrenable含义:

数据终端就绪(DTR)信号

MSDN解释了DTR手段,因为这:

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

Rtsenable含义:

请求发送(RTS)信号

MSDN解释了RTS系指这样:

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

这两个参数一起处理串口通信的握手,而不必在主控制器和从属控制器之间进行定义。