选择通讯模式

Matlab 支持与串行端口的同步异步通信。选择正确的通信模式很重要。选择取决于:

  • 你与之沟通的工具如何表现。
  • 除了管理串口之外,你的主程序(或 GUI)还必须执行哪些其他功能。

我将定义 3 种不同的案例来说明,从最简单到最苛刻。对于 3 个示例,我连接的仪器是带有倾角仪的电路板,它可以在我将在下面描述的 3 种模式下工作。

模式 1:同步(主/从)

这种模式是最简单的。它对应于 PC 是主设备而仪器是从设备的情况。仪器不会自己向串口发送任何内容,只会在被主人(PC,你的程序)询问问题/命令后回复答案。例如:

  • PC 发送命令:立即给我测量
  • 仪器接收命令,进行测量,然后将测量值发送回串行线:“测斜仪值为 XXX”。

要么

  • PC 发送命令:“从模式 X 切换到模式 Y”
  • 仪器接收命令,执行它,然后将确认消息发送回串行线:执行命令(或“未执行命令 ”)。这通常称为 ACK / NACK 应答(用于“确认(d)”/未确认)。

摘要: 在此模式下,仪器( 从站 )仅在 PC( 主站 ) 询问后立即将数据发送到串行线路 **

http://i.stack.imgur.com/t1XyZ.gif

模式 2:异步

现在假设我开始使用我的乐器,但它不仅仅是一个愚蠢的传感器。它会不断监视它自身的倾斜度,只要它是垂直的(在公差范围内,比方说+/- 15 度),它就会保持沉默。如果设备倾斜超过 15 度并接近水平,则会向串行线路发送警报消息,然后立即读取倾斜度。只要倾斜度高于阈值,它就会继续每 5 秒发送一次倾斜读数。

如果你的主程序(或 GUI)不断等待到达串行线路上的消息,那么它可以做得很好……但在此期间它不能做任何其他事情。如果主程序是 GUI,那么让 GUI 看起来冻结是非常令人沮丧的,因为它不接受来自用户的任何输入。从本质上讲,它成了slave,而乐器就是大师。除非你有一种从仪器控制 GUI 的奇特方式,否则这是要避免的。幸运的是,异步通信模式将让你:

  • 定义一个单独的函数,告诉你的程序在收到消息时要做什么
  • 将此功能保留在一个角落,只有在消息到达串行线路才会调用并执行。其余的时间 GUI 可以执行它必须运行的任何其他代码。

摘要: 在此模式下,仪器可以随时(但不一定是所有时间) 向串行线路发送消息。PC 不会永久等待消息处理。允许运行任何其他代码。只有当消息到达时,它才会激活一个函数,然后该函数将读取并处理此消息。

http://i.stack.imgur.com/WzhGZ.gif

模式 3:流媒体( 实时

现在让我们释放我的乐器的全部力量。我把它放在一个模式,它将不断发送测量到串行线。我的程序想要接收这些数据包并在曲线或数字显示器上显示。如果它只是每隔 5s 发送一个值,没问题,请保持上述模式。但是我的仪器在完全打击时会以 1000Hz 的频率向串行线发送一个数据点,即它每隔一毫秒发送一个新值。如果我保持异步模式如上所述,存在一个高风险(实际上是保证确定性),我们定义的用于处理每个新数据包的特殊函数将花费超过 1ms 来执行(如果要绘制或显示该值,图形函数非常慢,不是甚至考虑过滤或 FFT 信号)。这意味着该函数将开始执行,但在它完成之前,新数据包将到达并再次触发该函数。第二个函数放在一个队列中执行,并且只在第一个函数完成时才会启动…但此时会有一些新的数据包到达并且每个数据库都放置了一个在队列中执行的函数。你可以快速预见结果:当我绘制第 5 点时,我已经有数百个等待绘制… gui 减速,最终冻结,堆栈增长,缓冲区填满,直到某事给出。最终你会得到一个完全冻结的程序,或者只是一个崩溃的程序。

为了克服这个问题,我们将进一步断开 PC 和仪器之间的同步链接。我们将让仪器按照自己的节奏发送数据,而不会在每个数据包到达时立即触发功能。串口缓冲区只会累积收到的数据包。PC 只会按照它可以管理的速度收集缓冲区中的数据(定期间隔,在 PC 端设置),用它做一些事情(当缓冲区被仪器重新填充时),然后收集一批新的来自缓冲区的数据……等等。

摘要: 在此模式下,仪器连续发送数据,这些数据由串行端口缓冲区收集。PC 会定期从缓冲区收集数据并对其进行处理。PC 和仪器之间没有硬同步链接。两者都按照自己的时间执行任务。

http://i.stack.imgur.com/4kHsk.gif