stm32串口通信协议简单教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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发送”选项,选中“发送新行”选项)。