Linux平台串口数据接收
一、实验目的
1、熟练使用Linux下io函数read、write和epoll函数
2、了解Linux设备文件机制
3、熟练使用示波器识读UART波形
二、实验说明
》串口:串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。
》波特率:波特(Baud)即调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数。
波特率表示单位时间内传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,波特率即指一个单位时间内传输符号的个数。
实验使用示波器抓取STC单片计算机板发送的UART信号,分析该信号的波特率,根据识读到的结果编写Linux程序读取UART串口所收到的数据。
左侧箭头:USB连接虚拟机
右侧箭头:P1.1UART发送脚
UART串口是通过移位寄存器将所传输的数据按时间顺序进行传输的方式。信号线在没有数据传输时保持高电平。信号以下降沿表示传输开始。传输开始时,UART固定传输一个码片时间的低电平作为起始位,然后开始移位所传输载荷数据的最低比特。
每次传输可以传输7比特、8比特或者9比特数据,可以选择带奇偶校验位,最后再固定传输一个码片宽度的高电平作为停止位。
例如,最主流的UART串口配置是8N1,就是1个起始位、8个数据位,1个停止位,无奇偶校验位。又例如下图所示,就是1个起始位,7个数据位,1个奇偶校验位,1个停止位。
由于UART串口没有时钟信号,所以需要通信双方约定一个码片的时间长度。人们习惯使用波特率来表示每秒钟所能发送的码片数量。码片长度越长,波特率越低;码片长度越短,波特率越高。常用的波特率有1200、1800, 2400, 4800, 9600,19200, 38400, 57600, 115200等。这次实验所用的波特率都是常用波特率。
实验所用STC单片机,下载dut1.hex文件后会主动按照以下格式发送数据。本次实验是要正确获取序列号内容。
字节1 | 字节2 | 字节3-字节13(共11字节) |
0xAA | 0x55 | 序列号 |
三、实验内容
1、按照3.3.1节说明,向STC单片计算机板下载程序
(1)先下载安装USB转串口芯片CH340G的驱动程序
(2)再下载STC-ISP软件,无需安装,打开即可使用
打开STC-ISP软件,检测串口号。若单片机与电脑未连接,串口号不会显示USB-SERAL CH340,若正常连接则显示USB-SERAL CH340和对应串口号;选择单片机型号“IAP15F2K61S2”。
未连接:
已连接:
点击“打开程序文件”,选择打开要下载的“.hex”文件
点击“下载/编程”,然后按下单片机的复位键(下载键),进行程序下载,下载成功显示“操作成功”:
依据已下载的程序的功能,在单片机上进行相关功能的测试的操作,观察现象即可。
2、使用示波器观察STC单片机UART串口输出信号,识别单片机发送数据所使用的波特率。
1/52us*10^6≈19200,得知该单片机所用波特率为19200。
3、根据单片机串口波特率,编写C语言程序从虚拟机的串口读取信息。下面是不完整的参考示例,可以根据自己需要进行修改。
将代码按测得的波特率修改为下图所示:
问题:出现/dev/ttyUSB0: Input/output error
解决:虚拟机添加串口:
问题:出现/dev/ttyUSB0: Permission denied
解决:sudo chmod 777 /dev/ttyUSB0
可得序列号为f4 49 02 19 20 1e 17 69 07 15 ed
4、使用如下命令将序列号提交到本次实验服务器,其中112233445566778899AABB请用读取到的序列号代替,iiiiiiiiiii用自己学号代替。请同学们务必正确输入自己的学号。
curl "132.232.98.70:6363/checkBaud?id=iiiiiiiiiiii&v=112233445566778899AABB"