我需要通过串行端口连接到传感器并从中读取一些数据。我连接到它并发送命令,但设备没有返回任何内容,而是抛出超时异常。堆栈溢出上的类似问题使用 OnDataReceived 事件,我试过了,但它不起作用。我用来初始化的参数和我发送的命令在 Putty 上按预期工作。
-- 我在这里错过了什么
void Read()
{
SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
try
{
serialPort.Handshake = Handshake.XOnXOff;
serialPort.Encoding = new ASCIIEncoding();
serialPort.ReadTimeout = 1000;
serialPort.WriteTimeout = 900;
serialPort.Open();
serialPort.WriteLine("TEMP");
MessageBox.Show("Reading");
MessageBox.Show(serialPort.ReadLine());
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
serialPort.Close();
}
}
谢谢
serialPort.Handshake = Handshake.XOnXOff;
也许这是正确的,这是非常不寻常的。 但除了Xon/Xoff流量控制协议之外,实际设备几乎总是关注硬件握手信号。 DTR(数据终端就绪)和RTS(准备发送)信号必须打开,然后才能确信设备已连接到真实计算机。 像 Putty 这样的程序总是会打开它们,而你的程序不会。
添加以下两个必填行:
serialPort.RtsEnable = true;
serialPort.DtrEnable = true;
并确保 serialPort.NewLine 属性与设备使用的消息结束字符正确匹配。 暂时使用 ReadExisting() 以避免被该细节咬伤,不要让它保持这种状态。
我建议问题出在您使用的编码上。要检查这是否是问题所在,请使用您选择的嗅探器来查看应用程序上传输的字节是否与 putty 上的字节相同。
在使用嗅探器时,请确保您确实在尝试读取字节,因为如果您不这样做,它们将不会显示在输出上。
如果这没有显示任何内容,您可以尝试将 ReadLine() 方法更改为 ReadByte(),以确保您使用的读取类型没有问题。
串行端口嗅探器
- http://www.serialmon.com/
- virtual-serial-port.org/products/serialmonitor/?gclid=CInI2ZPL_bsCFaxr7Aod8S4A8w
- www.hhdsoftware.com/device-monitoring-studio