Arduino&Python 串口通信

遥想当年在实验室做Arduino的串口通信到上位机的Java后台的实验,作为一个小白的我从白天搞到了晚上才在旁人帮助下搞好(-_-||)。当时完全搞不清楚什么这编码那编码的,所有的编码格式就知道一个gbk就没了,当时连UTF-8都不知道是啥。然而现在忽然发现用Python做和Arduino的串口通信简直好用到不行,而且没有那么多的设置,直接调用现成的API就好了,唯一需要考虑的问题就是编码格式的问题,再加上一个MongoDB,当时的问题简直不是事儿。

于是,,我们来记一下吧。

首先来看看怎么做Python的串口通信,先做起来再来谈编码格式问题。首先,我们需要安装一个module,名字是“pyserial”。安装的方法就是直接在cmd中用pip就可以了,即:

pip3 install pyserial

安装的过程应该是如下图所示。

接着我直接上来一个Demo的串口读取输出的code,让Arduino直接每个几秒钟发送一个字符串上来。

这个是Arduino端:

这个是Python端:

跑起来之后,来看看从cmd中可以得到什么。

发现当arduino在delay函数中的时候,Python这边有一个 b'' 的输出,这表示啥?英文的字符串是收到了,但是好像在两个单引号之间。中文字符没有显示出来,这个应该是什么编码格式。这里有一个知识点的前提,arduino的编码格式应该是utf8,至少传输的格式是的。接下来,看看Python这边直接对刚刚的那句中文做一个编码操作。

这里令uni为一个字符串,字符串的内容是“来自设备的信息。”,然后输出这个uni。可以看到汉字被正确输出了,这里要注意的是,在Python 3.x的时候,编码的格式默认是utf-8了。来看看uni的type类型,发现是str。将uni使用gbk的格式进行编码,再来看看是什么格式,发现是“bytes”字节类型了,那如果在编码后输出呢?可以看到就是刚刚在Python端输出时的 b‘’ 的样子了。原来前面的小写b表示的是字节bytes的意思。如果用utf-8编码呢?就是最后一行的样子,是不是和之前的串口收到的字节码一毛一样了?因为,arduino在传输之前将所有的字符串用utf8的编码格式先编码了一遍,所以说,如果想在cmd中看到正确的文字输出,应该是在输出之前用utf8的格式先解码一遍,注意一定要是utf8解码,不能用其他的,不然中文就会出现乱码。

所以Python端应该是这样的。

这样就能在cmd中看到正确的中文字符了。

当时就是这个编码的问题,卡了好久,如果那个时候考虑用这个Python估计一上课就可以下课了吧。。。

总结下,其实是一个非常简单的问题,一个字节流的问题,一个解码编码的问题,如果说全世界都用一种编码格式的话就没有这种编码的问题了。记得以前计算机发源自欧美国家,所有的文字也就无非26个英文字母,再加上大小写,再加上一些特殊符号,这就是ASCII码。后来更多的国家进来了,一个国际化组织说这样下去不行啊,得有一个统一标准哦!Duang,Unicode出来了,万国码的由来。全世界都是这个囊括在内(大概....)。问题又来了,以前ASCII的时候一个英文字母是一个字节,一个汉字应该是两个字节,那用Unicode的话,一个英文字母也是两个字节了,多浪费空间啊。又于是utf-8出来了,它能动态的控制字节的大小,英文字母还是一个字节,中文又变成俩。以上所谈也是看了其他博客的综合论述。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180926G0N4YF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

同媒体快讯

扫码关注腾讯云开发者

领取腾讯云代金券