HNU电子测试平台与工具2_《计算机串口使用与测量》

(这个有留word哈哈)

4.1    4.2    Linux 操作系统平台

一、实验目的

  1. 了解 Linux 系统文件系统的基本组织
  2. 了解 Linux 基本的多用户权限系统
  3. 熟练使用 ls、cd、cat、more、sudo、gcc、vim 等基本命令
  4. 会使用 ls 和 chmod 命令查看和修改文件权限

二、实验过程

(1)安装 Linux 系统虚拟机

(2)安装firstrun.deb包

​使用指令sudo dpkg -i firstrun.deb 进行安装。

(3)安装成功后,运行根目录下的/gettips 可执行程序。该程序将在屏幕上给出下一步骤要探索的目录。

(4)切换到root权限进入目录

运行指令切换到上面提供的目录,切换到root用户(直接进入权限不够),进入该目录。

(5)使用ls打开文件

ls查看并使用vim打开文件.puzzle.txt。

文件中内容如下:

(6)使用curl提交结果

使用如下命令提交:

curl “132.232.98.70:6363/check?id=2022xxxxxxxx&v=3321385423”

提交后返回OK,表示正确。

4.3   Linux 平台串口数据接收

一、实验目的

1、熟练使用 Linux 下 io 函数 read、write 和 epoll 函数

2、了解 Linux 设备文件机制

3、熟练使用示波器识读 UART 波形

二、实验过程

(1)安装 STC-ISP 软件

(2)按照 4.3.1 节说明,向 STC 单片计算机板下载程序 

(3)使用示波器观察 STC 单片机 UART 串口输出信号,识别单片机发送数据所使用的波特率。

测得该板波特率为 1800。

(4)根据单片机串口波特率,编写 C 语言程序从虚拟机的串口读取信息。

修改 com.c 的波特率:

(5)使用 gcc 进行编译并运行,解析程序返回的序列号和密码,并且向服务器发送指令

根据指导书:

【STC单片机计算串口发出来的内容格式为:

0xAA 0x55 序列号

以上内容为二进制数据表示,共13个字节。例如:

0xAA 0x55 0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x99 0xAA 0xBB 。

其中0x11 0x22 0x33 0x44 0x55 0x66 0x77 0x88 0x99 0xAA 0xBB 就是该单片机的序列号。请用程序读出所领单片机的序列号。】

可知,这里aa 55是开始的序列号,而后面的 a0 1d 55 17 75 98 e6 66 66 9e 7e即为传输的11位数据。

注意,提交答案的时候不要把aa,55放入,否则是错误的。

返回OK,说明正确。

4.4 计算机串口数据收发与测量

一、实验目的

1、熟练使用 Linux 下 io 函数 read、write 和 epoll 等

2、熟练处理流式通信数据二、实验过程

二、实验过程

(1)向 STC 单片机下载下面的程序

(2)下载程序后,单片机将使用 1200 波特率发送自身序列号,格式同上一节课(4.3 节内容)相同。请记录下该序列号。

可得序列号为AA 55 A0 1D 56 4F 74 72 F7 39 0D 46 9E

(机器序列号为AA55后面的部分)

(3)向串口写入自己的学号,格式为 0xAA 0x55 十二位学号数字。

如我就写入AA 55 02 00 02 02 XX XX XX XX XX XX XX XX

(4)STC 单片机接收到学号后会发送第一串密码,密码长度为 4 字节。请将解析出该串密码并原样发回给串口。STC 单品机收到返回后会继续发送下一串密码,请继续解析出该串密码并原样发回给串口。以此往复,将收到的最后一串密码记录下来。

由于只将以上(3)(4)步获得的密码提交得分较低,因此选择在Linux系统下使用 Python代码完成上面两步动作,并将取到的最后一组密码发送到课程后台中。

程序如下:

