MATLAB选择通讯方式

示例

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

  • 与您交流的乐器的表现如何。

  • 除了管理串行端口之外,您的主程序(或GUI)还需要执行哪些其他功能。

我将定义3种不同的情况,从最简单到最苛刻的情况进行说明。对于这3个示例,我要连接的仪器是带有测斜仪的电路板,它可以在以下将要描述的3种模式下工作。


模式1:同步(主/从)

此模式是最简单的一种。它对应于PC为主机而乐器为从机的情况。仪器本身不会发送任何东西到串行端口,它只会在主机(PC,您的程序)询问问题/命令后才答复答案。例如:

  • PC发送命令:“立即给我测量”

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

要么

  • PC发送命令:“从模式X更改为模式Y”

  • 仪器接收命令,执行命令,然后将确认消息发送回串行线路:“命令已执行”(或“命令未执行”)。这通常称为ACK / NACK答复(对于“ Acknowledge(d)” /“未确认”)。

简介:在这种模式下,仪器(从机)仅在PC(主机)询问后立即将数据发送到串行线路


模式2:异步

现在假设我启动了乐器,但它不仅仅是一个哑传感器。它会不断监控自己的倾斜度,只要它是垂直的(在一个公差范围内,例如+/- 15度),它就会保持沉默。如果设备倾斜超过15度并接近水平,它将向串行线发送警报消息,然后立即读取倾斜度。只要倾斜度高于阈值,它将继续每5s发送一次倾斜度读数。

如果您的主程序(或GUI)一直在“等待”消息到达串行线路,那么它可以做得很好……但是在此期间它不能做任何其他事情。如果主程序是GUI,那么拥有一个看似“冻结”的GUI会非常令人沮丧,因为它不接受用户的任何输入。从本质上讲,它成为从属,乐器是Master。除非您有一种通过乐器控制GUI的好方法,否则这是避免的事情。幸运的是,异步通信模式将使您:

  • 定义一个单独的函数,该函数告诉您的程序在收到消息时该怎么做

  • 将此功能放在一个角落,仅当消息到达串行线路时才调用并执行该功能。其余时间,GUI可以执行必须运行的任何其他代码。

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


模式3:流式传输(实时

现在,让我们释放乐器的全部力量。我将其置于一种模式下,它将不断将测量结果发送到串行线。我的程序想接收这些数据包,并将其显示在曲线或数字显示器上。如果仅每5s发送一次如上所述的值,则没问题,请保持上述模式。但是我的仪器全力以赴,将数据点以1000Hz的频率发送到串行线,即,每毫秒发送一个新值。如果我停留在异步模式如上所述,存在很大的风险(实际上是可以保证的),我们定义为处理每个新数据包的特殊功能将花费超过1毫秒的时间来执行(如果要绘制或显示值,图形功能会非常慢,而不是甚至考虑对信号进行滤波或FFT处理)。这意味着该功能将开始执行,但是在完成之前,将有一个新的数据包到达并再次触发该功能。第二个函数放在执行队列中,只有在第一个函数完成后才会启动……但是到了此时,一些新的数据包到达了,每个数据包都将一个函数放在队列中执行。您可以很快预见到结果:到我绘制第5点时,我已经有数百个等待绘制... gui变慢,最终冻结,堆栈增长,缓冲区填满,直到有东西给。最终,您将剩下一个完全冻结的程序,或者只是一个崩溃的程序。

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

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