通过串行端口连接到设备并发送命令,但未返回任何内容



我需要通过串行端口连接到传感器并从中读取一些数据。我连接到它并发送命令,但设备没有返回任何内容,而是抛出超时异常。堆栈溢出上的类似问题使用 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

最新更新