【问题标题】:c# ascii protocol problemc# ascii协议问题
【发布时间】:2009-12-04 16:39:25
【问题描述】:

我有一个通过串行端口向设备发送 ASCII 命令的程序。该程序是一个演示,并没有做我想要的。

我只是想让设备在 c# 中响应,但我没有得到任何回报。 所有的串口设置都是正确的。 我发送的消息与演示软件完全相同。

//e.g message <STX>ABC<EOT>

byte[] msg = new byte[5];

msg[0] = 0x02;
msg[1] = 0x41;
msg[2] = 0x42;
msg[3] = 0x43;
msg[4] = 0x04;
comport.write(msg, 0,msg.length)

该设备是监视器。该代码只是一个示例。没有心跳只是对发送的正确消息或错误消息的响应。设置为标准 9600-8-N-1。 “针脚 2 和 3(TX 和 RX)之间的回形针。”是的,我知道电缆有效,因为它与有效的产品软件一起使用。我会取回我发送的内容。我使用了一个虚拟 com 程序,一切似乎都很好。 “6 个字节,但只初始化前 5 个字节。”抱歉错字。

将 SerialPort.DtrEnable 和 RtsEnable 属性设置为 true。在 C# 中默认开启。我已经尝试过超级终端,但也没有得到回应。我已经发送了 \r 和 \n 没有运气。

【问题讨论】:

  • 太模糊了。设备是什么?演示的来源是什么?设备是否有状态灯或其他类似的指示灯来表明它正在接收您认为您正在发送的输入?等等。
  • 设备是什么?协议到底是什么?应该退回什么?设备文档怎么说?换句话说,需要更多信息。
  • 这不包含任何可以帮助诊断问题的信息...comport 的类型是什么,它是如何初始化的?你怎么知道串口设置是正确的?
  • 你用的是串口监控软件吗?只有这样才能确定您发送的是您认为发送的内容。
  • 这看起来像是我们曾经做过的时钟。

标签: c# serial-port ascii


【解决方案1】:

这个C# Tutorial on Serial Port Communication 应该可以提供帮助。我不确定通过 C# 中的赋值在 Hex 和 Byte 之间是否存在适当的内在种姓。这可能是你问题的根源。

设备心跳

设备是否发送DC2 或DLE 响应(心跳)?如果是这样,请尝试使用基本的 9600-8-N-1 设置在超级终端中打开一个 COM 端口,看看是否有任何结果。当您尝试发送命令时,是否有任何STX、SYN、ETX 命令返回?我不确定您尝试与之通信的硬件的命令集实现。

检查 COM 端口操作

您是否检查过您的 COM 端口是否正常工作?您可以通过在引脚 2 和 3(TX 和 RX)之间插入回形针来创建环回。这将回送您的 COM 端口,在 Hyper 终端中您可以打开该 COM 端口并输入。字符将回显。

您还可以使用名为com0com 的软件创建虚拟 COM 端口,以便在实际发送之前测试您发送的内容。

它提供了成对的虚拟 COM 端口,它们通过 nullmodem 连接进行链接。然后,您可以使用您最喜欢的终端应用程序或任何您喜欢的方式将数据发送到一个 COM 端口并从另一个 COM 端口接收

如果没有更多具体信息,我们将只能抓住救命稻草。

【讨论】:

    【解决方案2】:

    您正在分配和发送 6 个字节,但只初始化前 5 个。

    另外,根据您所写的,您所做的一切都是正确的,与演示程序完全一样。正确的?然后我只能看到一个解决方案:设备正在拉你的腿!

    说真的:如果一个程序有效而您的无效,那么肯定会有一些差异。

    【讨论】:

    • 我会说“分配 6 个字节但只初始化 5 个”是要解决的第一个问题;设备可能将所有六个字节都解释为消息并确定它是无效的。
    • 当然不是,它给出了msg.Length,即6,所以不管它们的值如何,它都会发送6个字节。
    • EOT 将指示消息结束.. 其余是垃圾。任何物超所值的设备都会忽略其余部分。
    【解决方案3】:

    到目前为止,最常见的错误是忘记打开硬件握手信号。如果设备认为主机已关闭,则不会发送任何内容。确保将 SerialPort.DtrEnable 和 RtsEnable 属性设置为 true。

    如前所述,固定数组大小。尽管它可能无济于事,但 STX 字符可确保垃圾被丢弃。

    使用 Windows 超级终端小程序检查基本硬件是否正常。您可以通过键入 Ctrl+B、ABC、Ctrl+D 来发送您尝试传输的消息

    【讨论】:

      【解决方案4】:

      正如其他人所建议的那样,使用某种终端软件检查正在发送和接收的内容是个好主意。我在“realterm”上取得了成功——它可以很好地显示 ascii 或二进制/十六进制视图。

      【讨论】:

        【解决方案5】:

        由于您使用的是 ASCII,另一个问题可能是您没有发送正确的行终止字符。一些设备需要\r,而其他设备需要\n。确保您设置正确。

        【讨论】:

        • 我相信你的话。我确实知道我使用的一些设备需要该字符才能使其内部命令解析正常工作。
        • @Erich:我在刷卡阅读器上看到过,他们每次刷卡都会发送一个 CR-LF(你会解析它以查看行尾),但我从来不需要将它发送给任何人设备(收据打印机、售票机、hid 读卡器等)。 YMMV
        【解决方案6】:

        该设备是监视器。该代码只是一个示例。 没有心跳只是对发送的正确消息或错误消息的响应。 设置为标准 9600-8-N-1。 “针脚 2 和 3(TX 和 RX)之间的回形针。”是的,我知道电缆有效,因为它与有效的产品软件一起使用。我会取回我发送的内容。我使用了一个虚拟 com 程序,一切似乎都很好。 “6 个字节,但只初始化前 5 个字节。”抱歉错字。

        将 SerialPort.DtrEnable 和 RtsEnable 属性设置为 true。在 C# 中默认开启。 我已经尝试过超级终端,但也没有得到回应。 我已经发送了 \r 和 \n 没有运气。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-13
          相关资源
          最近更新 更多