串口通信原理及测量实验2详解
工程文件:https://github.com/A-Y-1/HNU
和串口部分第一个实验一样用C写的,然后又和同学搞了一个C++的出来,但是还是比不过python的版本╮(╯▽╰)╭,仅供参考。(改改还是能更好的,但是我开摆了)
update4.23:我更新了串口1的代码,改到能读出全部密码了,还没完成串口1的可以看看
串口使用与测量2
一.实验目的
1.熟练使用Linux下io函数read、write和epoll等
2.熟练RS485串口的信号特点
3.熟练处理流式通信数据
4.理解485总线的冲突问题
二.实验过程
RS485信号测量
本实验需要将A板与B板通过RS485接口连接并进行通信。需要使用杜邦线连接两单片机板的RS485接口,通过计算机向B板写入发送的数据(A板序列号+学号),数据将通过串口发给B板,再经RS485接口发给A板,发送后A板将发回密码,B板将密码通过串口发送到计算机,需要在计算机上读出密码。
1.测量A板波特率
将A板RS485接口接到示波器,测量如下:
波特率大约为1/50us,故可确认波特率为19200。将B板接示波器,控制摇杆调整至波特率为19200。
2.测量序列号
将A板与B板的RS485接口通过杜邦线连接,按下A板K3,在串口调试助手可以收到A板的序列号为:0e224bed。
此处由于时间有限,直接使用串口调试助手得到A板的序列号,可用示波器得到A板的序列号,使用示波器按波形读取序列号时,需要注意停止位。
3.读密码
在linux平台下的前次实验的读取串口程序中,设置缓冲区,循环中向串口写入AA55+序列号+学号
运行程序,可以收到A板发送的密码:
密码为2fe40a4b。
4.提交
将序列号及密码提交。
RS485总线数据收发
RS485总线有两条线信号线,能够传输一个逻辑信号。计算机标准的UART串口有RX、TX收发两条线,因此能够同时进行数据的接收和发送。而RS485只有一个逻辑信号,因此同一时刻只能有一个主体进行数据发送(因此叫做半双工通信串口)。
本实验需要连接两单片机板的RS485接口,A板将先发送序列号。使用计算机连接B板串口,发送学号,然后B板将发送给A板,此后A板将通过RS485接口发送密码,B板需要接收密码,取出密码发回,然后A板将发送新的密码。重复该过程至A板不再发送新的密码。
1.测量A板序列号
先使用串口调试助手接收A板的序列号,序列号为79eb7a19
2.接收密码,分析密码格式
先使用串口调试助手发送学号,接收一次A板的密码,从而判断A板发送密码的格式。得到的密码格式为aa 55 ff 5b 11 30 95,即aa 55后开始四个字节即为密码,中间只有一个字节的填充字符。
3.编写代码
已知密码格式,接下来编写程序完成B板的学号发送,密码的处理及密码的发送工作。
编写代码使用c语言在第一次实验中的代码基础上进行修改,一个字节一个字节读取数据,然后取出密码发送数据,由于这种方式需要多次读取A板发送的串,耗时很长。最终使用的代码是同学使用C++编写的程序,该程序可以一次读到足够长度的数据。以下先对该程序进行说明:
C++语言实现
程序使用c++语言进行编写,程序的读写使用的myRead和myWrite是参考网上的实现,将串口相关读写功能封装为serial类使用。具体的读写函数通过循环,确保能够读到或写足够长度的数据。数据均使用vector保存。在主程序中,先发送学号,然后while循环读取数据,读到的数据长是确定的。读取长度根据已知密码格式应该为7个字节,由于密码串开始的位置是不确定的,对读到的数据要先找到aa 55,然后通过取余的方式将数据中的密码字节读取并插入vector,再进行发送。
运行结果:
最终得到的密码为a681a302,提交:
C语言实现
主要部分如下:
读取到aa55后开始计数,start设置为4,即count=4,第四个字节而开始向缓冲区buf写入密码字节,写够4字节后向串口写入数据。由于这种实现需要一个字节一个字节读取数据,耗时很长,最后没有使用该程序,但测试时运行三分钟左右,得到的密码提交为38号密码,表明程序可以正确运行。
三.实验总结
通过实验进一步熟悉了串口通信的方法,以及使用write,read等函数进行串口数据进行读写。了解了RS485接口的使用,通过RS485实现了两板的通信和数据传输。认识了RS485的半双工通信模式,在程序运行时,有些产生的密码是错误的,即发生了冲突得到了错误数据。对于程序的编写,能够通过c语言程序实现功能,但是效果不好,还需要进一步学习。最终的实现还是参考他人的c++代码完成,后续还需要加深理解,提高代码的性能以及编写相关代码的能力。