先把一些过程中查询到的资料贴一下,主要是编码方面知识。
1、utf-8与utf-8-sig两种编码格式的区别
UTF-8以字节为编码单元,它的字节顺序在所有系统中都是一様的,没有字节序的问题,也因此它实际上并不需要BOM(“ByteOrder Mark”)。但是UTF-8 with BOM即utf-8-sig需要提供BOM。
2、\ufeff
字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字符串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。
3、ASCII、GB2312、GBK、GB18030编码关系
GB18030兼容GBK,GBK兼容GB2312,GB2312兼容ASCII。所谓兼容,你可以简单理解为子集、不冲突的关系。例如GB2312编码的文件中可以出现ASCII字符,GBK编码的文件中可以出现GB2312和ASCII字符,GB18030编码的文件可以出现GBK、GB2312、ASCII字符。
https://cloud.tencent.com/developer/article/1343240
回顾了一下之前发的文章,来来回回都是围绕着socket和串口,这篇也是在
https://blog.csdn.net/bfz_50/article/details/81974907
这篇文章下有C友告知我使用python3,发送txt报错,我回答可能是txt的编码格式有误,后来对方告诉我即使txt使用UTF-8格式也会报错,这时候引起了我的重视,考虑到当时并没有实际验证就回答,实在抱歉,正好趁这个机会复习一下。
由于自己已经换成Mac系统,所以准备工作会有一些不同,看到之前的博客也没有这一块,顺便补充一下。
但是代码是不涉及系统的,win/mac兼用,后续我也会在win虚拟机上跑一下试试,确保准确。
MacOS上没有虚拟串口软件,所以需要安装PL2303驱动,使用两个USB转串口模块来测试。
1、打开如下网站
http://www.prolific.com.tw/us/ShowProduct.aspx?pcid=41&showlevel=0041-0041

解压打开后按照pdf文件指导安装即可。
2、将两个模块使用杜邦线连接,其中GND-GND,TXD-RXD,RXD-TXD

3、打开终端,输入
ls /dev/tty.*
红框部分就是我们的USB串口,其他的是蓝牙和WiFi端口,不用管。

1、先打开终端
sudo easy_install pip

3、安装pyserial,输入pip3 install pyserial,注意我用的是py3

至此准备工作已完毕
代码部分直接复制过来(txt文件与代码文件放在同一个目录下),修改的地方:文件操作open()函数的encoding参数设置为utf8,然后串口的发送函数中使用utf8(因为Mac系统下默认使用utf-8编码,其他编码会乱码,在windows下可以使用gb2312)
#!/usr/bin/env python
# -*- coding: cp936 -*-
# -*- coding: utf-8 -*-
import serial
# 打开串口
serialPort = "/dev/tty.usbserial-14330" # 串口
baudRate = 9600 # 波特率
ser = serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
CMD = open('模板.txt', encoding='utf8')
print("CMD:%s" % CMD)
line = CMD.readline()
# 收发数据
while line:
ser.write(line.encode('utf8'))
print(line)
line = CMD.readline()
ser.close()
注:在Mac中使用utf-8编码时,open函数的第二个参数可取消,串口发送函数的encode函数可以不要参数
CMD = open('模板.txt')
ser.write(line.encode())
然后运行代码,效果如下:

试了很多次,发现还是只能接收一行,估计工具的接收设置有点问题,这样的话只能到win虚拟机上去跑跑看了。
先确保安装了pyserial模块,如果没有,用pip3安装

然后代码略微做了修改,其中读取txt的编码格式改为utf-8-sig是参考了
https://www.cnblogs.com/chongzi1990/p/8694883.html
的说法,如果直接使用utf8会报\ufeff错误,其实我在保存这个文件的时候并没有使用UTF-8 with BOM,这里却出现了这个需要,让人有点疑惑。
#!/usr/bin/env python
# -*- coding: cp936 -*-
# -*- coding: utf-8 -*-
import serial
# 打开串口
serialPort = "COM2" # 串口
baudRate = 9600 # 波特率
ser = serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
CMD = open('模板.txt', encoding='utf-8-sig')
print("CMD:%s" % CMD)
line = CMD.readline()
# 收发数据
while line:
ser.write(line.encode('gb2312'))
print(line)
line = CMD.readline()
ser.close()