当前位置:文档之家› stm32串口通信协议简单教程

stm32串口通信协议简单教程

STM32串口通信协议简单教程

一、修改串口UART1IT工程模版

用Keil MDK打开短学期资料中的工程示例→串口→UART1IT示例,查看main.c代码如图1所示:

图1 UART1IT串口示例代码

打开文件列表中的stm32f10x_it.c文件,找到UART1中断函数如图2所示代码:

图2 UART1串口中断函数

为方便起见,将整个USART1_IRQHandler函数剪切到main.c文件末尾如图3所示。并删除stm32f10x_it.c文件中的sp变量定义,如图4所示。

图3 移动串口中断函数

图4 去除stm32f10x_it.c中的sp变量声明

重新编译一次工程,看看修改是否出现错误,编译失败出现错误则需仔细检查刚才的修改是否正确。编译成功,下载工程到实验板,关闭下载程序。将实验板BOOT跳线至正常运行模式并重新上电。打开串口调试助手,选择实验板USB虚拟串口并打开,如图5所示。可以看到图中窗口不停的接收到“Hello world!”这样的字符串数据。在发送区域输入字符1,点击发送按钮,可以观察到实验板的流水灯速度变快了很多。

在main函数之前,添加按键扫描代码如图6所示,然后在main函数中,添加sendstr 数组,key和oldkey两个整数变量,如图7所示。

图6 添加按键扫描函数

图7 添加相关变量

接下来,在main函数的while主循环中,添加发送按键状态代码如图8所示。同时,将main函数中的Hello world字符串发送行注释掉,如图9所示。为使按键响应灵敏,可以将main.c文件开头的sp变量初始值由100改为10。

注意,资料包里面的串口调试助手UartAssit软件容易造成虚拟串口占用,甚至使系统崩溃。考虑到使用方便,推荐使用sscom42软件。这里给大家一个下载地址/soft/53912.html

图8 main主函数中的发送按键状态代码

图9 注释Hello world发送行

编译并下载程序后,接上串口调试助手,我们可以看到调试助手窗口中的结果如图10所示。由图中可以看到,调试助手接收到”6MK2D6MK2U”,这表示实验板按键K2被按下和放开两个动作。

图10 串口调试助手结果

接下来,为完成协议要求,在main函数之前添加校验码函数代码如图11所示。

图11 添加校验码函数代码

在发送按键状态帧之前,添加校验码函数如图12所示。

图12 添加校验码操作

编译并下载程序后,接上串口调试助手,可以看到STM32串口发送按键状态数据帧如图13所示。如图中所示,当按键K3按下时,STM32发送“6MK3D45”,其16进制数据为“36 4D 4B 33 44 34 35 0D 0A”,0x36+0x4D+0x4B+0x33+0x44=0x0145,保留一个字节则为0x45。0x45表示为两字节ASCII码,就是字符’4’和字符’5’,即对应“6MK3D45”最后两个字符。由此可知,按键状态发送功能完成。

图14 亮灯命令接收状态转换图

图15 串口接收中断程序1

图16 串口接收中断程序2

编译并下载程序,接上串口调试助手。如图17所示,在调试窗口中选中“HEX发送”,然后在下方的发送行填入字符串“36 4D 2B 31 00 00 0D”。点击“发送”按钮则可以看到接收栏中显示“OK!”字符串。在此,校验码0x00 0x00没有任何意义,只是占个位置。

图17 串口调试助手发送数据

接下来,在main函数之前添加接收数据校验函数如图18所示。

图18 接收数据校验函数

修改串口接收中断中的帧尾回送OK字符串程序行,如图19所示。为了看到显示效果将main函数中的流水灯部分代码注释掉,如图20所示。

图19 帧尾校验功能代码

图20 main函数注释流水灯代码

编译成功并下载程序后,接上串口调试助手,如图21所示。在调试窗口下方的发送行中填入发送字符串“36 4D 2B 31 00 00 0D”,选中“HEX发送”,点击发送按钮后可以看到接收栏中显示“Err chk, DF, 00”字符串,表示正确的校验码应为字符’D’和字符’F’的ASCII码值。点击窗口中的“HEX显示”可以将接收栏中的字符串显示为16进制代码,从中可以找到字符’D’和’F’的ASCII码值为0x44和0x46,修改发送行字符串为“36 4D 2B 31 44 46 0D”,再次点击发送,结果如图21所示。要在实验板上看到效果,可以先发送灭灯命令“36 4D 2D 31 45 31 0D”,先将第一个灯关闭。然后再发送亮灯命令即可观察到灯的亮灭效果。由此可见STM32上的亮灯控制命令接收功能已经实现。

图20 发送错误的命令帧

图21 发送正确的命令帧

发送的亮灯命令帧,也可以不用HEX发送方式,例如点亮第一个灯,可以发送“6M+1DF”字符串(取消“HEX发送”选项,选中“发送新行”选项)。

相关主题