HNU工训--计算机串口数据收发与测量
本文参考:HNU-电子测试平台与工具2-串口实验5次_湖南大学学习通电子测试平台-CSDN博客
甘青学长就是强
一、实验目的
1、了解Linux下io函数read、write和epoll等
2、熟练处理流式通信数据
二、实验过程
1、向STC单片机下载下面的程序
下载程序后,单片机将使用1200波特率发送自身序列号,格式同上一节课(4.3节内容)相同。请记录下该序列号。
(1)判断有没有连接串口
(2)打开程序文件
(3)下载/编程
(4)找到串口助手
(5)打开串口,接受缓冲区就会输出序列号,从AA55到AA55是一个完整的序列号
2、向串口写入自己的学号,格式为
0xAA 0x55 十二位学号数字
例如学号20220110203,应该通过串口发送以下数据
AA 55 02 00 02 02 00 01 01 01 00 02 00 03
(1)发送缓冲区输入AA 55 + 自己的学号
(2)打开串口
(3)点击发送数据
这时候接收缓冲区就会输出一串新密码
我这里接收到的是 E4 88 D5 16
3、解析密码
- STC单片机接收到学号后会发送第一串密码,密码长度为4字节。请将解析出该串密码并原样发回给串口。STC单片机收到返回后会继续发送下一串密码,请继续解析出该串密码并原样发回给串口。以此往复,将收到的最后一串密码记录下来。
首先在主机里重新执行第一步,重新下载程序到板子里,注意不需要把学号发送到串口,这是关键,再次下板子就是为了清除之前发送学号的影响。然后打开虚拟机
打开虚拟机选项,找到可移动设备, 如果板子还插在电脑上应该可以看到:Qing Heng USB2.0-Serial的选项,打开这个选项,点击连接,板子就从电脑主机连接到虚拟机了
打开终端:
ls /dev/tty*
找到 USB名字
我这里是ttyUSB0
修改python代码里的串口名字为 /dev/ttyUSB0
python代码如下:
import serial.tools.list_ports
# 字符串转字符串
def b2s(data):return ''.join([f'{ch:0>2x}' for ch in data]).upper()
# 连接设备
ser = serial.Serial("/dev/ttyUSB6", 1200)
# 判断是否连接到设备
assert (ser != None)
# 输入学号
studentID = input("学号:")
# 判断学号是否正确
assert (studentID.isdigit() and len(studentID) == 12)
# 读入序列号
number = b2s(ser.read(13))
# 断言魔数为AA55
assert (number[:4] == "AA55")
# 取出序列号
number = number[4:]
assert (len(number) == 11 * 2)
print(f'序列号:{number}')
# 使用学号构造即将发送的字节数据
startData = b'\xaa\x55' + bytes([ord(ch) - ord('0') for ch in studentID])
# 写入设备
ser.write(startData)
password = b'' # 读到的密码
i = 0 # 循环次数
# 开启永真循环,直到ctrl+c被按下
while i < 270:# 读1位,探测魔数t = b2s(ser.read(1))# 第一个魔数应该是AAif t != "AA":continue# 再读一位t = b2s(ser.read(1))# 第二个魔数应该是55if t != "55":continue# 判断魔数后可以放心读取数据# 读入密码开始位置的索引index = list(ser.read(1))[0]# 若索引大于4,则表明中间有无关字节,吸收掉无关字节if index - 4 > 0:ser.read(index - 4)# 读入四字节的密码password = ser.read(4)print(f'[{i}]密码:{b2s(password)}')# 使用这次读到的密码构造数据,发送给设备以读取下一次的密码ser.write(b'\xaa\x55' + password)i += 1
执行python程序
在终端进入文件目录,执行
sudo python3 py.py # py.py 第一个py是文件名,,第二个py是文件后缀
如果你遇到下面问题,恭喜遇到问题,缺少名字叫做serial的模块
解决方法也很简单,下载一个就行了,你可以执行下面的命令
sudo apt install python3-serial
但是如果你下载成功之后再次输入sudo python3 py.py运行程序 发现还是报这个错,告诉你缺少serial模块怎么办,那我问你?
查阅资料发现:出现这种情况不是你serial模块有问题,而是你的系统里面有两个python,一个是ubuntu系统自带的,另一个是你自己下载的(估计是操作系统实验一惹的祸),你可以通过如下命令查看python3的指向
ls -l $(which python3)
如果发现python3指向/usr/local/bin/python3,恭喜你,确实是因为你下载了两个python,因为ubuntu系统自带的python在目录/usr/bin/python3里面
解决方法有两个:
- 删除自己下载的python3
ls -l /usr/local/bin/python*
sudo rm /usr/local/bin/python*
- 添加软连接(强力推荐)
sudo rm /usr/bin/python # 删除旧的软链接(谨慎!)
sudo ln -s /usr/bin/python3 /usr/bin/python # 添加新链接
添加完后, 你就可以使用sudo python py.py来执行程序
当然,聪明的你可能会想到把python改的简单点,比如py
# sudo rm /usr/bin/python # 这里你可以删除旧链接也可以选择不删,并不影响py命令
sudo ln -s /usr/bin/python3 /usr/bin/py # 添加新链接
接下来就是运行
观察得知:第256次(第0次不是密码,那是串口上次保存的信息)得到不变的密码:AE3035A5
告诉大家一个冷知识,当终端一直输出,你想结束终端的输出时,你可以键盘输入ctrl + z
4、将学号、序列号、最后一串密码发送到课程后台
上送命令语法为
curl "132.232.98.70:6363/checkSecret?id=学号&v=序列号&s=密码"
序列号是AA55A01D55387576E3A83034A5(记得删掉AA55),学号是202308040106,最后一串密码为AE3035A5,那么上报结果命令为:
curl "132.232.98.70:6363/checkSecret?id=202308040106&v=A01D55387576E3A83034A5&s=AE3035A5"
注意不要有空格,有空格输出是0