【问题标题】:Connect to a device through a serial port and send a command, but nothing is returned通过串口连接设备并发送命令,但没有任何返回
【发布时间】:2014-01-14 10:51:07
【问题描述】:

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

谢谢

【问题讨论】:

  • 它是否适用于命令行中的echo test > com1:(或使用适当的终端应用程序)? Moveover(但这可能只是您的示例中的一个问题)您确定您的设备会按照ReadLine 的预期回复 UNICODE 文本吗?
  • 您确定设备有响应吗?您是否使用terminal 确认了这一点?
  • 是的,我通过 Putty.exe 测试了设备,我刚刚尝试了 echo test > com1,它没有返回任何内容
  • @Adriano 是的,我通过 Putty.exe 测试了设备,我刚刚尝试了 echo test > com1 ,它什么也没返回
  • 如果 putty 也没有收到任何东西,那么问题出在设备上(波特率、握手等),不是吗?

标签: c# serial-port port


【解决方案1】:
   serialPort.Handshake = Handshake.XOnXOff;

也许这是正确的,这很不寻常。但真正的设备几乎总是关注硬件握手信号,除了 Xon/Xoff 流控制协议。必须先打开 DTR(数据终端就绪)和 RTS(准备发送)信号,然后才能确信设备已连接到真实计算机。像 Putty 这样的程序将始终打开它们,而您的程序不会。

添加这两行:

   serialPort.RtsEnable = true;
   serialPort.DtrEnable = true;

并确保 serialPort.NewLine 属性正确匹配设备使用的消息结束字符。暂时使用 ReadExisting() 来避免被那个细节所困扰,不要这样。

【讨论】:

  • 许多简单的设备只使用两条线进行串行通信。我不会说没有硬件握手有什么不寻常的(即使支持它,它通常也是可配置的)。
  • 许多优秀的设备,尤其是用于实验室或工业应用的设备,确实使用握手。当然,奥卡姆剃刀在这里总是适用,如果 OP 使用“简单”设备,那么他就不会问这个问题。
  • 我同意他们中的许多人确实使用握手,但我已经为一堆不使用的测量设备编写了解析器。有人可能会说奥卡姆剃刀会说“如果不需要,为什么要使用超过 2 根电线”。 :) 但是这个答案就像你的答案一样有用,这只是我的看法。
【解决方案2】:

我建议问题出在您使用的编码上。要检查这是否是问题所在,请使用您选择的嗅探器来查看应用程序上传输的字节是否与 putty 上的相同。

仅在使用嗅探器时确保您实际上是在尝试读取字节,因为如果您不这样做,它们将不会显示在输出中。

如果这没有显示任何内容,您可以尝试将 ReadLine() 方法更改为 ReadByte() 以确保您使用的读取类型没有问题。

串口嗅探器

  • http://www.serialmon.com/
  • virtual-serial-port.org/products/serialmonitor/?gclid=CInI2ZPL_bsCFaxr7Aod8S4A8w
  • www.hhdsoftware.com/device-monitoring-studio

【讨论】:

  • 很抱歉最后两个链接不完整,但我没有足够的声誉发布多个链接
  • 这是一个编码问题。谢谢你。我以为我多年前将此标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多