【发布时间】: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