微处理器通过PySerial/Matplotlib实现RS-232实时绘图?

2 投票
2 回答
3635 浏览
提问于 2025-04-15 16:22

我刚接触Python,编程水平还很差,但我在努力想办法用Python来显示EEG电路的输出(使用OpenEEG电路,链接在这里:http://openeeg.sourceforge.net

这个模拟输出经过放大和处理,通过一个ADC(在ATmega8微控制器中)转换成RS232信号。

RS232信号的格式如下:

第1字节:同步值0xa5
第2字节:同步值0x5a
第3字节:版本
第4字节:帧编号
第5字节:通道1低字节
第6字节:通道1高字节
第7字节:通道2低字节
第8字节:通道2高字节
...
第9到16字节是额外电极通道的数据,但因为只用前两个,所以不需要这些数据
...
第17字节:按钮状态(b1-b4)

我已经掌握了一些基本的PySerial功能,但我需要想办法利用接收到的数据,先把它缓存起来,然后将有用的值绘制成两个实时的x-y波形图(时间与电压的关系)

问题更新:

我用PySerial的几行代码让程序打印出来,但结果是乱码。我正在尝试把数据整理成可以绘制的值格式。现在这17个字节的数据以256帧每秒的速度传入。每个通道的数据由10位组成(还有6个零补足2个字节)。这些数据是无符号的,可能的值范围是0到1023。这些值应该被绘制为正负,所以二进制值512对应于零(微伏特)的绘图....

我该如何读取这个8位二进制的输入流(去掉不需要的数据),然后把我想要的每个通道的两个相关字节组合起来(如果需要的话,可能还要去掉多余的6个零)?

2 个回答

2

要处理复杂的二进制数据格式,你可以考虑使用 numpy中的结构化数组(你也可以在 这里 找到一个很好的介绍)。在定义好数据的结构后,读取数据就会变得非常简单。接着,你可以利用numpy的功能,把数据处理成你需要的样子。

2

这里有一个很不错的实时绘图示例,可以在这里找到。这个例子很棒,因为它使用自己生成的数据,所以测试起来很简单。而且,代码中修改部分以便绘制真实数据也很明显,整体代码也容易理解。

基本的思路是先创建一个绘图窗口,然后随着数据的到来更新这个窗口中的数据,使用

set_xdata(np.arange(len(self.data)))
set_ydata(np.array(self.data))

(不过在当前版本的matplotlib中,你可能想用 set_data(xdata, ydata) 来代替。)

至于如何解析串口数据,可能更好单独提问。

撰写回答