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