1.	import serial.tools.list_ports  
2.	# 字符串转字符串  
3.	def b2s(data):  
4.	    return ''.join([f'{ch:0>2x}' for ch in data]).upper()  
5.	# 连接设备  
6.	ser = serial.Serial(list(serial.tools.list_ports.comports()[0])[0], 1200)  
7.	# 判断是否连接到设备  
8.	assert (ser != None)  
9.	# 输入学号  
10.	studentID = input("学号:")  
11.	# 判断学号是否正确  
12.	assert (studentID.isdigit() and len(studentID) == 12)  
13.	# 读入序列号  
14.	number = b2s(ser.read(13))  
15.	# 断言魔数为AA55  
16.	assert (number[:4] == "AA55")  
17.	# 取出序列号  
18.	number = number[4:]  
19.	assert (len(number) == 11 * 2)  
20.	print(f'序列号:{number}')  
21.	# 使用学号构造即将发送的字节数据  
22.	startData = b'\xaa\x55' + bytes([ord(ch) - ord('0') for ch in studentID])  
23.	# 写入设备  
24.	ser.write(startData)  
25.	password = b''  # 读到的密码  
26.	i = 1  # 循环次数  
27.	# 开启永真循环,直到ctrl+c被按下  
28.	while True:  
29.	    # 读1位,探测魔数  
30.	    t = b2s(ser.read(1))  
31.	    # 第一个魔数应该是AA  
32.	    if t != "AA":  
33.	        continue  
34.	    # 再读一位  
35.	    t = b2s(ser.read(1))  
36.	    # 第二个魔数应该是55  
37.	    if t != "55":  
38.	        continue  
39.	    # 判断魔数后可以放心读取数据  
40.	    # 读入密码开始位置的索引  
41.	    index = list(ser.read(1))[0]  
42.	    # 若索引大于4,则表明中间有无关字节,吸收掉无关字节  
43.	    if index - 4 > 0:  
44.	        ser.read(index - 4)  
45.	    # 读入四字节的密码  
46.	    password = ser.read(4)  
47.	    print(f'[{i}]密码:{b2s(password)}')  
48.	    # 使用这次读到的密码构造数据,发送给设备以读取下一次的密码  
49.	    ser.write(b'\xaa\x55' + password)  
50.	    i += 1  

在sudo权限下运行main.py,输入自己的学号,得到结果。 

(5)将学号、序列号、最后一串密码发送到课程后台。上送命令语法为

curl "132.232.98.70:6363/checkSecret?id=学号&v=序列号&s=密码"

返回256,表示已经拿到最高分,实验成功。

4.5   RS485 信号的测量

一、实验目的

1、熟练使用 Linux 下 io 函数 read、write 和 epoll 等

2、熟练 RS485 串口的信号特点二、实验过程

二、实验过程

(1)为自己的板(A板)下载新的hex文件。

然后按下K3按键,电路板将通过RS485向外发出一组序列号信息。该信号序列格式为:

0xAA 0x55 4字节序列号

在板上RS485接口插上杜邦线,然后示波器观察该序列信息的内容和波特率并做好记录。

下图是A板的示波器显示,使用1÷836μs,其波特率为1200

(2)下载B板文件

使用同学的STC电路板(后面称为B板),下载B板Hex文件:

B板会将计算机通过USB 串口发送的数据,转发到RS485接口上。同时将RS485接口收到的数据,通过USB 串口转发到计算机上。我们接下来使用这个B板与自己的A板进行通信,读取A板的密码。

B板每次上下拨动摇杆,其串口和RS485总线上波特率会发生变化,同时会在RS485接口上输出一个0x55。请插上杜邦线后,使用示波器观察其波特率。

请通过上下拨动B板摇杆调节B板波特率,使之与A板输出的RS485波特率相匹配。

这里我们上下拨动B板摇杆,直至差不多能等于上面的836μs为止,这样B板的波特率也会是1200,与A板对应。

完成时结果如下:

(3)获取A板序列号

在A板、B板的波特率相同后,按下A板K3键,返回序列号(请一定注意是4字节)如下:

96 20 48 98

(4)使用串口通信程序,调用 write 函数接口向串口发送读密码命令。读密码命令格式为:

0xAA 0x55 A 板序列号 12 字节学号

A 板会回应密码,回应格式为:

