串行通信写入

Posted

技术标签:

【中文标题】串行通信写入【英文标题】:Serial communication write 【发布时间】:2013-01-31 14:03:24 【问题描述】:

我编写了一个简单的 C# 应用程序,具有串行功能 沟通。我正在使用它来读取和写入设备。装置 识别字符串命令。我能够成功地从设备读取 使用这个应用程序。但是人们正在向设备写入(发送)命令。 我只是在使用

if (serialPort.IsOpen == true)

serialPort.Write("Command1");

但我的设备没有响应。

为了检查,我尝试使用超级终端向我的 设备和我的设备识别它并完美运行。

任何人都可以指导我什么是准确的写作方式或什么 需要确保在 c# 中写入串行端口。这是编码问题吗... (使用同一个应用程序的串行读取工作得很好!!) 感谢您的宝贵时间。

此外,没有异常或错误,并且处于调试模式 该行执行。

【问题讨论】:

你试过serialPort.Write(@"Command1\n");吗?此外,您的条件应该只是if (serialPort.IsOpen);无需针对true 进行测试;它已经是布尔值了。 看看我的一些古老的串行资料,我看到 Andrew 提到我正在发送 \r\n 并使用 serialPort.WriteLine @AndrewBarber 我认为您不能在逐字字符串文字中使用"\n" 转义序列。 如何使用超级终端发送命令?需要按Enter吗? @AlvinWong 是的;这就是为什么我输入@"Command1\n" @ 的意思是\不要逃避。或者您可以像这样对它们进行双重转义:"Command1\\n" 【参考方案1】:

这是一个非常常见的问题,并且总是由将 Handshake 属性设置为 None 引起的。如果 DTR 信号未打开,串行端口设备几乎总是关注握手信号并忽略您发送的任何内容。这表明您已通电并且它接收到的数据不是噪音。需要将 DtrEnable 设置为 true,这也是 HyperTerminal 所做的。

当它认为你还没有准备好接收任何东西时,它不会发回任何东西,因为 RTS 信号没有打开。需要将 RtsEnable 设置为 true,这也是 HyperTerminal 所做的。或者只是正确设置 Handshake 属性,Handshake.RequestToSend 是常见的要求。

如果您仍然遇到问题,那么您可以使用 SysInternals 的 PortMon 将您的程序发出的串行端口驱动程序命令与超级终端发出的命令进行比较。

【讨论】:

太棒了!你关于握手是绝对正确的。谢谢它解决了问题【参考方案2】:

当您按 Enter 键发送信息时,超级终端可能会在您的输入中附加一个换行符,该信息由“换行符”和“回车符”组成。

检查您的硬件文档,但我猜测您尝试向其发送信息的设备正在寻找回车符“\r”,以表示输入结束。就像 cmets 中的其他人所说的那样,将适当的字符附加到输入的末尾。

或者,您可以使用 SerialPort.WriteLine 函数来完成与在输入中附加换行符 '\r\n' 字符相同的事情,而无需显式修改它。

【讨论】:

感谢您的回答。您的意见与@Hans Passant 一起解决了这个问题。【参考方案3】:
if (serialPort.IsOpen)
    serialPort.WriteLine("Command" + "\r\n");

【讨论】:

以上是关于串行通信写入的主要内容,如果未能解决你的问题,请参考以下文章

如何通过usb端口通信从arduino将串行数据写入phpmyadmin

使用 C# 通过“USB 虚拟串行端口”与 USB 设备通信?

使用串行端口,我收到一个错误:尝试读取或写入受保护的内存

Arduino/AVR:中断串行/I2C 通信是不是安全

使用python在串行通信中读取输入缓冲区

单片机多机通信的实现