【Python】使用python3串口发送txt数据

一、What

先把一些过程中查询到的资料贴一下,主要是编码方面知识。

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

二、Why

回顾了一下之前发的文章,来来回回都是围绕着socket和串口,这篇也是在
https://blog.csdn.net/bfz_50/article/details/81974907
这篇文章下有C友告知我使用python3,发送txt报错,我回答可能是txt的编码格式有误,后来对方告诉我即使txt使用UTF-8格式也会报错,这时候引起了我的重视,考虑到当时并没有实际验证就回答,实在抱歉,正好趁这个机会复习一下。

三、How

3.1、前期准备工作

由于自己已经换成Mac系统,所以准备工作会有一些不同,看到之前的博客也没有这一块,顺便补充一下。
但是代码是不涉及系统的,win/mac兼用,后续我也会在win虚拟机上跑一下试试,确保准确。

3.1.1 安装PL2303驱动

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端口,不用管。
在这里插入图片描述

3.1.2 安装pyserial

1、先打开终端
sudo easy_install pip

在这里插入图片描述

2、然后输入pip help查看安装是否成功

在这里插入图片描述

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

在这里插入图片描述

至此准备工作已完毕

3.2 代码部分

先新建一个txt文件,然后格式选择为UTF-8

在这里插入图片描述

代码部分直接复制过来(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虚拟机上去跑跑看了。

3.3、win上运行

先确保安装了pyserial模块,如果没有,用pip3安装

在这里插入图片描述

新建一个txt,另存为UTF-8编码,覆盖原文件

在这里插入图片描述

键入如下内容:

在这里插入图片描述

然后代码略微做了修改,其中读取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()

运行效果如下:

在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值