0xAA 0x55 4 字节密码

回应密码会经过B板转发到计算机上。请调用read函数接口从串口读取该密码。

返回答案如下图所示:

密码为18 1C 99 F3

5、请将 A 板序列号、学号和密码通过 curl 命令发送到课程后台系统。

上送命令语法为

curl "132.232.98.70:6363/check485?id=学号&v=序列号&s=密码"

返回 OK。

4.6  RS485 总线数据收发

一、实验目的

1、熟练使用 Linux 下 io 函数 read、write 和 epoll 等

2、熟练处理流式通信数据

3、理解 485 总线的冲突问题

二、实验过程

(1)向单片机板下载程序

向 A 单片机板下载下面的程序

下载程序后,A 板单片机将使用 1200 波特率约每 300ms 发送一次自身序列号,格式为

0xAA 0x55 4 字节序列号

向 A 单片机板下载下面的程序

(2)通过 B 板串口向 RS485 总线写入自己的学号,格式为

0xAA 0x55 十二位学号数字。

(3) A 板单片机接收到学号后会每 300ms 发送第一串密码,密码长度为 4 字节。请将解析出该串密码并在 150ms 内原样发回给串口(否则会造成总线的冲突)。STC 单品机收到返回后会继续发送下一串密码,请继续解析出该串密码并在 150ms 内原样发回给串口。以此往复,将收到的最后一串密码记录下来。

由于人力无法实现满分,因此接下来编写代码来进行实验。

(4)编写python代码并获取结果

代码如下:

1.	import serial  
2.	import serial.tools.list_ports  
3.	# 字节转字符串  
4.	def b2s(data):  
5.	    return ''.join([f'{ch:0>2x}' for ch in data]).upper()  
6.	# 连接设备  
7.	ser = serial.Serial(list(serial.tools.list_ports.comports()[0])[0], 1200)  
8.	# 判断是否连接到设备  
9.	assert(ser != None)  
10.	# 输入学号  
11.	studentID = input("学号:")  
12.	# 判断学号是否正确  
13.	assert(studentID.isdigit() and len(studentID) == 12)  
14.	# 读入序列号  
15.	number = b2s(ser.read(6))  
16.	# 断言魔数为AA55  
17.	assert(number[:4] == "AA55")  
18.	# 取出序列号  
19.	number = number[4:]  
20.	# 判断序列号长度是否正确  
21.	assert(len(number) == 4 * 2)  
22.	print(f'序列号:{number}')  
23.	# 使用学号构造即将发送的字节数据  
24.	startData = b'\xaa\x55' + bytes([ord(ch) - ord('0') for ch in studentID])  
25.	# 写入数据  
26.	ser.write(startData)  
27.	password = b''  # 读到的密码  
28.	i = 1   # 记录循环次数  
29.	# 开启永真循环,直到Ctrl+C被按下  
30.	try:  
31.	    while True:  
32.	        data = ser.read_all()  
33.	        sdata = b2s(data)  
34.	        if data != b'' and sdata[:4] == "AA55":  
35.	            password = data[-4:]  
36.	            if len(password) == 4:  
37.	                print(f'[{i}]密码:{b2s(password)}')  
38.	                # 使用这次读到的密码构造数据,发送给设备以读取下一次的密码  
39.	                ser.write(b'\xaa\x55' + password)  
40.	                i += 1  
41.	# 当Ctr+C被按下时执行,建议在读到的密码不再变化时按下,大概在256次循环之后  
42.	except KeyboardInterrupt:  
43.	    print(f'[结束]最后一串密码为:{b2s(password)}') 

(5)获得结果并向服务器发送指令:

结果如下:

将学号、序列号、最后一串密码发送到课程后台。上述命令语法为

curl “132.232.98.70:6363/check485Secret?id=学号&v=序列号&s=密码”

使用curl指令提交答案,获取分数256,表明实验完美实现。

实验总结

通过本次计算机串口使用与测量实验,我获得了深入且实际的串口通信知识,并且在实际操作中进一步熟悉了相关技术和方法。实验不仅让我掌握了串口基本概念,还加深了对Linux操作系统及单片机编程的理解。

