python和单片机之间通过串口连接
前言
很多时候电脑和单片机之间串口通讯是为了把电脑作为上位机。由于串口调试助手之类的软件不能进一步实现其他功能,比如设计一个界面,向单片机发送指令(比如用电脑控制电机的旋转)。在比如设计一个显示窗口对单片机传送来的数据 进行显示(比如设计一个虚拟示波器,单片机把数据传输给电脑进行显示)。需要进一步使用是他语言与单片机进行通讯。
准备工作
- 本教程硬件连接以及单片机中的程序和上个教程中完全相同。
当前你再开始之前,你应该安装python并了解python的基本使用规则,参见python安装和python基础
安装好python后,还要安装必须的库才能运行。在cmd中运行如下命令
pip install pyserial
实际操作
- python中输入如下代码
- 打开单片机电源
- 运行python代码
import serial import time #定义串口并进行基本设置 serialport = serial.Serial() serialport.port = 'COM4'#这里修改成你的串口名! serialport.baudrate = 9600#波特率 serialport.bytesize = 8 serialport.parity = serial.PARITY_NONE serialport.stopbits = 1 serialport.timeout = 0.001 serialport.close()#先进行一个关闭操作的目的是为了防止串口没关闭导致串口无法打开 #打开串口 if not serialport.is_open: serialport.open() time.sleep(0.5)#串口打开需要耗费时间,间隔0.5以上 _ = serialport.read(1)#先把串口第一个数取出,第一个数值为空值,删除 #向串口发送数据1 #发送数据,包含换行符以确保接收端正确处理输入 serialport.write(b'1')#前面加b表示字节字符串 #读取串口的数据 #time.sleep等待一段时间,这个时间里单片机应该发送数据到串口缓存 #inWaiting返回缓存中的字节数,搭配time.sleep使用,否则数据会没有 #进入缓存区而结束程序 time.sleep(0.1)#等待一段时间,这个时间里单片机应该发送数据到串口缓存 #时间设置参考串口传输速率 num = serialport.inWaiting()#返回缓存中的字节数,搭配time.sleep使用, #否则数据会没有进入缓存区而结束程序 if num > 0: data = serialport.read(num)#读取num个数字 print(data)#显示 serialport.close()
如果无误的话,应该可以在python界面中显示b'2'
如果需要持续接收数据,可设置一个定时器,反复调用接收串口数据
问题排查
- python报错:serial.serialutil.SerialException: could not open port 'COM4': PermissionError(13, '拒绝访问。', None, 5).串口被占用,串口助手可能没有关闭
- python报错:could not open port 'COM5': FileNotFoundError(2, '系统找不到指定的文件。', None, 2).串口名错误,或者驱动没装好
- python返回乱码,波特率错误,应为9600
学习拓展
1.b'1' 的进一步理解:
b'1'前面加b表示byte,就是字节字符串(字节编码),也就是其编码后是8位的,范围0-255。而如果不加b,那默认就是unicode编码,这种编码方式一般会占用2个以上的字节。比如字符'1',在字节编码中为0011 0001,而unicode编码则为0000 0000 0011 0001
============================找指导老师布置任务吧==============================