【问题标题】:C# Serial Port Receive Only Ever Giving me a Single CharacterC# 串口接收只给我一个字符
【发布时间】:2016-03-01 04:18:39
【问题描述】:

问题撤回。我发现我发送了不正确的 ASCII 模式,这是我的问题,而不是接收器的任何问题。接收一个字符只是我错误命令的回声

总结: C# 表单应用程序。序列号 38400:N81 无流量控制。与自定义设备通话。

如果我使用 Teraterm,一切都很好。

我连接的设备会给出简单、即时的响应:

键入 'v' 你会得到一个版本字符串“v1.34 02-18-16 17:22”,其中的 v 是键入命令的本地回显。还有其他类似的状态命令,一旦设备接收到一个字符,它就会立即回复。

在我的 C# 应用程序中,我几乎与您在本指南中看到的示例完全相同:

https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx

区别在于我在 38400 与 9600 之间,而且我也没有设置握手或 RtsEnable。

我以前做过这个,所以对这里的一些明显问题感到很愚蠢。我也确实做了一些搜索/关注类似问题的链接。

我没有收到版本字符串,而是收到一个字符“6”。

对于不同的命令,我也会收到一个字符“8”。这里值得注意的是,虽然“6”是我的版本字符串的一部分,但“8”永远不会出现在其他命令的响应中。

关于如何调试 ReadExisting() 调用的任何建议?

我完全理解接收到的字符串可能会以片段的形式到达。问题是我总是只收到一个字符而没有其他任何东西。事件处理程序永远不会看到任何其他数据。当我重新发出我的版本命令时,我得到了与以前相同的“6”。

我正在尝试测试接收器的事件处理程序:

    private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        Debug.WriteLine("Data Received: ");
        Debug.Write(indata);
    }

在调试器下,indata.Length 为 1。

Teraterm 端口设置:

有人建议我查找错误,代码如下:

    public event SerialErrorReceivedEventHandler ErrorReached;

    protected virtual void OnReceiveError(SerialErrorReceivedEventArgs e)
    {
        SerialErrorReceivedEventHandler handler = ErrorReached;
        if (handler != null)
        {
            handler(this, e);
        }
        Debug.WriteLine("Serial error");
    }

我没有看到任何错误。

进一步的问题是接收器需要运行不止一次。也就是说,当我发出“v”(只是 v)时,我应该看到版本,而“s”应该给我状态。同样,两者都可以在 Teraterm 上正常工作。如果我发出 vsvsvs 或其他匹配模式,我会得到 686868,如果我输入类似 vvsss,我会得到 66888 作为回复。

如果我发出 r 和 s 用于运行和停止,另一点是控制此设备,它上面有一个 LED 呈红色常亮(从间歇性闪烁表示它正在运行。我看到它按照我的命令运行和停止。所以我知道我正在以正确/连贯的方式与设备交谈。只是仍然无法看到有效的接收数据。

【问题讨论】:

  • 您知道 ReceiveData 可以多次执行,并且在每次调用时您都可以收到设备发送的部分内容吗?
  • 这完全正常,串行端口很慢,而现代机器非常快。在获得所有数据之前,不要解释接收到的数据。通常通过调用 ReadLine() 来轻松完成,取决于。
  • 您是否尝试过检查错误:msdn.microsoft.com/en-us/library/…
  • 尝试检查错误。由于我的经验不足而遇到困难。每次端口上有数据时都应调用 SerialDataReceiveEventHandler。我之前以 230400 bps 的速度使用过它并且没有丢失数据。慢,当然,但在 38400 处,每个字符 1/4 毫秒,所以即使我的版本字符串也有大约 4-5 毫秒的总持续时间。请注意,当我尝试下一个状态命令时,我还会收到以下数据 (8),然后在我重试 version 命令时再次收到 6。我认为接收程序的性能没有任何问题。
  • 我更新了问题描述,因为添加的代码显示正确。

标签: c# serial-port


【解决方案1】:

一些尝试的建议:

您正在从端口读取一个字符串,因此如果数据不能被轻易地解释为字符串,您可能只会在它停止转换之前得到一个片段。读入一个字节数组以确保您确实看到了您收到的数据。即使你认为你应该得到一个字符串,这也可以让你看到你实际收到的内容。

检查您的端口设置。波特率或编码错误的症状通常是您收到的“垃圾”字节数减少(可能是随机的,可能是可重复的)字节。这与接收不应出现在响应中的字符以及字符串提前终止是一致的。

从您的端口​​中删除所有配置选项,除了设置波特率。很少有设备使用 8n1 以外的任何设备,尝试设置选项通常会搞砸端口。如果这不起作用,那么只有在必要时才开始查看其他选项。

确保您只打开一次端口并保持打开状态,直到您完成与设备的通话。 (反复打开和关闭端口我真的不小心五个,并会刷新其中的数据,干扰您读取的尝试)

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 2020-03-14
    • 2021-06-15
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多