完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
最近用stm32编写串口发送程序,在硬件方面需要做如下准备:
1.stm32开发板,这里我的是stm32f030f4p4开发板,单片机的串口发送的引脚为PA9-TX,PA10-RX。 2.为了调试串口,我们需要用到串口调试助手,实现单片机的串口和串口助手的通信。 3.如何实现软件串口助手和硬件单片机的连接呢,我们还需要一个 USB-TTL,即 没有串口的 电脑,用 USB 接口 与 TTL 电平的 设备相连接。 4.所以只要 串口助手连接上USB接入后的COM口,TTL输出的电平连接上MCU的串口引脚就行了。 需要注意的是:MCU RX ------ TTL TX 串口发送,单片机接收 MCU TX ------- TTL RX 单片机发送,串口接收 千万别别错了,否则怎么都调不出数据。 剩下的就是编写单片机的串口程序了,由于我串口的通信协议是modbus,是按照一定的格式来的,因此我采样的结构体数组来存放单片机串口接收和发送的数据。 但是这样定义我就忽略了一个非常重要的问题,导致我在调试串口的时候花费了好几天,下面我会具体说到 用的时候在函数里面声明一下 void send_data_to_mdb(u8* str, u8 len) { u8 i; for(i = 0; i < len; i++) { USART_SendData(USART1, str ); while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } } 这样将组包好的命令通过串口发送出去,正常组包好的数据应该为:10 04 02 00 03 05 32,可是我在串口助手里面接收到的数据总是多一个字节00,这让人百思不得解,而且在单步DEBUG的时候,发现寄存器的值存的是对的,可是一发送出来就错了。 终于在向大佬们请教后,发现了问题的所在,是的,是字节对齐的问题。stm32做串口或网络传输数据时,经常需要用结构体定义帧格式。如果按照keil默认的对齐方式(4字节对齐),经常会出现结构体中补零的问题,造成帧格式错误。所以,在定义结构体类型时,最好把结构体对齐方式改为1字节对齐,防止出错。 也就是说,单片机是32位的,结构体的数据需要对齐,否则就会被补零。 #define BYTE_ALIGN __attribute__ ((packed)) typedef struct { u8 node; u8 cmd; u8 bytelen; u16 data; u16 crc; }BYTE_ALIGN mdb_send_t; 从新对齐后,串口接收的数据就成功啦。 还得多了解一下数据是如何在单片机里存储的。 |
|
|
|
只有小组成员才能发言,加入小组>>
3316 浏览 9 评论
2995 浏览 16 评论
3494 浏览 1 评论
9060 浏览 16 评论
4088 浏览 18 评论
1180浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 03:54 , Processed in 0.988026 second(s), Total 45, Slave 37 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号