在实验过程中,我使用Linux操作系统进行了大量的文件操作,并通过单片机软件与硬件交互。这不仅加深了我对操作系统的熟悉,也让我更好地理解了计算机硬件与软件的协同工作方式。

我学习了如何通过编写程序,使用IO函数来实现串口的数据收发。通过实际编写串口数据收发程序,我体会到了如何处理串口数据,使用如write和read等函数进行数据读写。实验中,我特别关注了RS485接口的应用,通过半双工通信模式,成功实现了两块单片机间的数据传输。

在进行RS485通信时,我发现了数据冲突导致错误的情况,这使我认识到在编程时对错误处理的重要性。我通过Python编写程序来实现功能,意识到后续还需要进一步提高代码的性能及优化编程技巧。

总结来说,这次实验不仅增强了我对串口通信的理论知识和实际操作的理解,而且通过实验的即时反馈,如使用curl命令获取实验分数,极大地增强了我学习的动力和实验的互动性。未来我希望继续探索更多关于串口通信的深层次知识,并将这些知识应用到实际问题的解决中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++知识点总结全系列 (06)】:STL六大组件详细总结与分析- 配置器、容器、迭代器、适配器、算法和仿函数

STL六大组件目录 前言1、配置器(1)What(2)Why(3)HowA.调用new和delete实现内存分配与销毁B.STL Allocator (4)allocator类A.WhatB.HowC.allocator的算法 2、容器(1)What(2)Which(有哪些容器)(3)序列容器(顺序容器)A.WhichB.array&…

计算机网络知识普及之四元组

在涉及到TCP/UDP等IP类通信协议时,存在四元组概念 这里只是普及使用 先来一些前置知识,什么是IP协议? IP协议全称为互联网协议,处于网络层中,主要作用是标识网络中的设备,每个设备的IP地址是唯一的。 在网…

【JVM排查问题】JProfiler性能分析工具连接远程服务器Docker容器中的Java服务

1、下载JProfiler https://www.ej-technologies.com/download/jprofiler/version_13 下载Windows版本以及Linux版本 Windows用于可视化、Linux用于在Docker容器中启动 2、将Linux版本的JProfiler上传到Docker容器中,宿主机cp命令到容器中 docker cp /home/data/s…

像学Excel 一样学 Pandas系列-创建数据分析维度

嗨,小伙伴们。又到喜闻乐见的Python 数据分析王牌库 Pandas 的学习时间。按照数据分析处理过程,这次轮到了新增维度的部分了。 老样子,我们先来回忆一下,一个完整数据分析的过程,包含哪些部分内容。 其中&#xff0c…

CAM350如何添加走线?

在CAM350中如何添加走线? 有时候由于PCB文件丢失或其它原因,只有GERBER文件,这时候LAYOUT工程师就只能使用CAM350在GERBER里面修改。 那在CAM350里面如何添加走线呢? 操作方法如下: 1、选择菜单栏Add 选择Line 2、在走线前,要先设置D码,就是走线的形状和宽度。必需选择…

【服务器部署】Jenkins配置前端工程自动化部署

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

BIOS中的设置虽然不少,但其实大部分时候只需进行一些简单的调整

序言 浏览BIOS可能会让人感到不知所措,因为要考虑的设置太多了。但是,你应该在BIOS中进行一些简单的调整,以提高系统的性能和稳定性。我们将向你展示其中的一些调整,并解释你可能想要使用它们的时间和原因。 用密码保护你的BIOS 虽然我们很小心地对用户帐户进行密码保护…

[译]Reactjs性能篇

英文有限,技术一般,海涵海涵,由于不是翻译出身,所以存在大量的瞎胡乱翻译的情况,信不过我的,请看原文~~ 原文地址:https://facebook.github.io/react/docs/advanced-per…

JavaSE阶段面试题(一)

