姓名:赵宗明
学号:19021211230
【嵌牛导读】:STM32 串口通信 数据包
【嵌牛鼻子】:利用电脑端通过串口通信控制单片机内部的参数以及单片机内部数据包向电脑端传输并显示
【嵌牛提问】:串行接口是连接单片机和PC机的一种简单方式。单片机一个字节是如何收发的?一串数据是如何收发的?电脑端一个字节、一串数据是如何收发的?这个项目向大家展示了如何使用电脑端与单片机进行数据包的相互传递。
【嵌牛正文】:
1.实验介绍
本实验主要用到了STM32的串口模块、IIC模块,定时器模块、LED模块,借助了开源的MPU6050所使用的DMP库,还使用了基于G语言图形化编程的Labview软件开发的上位机。MCU通过IIC协议实时向MPU-6050传感器读取数据并打包发送至上位机,并在电脑端以波形的形式实时显示传感器的角度数据。同时电脑端发送四个角度值数据至MCU作为角度的报警值,传感器将此四个数据作为两个轴的(俯仰角、翻滚角)角度界限,当角度超过这四个界限值时以4个LED作为报警提醒用户。
2.实验目的
·熟练使用串口收发模块,掌握串口收发的原理和具体实现方法。
·熟练掌握MCU与上位机的双向通信方式和数据包的传输及校验方式。
3.实验内容
任务要求:MCU利用IIC协议向MPU-6050传感器获取数据,并将数据传输至DMP模块,进行数据的解算得到传感器的实时角度,并将实时的角度通过串口发送至电脑端,电脑端获取角度数据并以波形的形式实时显示,同时,用户可以在上位机操作界面输入角度的界限值,实现下位机的光报警功能。
软件工具以及硬件平台:
开发软件利用了KeilSoftware官方提供的Keil5和美国国家仪器(NI)公司研制Labview图形化编程环境。
硬件使用了ST公司内核为Cortex-M3的Stm32f103-vet6,基于C语言编程开发。
4.实验原理及实现方法
该设计主要包括以下几个重要模块:波特率产生模块、数据包接收模块、数据包发送模块、LED控制模块、上位机、IIC模块。
以下为该设计的实现框图:
4.1模块设计
波特率产生模块:
波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。可以利用70M系统时钟通过计数的方式产生115200波特率模块连接至发送和接收模块。当RX或TX模块发来波特率请求信号时,波特率产生模块开始计数,当计数值达到数据发送或接收所需数值时模块产生输出,TX或RX接收到信号时便执行发送或接收的操作。本设计利用了库函数的方式,选择了115200的传输波特率。
串口发送模块:
串口发送数据包的基础是:串口正确发送一个字节的数据。串口发送一帧(一个字节)数据的格式为:起始位+8bit数据+停止位,所以发送一组数据实际传输的数据为10bit。该设计数据发送涉及多个数据的传输,所以采用了数据包的方式利用帧头帧尾校验进行数据传输及解析。MCU端串口发送格式为:
0XA5(帧头)+ AngleX_H + Angle X_L + + AngleY_H + Angle Y_L + 0XC5(帧尾)。上位机接收端利用同样的格式利用状态机的方式解析数据,并将其实时显示。因为串口每次发送一帧数据(一个字节),所以16位的数据必须将其拆分为高8位和低8位再将其发送,接收端接收到后在将两个8位数据整合为16位数据。
以下为数据发送的具体实现方法:
串口接收模块:
串口接收模块较串口发送更为复杂,因为串口要想从数据包中得到有效数据就得确保接收正确的数据包并无误的将其解析。串口接收模块和串口发送模块调用同样的波特率产生模块,均在该波特率下所计算的计数值处进行数据的收发。同样,接收数据包的基础是稳定的接收一帧数据。
接收一帧数据的原理:Stm32的RX引脚是一位一位串行的得到信号,因为发送端发送一帧数据的格式为:起始位+8bit数据+停止位,所以接收端也应该以该格式去解析数据,观察下图
本设计需要接收数据包,也就是需要解析多帧数据,该设计中利用了串口中断的方式去解析有效数据。
电脑端发送数据的格式为:、
‘空格’+ ‘元素号’+‘:’+‘数据’(例:“0:12 1:24 2:48 3:64”),因为电脑端发送字符比较简单,所以本设计采用了电脑端发送字符数据,在MCU上解析为十进制数据。具体实现方法如下: