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

本文讲述了在使用STM32F030F4P4开发板进行串口通信时遇到的结构体数组发送数据时多一个00字节的问题。通过排查发现,该问题是由于32位单片机的字节对齐导致的。解决方法是将结构体对齐方式改为1字节对齐,以避免因数据补零引发的帧格式错误。了解单片机数据存储方式对于避免此类问题至关重要。
摘要由CSDN通过智能技术生成

最近用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,是按照一定的格式来的,因此我采样的结构体数组来存放单片机串口接收和发送的数据。

但是这样定义我就忽略了一个非常重要的问题,导致我在调试串口的时候花费了好几天,下面我会具体说到

用的时候在函数里面声明一下

  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
当然可以,请看下面的代码示例: 发送函数: ```c #include "stm32f103.h" void USART_SendArray(uint8_t* data, uint16_t length) { for (uint16_t i = 0; i < length; i++) { while (!(USART1->SR & USART_SR_TXE)); // 等待发送缓冲区为空 USART1->DR = data[i]; // 将数据写入发送寄存器 } } ``` 接收函数: ```c #include "stm32f103.h" #define BUFFER_SIZE 100 void USART_ReceiveArray(uint8_t* buffer, uint16_t length) { uint16_t count = 0; while (count < length) { if (USART1->SR & USART_SR_RXNE) { // 接收缓冲区非空 buffer[count++] = USART1->DR; // 读取接收寄存器中的数据 } } } ``` 请注意,以上代码示例假设你使用的是STM32F103系列的芯片,并且串口1用于通信。你可以根据实际情况进行调整。 使用这两个函数时,你需要提供一个数组作为参数,并指定要发送接收字节数。例如,要发送一个包含10个数字的数组,可以如下调用发送函数: ```c uint8_t sendData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; uint16_t sendLength = sizeof(sendData) / sizeof(sendData[0]); USART_SendArray(sendData, sendLength); ``` 接收函数的用法类似,你需要提供一个数组作为接收缓冲区,并指定要接收字节数。例如,要接收10个字节的数据到一个名为receiveData的数组中,可以如下调用接收函数: ```c uint8_t receiveData[10]; uint16_t receiveLength = sizeof(receiveData) / sizeof(receiveData[0]); USART_ReceiveArray(receiveData, receiveLength); ``` 这样,receiveData数组就会被填充上接收到的数据。 希望以上代码对你有帮助!如有其他问题,请随时提问。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值