stm32串口发送数据的配置,以及通过串口发送结构体数组总是多一个00字节的问题--已解决

STM32F030 专栏收录该内容
6 篇文章 0 订阅

最近用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[i] );   
        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;

从新对齐后,串口接收的数据就成功啦。

                

 还得多了解一下数据是如何在单片机里存储的。

 

 

 

  • 4
    点赞
  • 3
    评论
  • 24
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 3 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

ZL14ZM

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值