目录 1.int a 1, int b 1, Integer c 1, Integer d 1;四个区别和联系,以及c和d是同一个吗? 2.为什么重写HashCode必须重写euqals,两者之间的关系? 3.创建对象的方式有哪些 4.重写和重载的区别 5.抽象类和接口…

day02-广播机制

广播机制 广播是numpy对不同形状的数组进行数值计算的方式,对数组的算术运算通常在相应的元素上进行 1.如果两个数组a和b形状相同,即满足a.shape b.shape,那么a*b的结果就是a与b数组对应位相乘。这要求维数相同且各维度的长度相同 a np.a…

七大排序算法的深入浅出(java篇)

🍁 个人主页:爱编程的Tom💫 本篇博文收录专栏:Java专栏👉 目前其它专栏:c系列小游戏 c语言系列--万物的开始_ 等等 🎉 欢迎 👍点赞✍评论⭐收藏💖三连支…

【高级篇】第9章 Elasticsearch 监控与故障排查

9.1 引言 在现代数据驱动的应用架构中,Elasticsearch不仅是海量数据索引和搜索的核心,其稳定性和性能直接影响到整个业务链路的健康度。因此,建立有效的监控体系和掌握故障排查技能是每一位Elasticsearch高级专家的必备能力。 9.2 监控工具:洞察与优化的利器 在Elastics…

乘用车副水箱浮球式液位计传感器

浮球式液位计概述 浮球式液位计是一种利用浮球在液体中浮动的原理来测量液位的设备,广泛应用于各种工业自动化控制系统中,如石油化工、水处理、食品饮料等行业。它通过浮球的上下运动来测量液位的高低,具有结构简单、安装方便、测量范围广、…

如何选择适合自己的虚拟化技术?

虚拟化技术已成为现代数据中心和云计算环境的核心组成部分。本文将帮助您了解如何选择适合自己需求的虚拟化技术,以实现更高的效率、资源利用率和灵活性。 理解虚拟化技术 首先,让我们了解虚拟化技术的基本概念。虚拟化允许将一个物理服务器划分为多个虚…

【Linux】多线程(一万六千字)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 线程的概念 线程的理解(Linux系统为例) 在Linux系统里如何保证让正文部分的代码可以并发的去跑呢? 为什么要有多进程呢? 为…

Osg中的智能指针和观察指针

目录 1 设计 内容 1 设计 osg中能够使用智能指针的对象都继承自引用计数类Referenced,观察指针(observer_ptr)与智能指针之间通过ObserverSet相互关联,其中obserserver_ptr直接依赖ObeserverSet。 Referenced不直接依赖ObserverSet类,但可…

pdf合并,pdf合并成一个pdf,pdf合并在线网页版

在处理pdf文件的过程中,有时我们需要将多个pdf文件合并成一个pdf文件。作为一名有着丰富计算机应用经验的技术博主,我将为您详细介绍如何将多个pdf文件合并成一个pdf文件。 pdf合并方法:使用, “轻云处理pdf官网” 打开 “轻云处…

【高中数学/基本不等式】已知:x,y皆大于1,且x+2y=4 求:1/(x-1)+1/(y-1)的最小值为?

【问题来源】 https://www.ixigua.com/7025123539728466469?logTag1c2fd2e305d60e6277ab 之第一题 【问题】 已知:x,y皆大于1,且x2y4 求:1/(x-1)1/(y-1)的最小值为? 【解答】 解: 若将(x2y)/41代入目标式&…

学习笔记(linux高级编程)11

进程间通信 》信号通信 应用:异步通信。 中断,, 1~64;32应用编程。 如何响应: Term Default action is to terminate the process. Ign Default action is to ignore the signal. wait Core Default action is …

番外篇 | 斯坦福提出即插即用二阶优化器Sophia :相比Adam实现2倍加速,显著节省大语言模型训练成本

前言:Hello大家好,我是小哥谈。大模型的预训练成本巨大,优化算法的改进可以加快模型的训练时间并减少训练开销。目前大模型的训练优化器基本上都采用Adam及其变体,并且Adam的应用已经有9个年头了,在模型优化方面相当于霸主的地位。但是能否够在优化器方面提高模型预训练效…