因此,要打开一个串口并通过串口成功传输来自天平的数据,我需要确保 serialPort 对象上的设置与天平的实际设置相匹配。
现在,问题是我如何检测到由于设置不同而没有建立连接?serialPort.Open 没有抛出异常,表明连接已经建立。是的,设置是有效的,但如果它们与设备(天平)设置不匹配;我对为什么没有捕捉到天平上的重量一无所知。
这里有什么输入吗?
因此,要打开一个串口并通过串口成功传输来自天平的数据,我需要确保 serialPort 对象上的设置与天平的实际设置相匹配。
现在,问题是我如何检测到由于设置不同而没有建立连接?serialPort.Open 没有抛出异常,表明连接已经建立。是的,设置是有效的,但如果它们与设备(天平)设置不匹配;我对为什么没有捕捉到天平上的重量一无所知。
这里有什么输入吗?
在不了解您希望从天平获得的数据格式的任何更多信息的情况下,只有通用串行端口设置不匹配检测技术适用。
如果 UART 设置明显不正确,您可能会看到很多帧错误:当 UART 需要 1 个停止位时,它实际上会看到 0。您可以通过端口上的ErrorReceived事件检测到这一点。
private void OnErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
if ((e.EventType & SerialError.Frame) == SerialError.Frame)
{
// your settings don't match, try something else
}
}
如果事情很接近,但仍然不正确,.NET 串行端口对象甚至可能不会给您错误(也就是说,直到发生灾难性事件)。
我最常见的串口通信失败是由于波特率不匹配造成的。如果您有一条消息,您知道您可以得到“回声”,请尝试将其作为握手工作的一部分。也许您要连接的设备有“状态”消息。请求它不会造成任何伤害,并且您会发现通信是否正常进行。
对于软件握手 (xon xoff) 您几乎无法检测它是否配置正确。串行端口对象可以做任何事情,从完全忽略它到出现线程异常错误,具体取决于底层串行端口驱动程序的实现。我有完全忽略 xon/xoff 的串行端口驱动程序,并将字符直接传递到程序中 - 哎呀!
对于硬件握手,波特率的基本回显策略可能会起作用,具体取决于您的设备的工作方式。如果您知道它会进行硬件握手,您可能能够检测到它并将其打开。如果设备需要硬件握手但它没有打开,你可能什么也得不到,反之亦然。
另一个很少使用的设置是 DTR 引脚 - 数据终端就绪。一些串行设备要求将其置位(即设置为真)以指示是时候开始发送数据了。默认设置为 false;试一试。
请注意,串行端口对象是......挑剔的。虽然不一定需要,但我会考虑在您进行任何更改之前关闭端口。
编辑:
感谢您的评论,看起来这是您的设备。它说默认设置应该是:
它没有指定多少数据位,但设备说它支持 7 和 8。我会尝试这两个。它还说它支持 600、1200、2400、4800、9600 和 19200 波特。
如果您打开了硬件握手,启用了 DTR(不同的东西)并循环了所有不同的波特率,那么很有可能不是您的设置。可能是正在使用的串行电缆为您的设备接线不正确。一些串行电缆是“直通”电缆,其中一侧的 1-9 引脚与另一侧的 1-9 引脚完全匹配。然后,您有“交叉”电缆,其中“TX”和“RX”电缆被切换(这样当一侧传输时,另一侧接收,非常方便的电缆。)
考虑查看手册后面的命令表;您可以发出“打印软件版本”命令来获取某种类型的回声。
串行端口使用一种非常非常古老的通信技术,该技术使用一种非常非常古老的协议,称为RS-232. 这非常简单......两个端点具有同步时钟,并且它们在每个时钟周期测试线路电压以查看它是高还是低(高意味着0和低意味着1,这是相反的大多数公约......再次成为协议时代的产物)。时钟同步是通过使用停止位来实现的,停止位实际上只是字节之间的休息时间。还有一些其他的东西被投入到协议的更高级用途中,例如奇偶校验位、XON/XOFF 等,但这些都建立在这个非常基本的通信层之上。检测串行线路每一端的时钟不匹配几乎是不可能的——你只会在接收端得到不正确的数据。协议本身没有内置方法来识别这种情况。我不知道有任何串行驱动程序足够聪明,可以注意到输入数据的时钟频率不合适。如果您使用其中一种错误检测方案,例如奇偶校验位,则每个字节都将被声明为错误。简而言之,您能做的最好的事情就是检查传入数据的错误(奇偶校验错误应该由您的驱动程序/软件层检测,而您的应用程序从该层接收的数据中的错误需要由您的程序检查 -后者可以通过使用校验和)。