当前位置: 首页 > news >正文

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、解析密码

  1. 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

相关文章:

  • 2025年PMP 学习十六 第11章 项目风险管理 (总章)
  • 如何在自动化脚本中向控件输入文本?
  • ohttps开启群晖ssl证书自动更新
  • Leetcode76覆盖最小子串
  • 五月份嵌入式面试总结
  • 锐捷交换机STP环路日志信息解读
  • ODB 的安装及使用
  • 前端实现流式输出《后端返回Markdown格式文本,前端输出类似于打字的那种》
  • Systemd基础
  • qtc++ qdebug日志生成
  • 【gRPC】HTTP/2协议,HTTP/1.x中线头阻塞问题由来,及HTTP/2中的解决方案,RPC、Protobuf、HTTP/2 的关系及核心知识点汇总
  • 项目QT+ffmpeg+rtsp(一)——Qt的安装和rtsp的测试
  • python中集合的操作
  • Python 中的 typing.ClassVar 详解
  • 会议分享|高超声速流动测量技术研讨会精彩探析
  • windows下authas调试tomcat
  • 青少年ctf平台应急响应-应急响应1
  • 基于 nvitop+Prometheus+Grafana 的物理资源与 VLLM 引擎服务监控方案
  • 自学嵌入式 day19-数据结构 链表
  • 二水平设计的单次重复
  • 淮安市车桥中学党总支书记王习元逝世,终年51岁
  • 《歌手》回归,人均技术流,00后整顿职场
  • 全国多家健身房女性月卡延长,补足因月经期耽误的健身时间
  • 101岁陕西省军区原司令员冀廷璧逝世,曾参加百团大战
  • 著名心血管病学专家李国庆教授逝世,享年63岁
  • 查幽门螺杆菌的这款同位素长期被海外垄断,秦山核电站实现突破