串口通信原理及测量实验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++代码完成,后续还需要加深理解,提高代码的性能以及编写相关代码的能力。

物联沃分享整理
物联沃-IOTWORD物联网 » 串口通信原理及测量实验2详解

发表评论