最近用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;

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

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

stm32串口发送数据的配置,以及通过串口发送结构体数组总是多一个00字节的问题相关推荐

  1. C语言试题五十二之学生的记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组a中,请编写函数fun,它的功能时:按分数的高低排列学生的记录,高分在前。

    1. 题目 请编写一个函数void function(Student a[], int n),其功能时:学生的记录由学号和成绩组称个,n名大学生得数据已在主函数中放入结构体数组a中,请编写函数fun, ...

  2. c语言 由函数组成的数组,学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的_考题宝...

    学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是按分数的高低排列学生的记录,低分在前. 注意:部分源程序给出如下. 请勿改动主函数main和其 ...

  3. C语言编程>第十二周 ③ 已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数。

    已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中.请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分).已给出函数的首部,请完成该函 ...

  4. C语言编程>第十三周 ⑧ 已知学生的记录由学号和学习成绩组成,M名学生的数据已存入stu结构体数组中。请编写函数fun,该函数的功能是:

    例题:已知学生的记录由学号和学习成绩组成,M名学生的数据已存入stu结构体数组中.请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分).已给出函数的首部, ...

  5. STM32(HAL库)模拟车库进出系统—按键/结构体数组

    目录 一.情况说明 二.Cube_MX配置设置 1.首先查看电路原理图: 2.配置Cube_MX: 三.代码详情 1.按键消抖: 2.串口通信及结构体数组储存 一.情况说明 本次实验代码只有重要部分, ...

  6. NumPy-快速处理数据--ndarray对象--多维数组的存取、结构体数组存取、内存对齐、Numpy内存结构...

    本文摘自<用Python做科学计算>,版权归原作者所有. 上一篇讲到:NumPy-快速处理数据--ndarray对象--数组的创建和存取 接下来接着介绍多维数组的存取.结构体数组存取.内存 ...

  7. C语言编程题—结构体—设计程序,已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数 fun:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分

    4 C语言编程题--结构体 **设计程序,已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中.请编写函数 fun,函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有 ...

  8. 怎么删除结构体数组中的一组数据_数据结构-栈

    数据结构-栈 1)栈的定义. 栈是只能通过访问它的一端来实数据存储和检索的一种线性数据结构,逻辑结构和线性表相同.特点在于运算有所限制:即主要特征是"后进先出"(先进后出). 在栈 ...

  9. linux文件编程(3)—— main函数传参、myCp(配置成环境变量)、修改配置文件、整数和结构体数组写到文件

    参考:linux文件编程(3)-- 文件编程的简单应用:myCp.修改配置文件 作者:丶PURSUING 发布时间: 2021-04-09 23:45:05 网址:https://blog.csdn. ...

最新文章

  1. 如何使用wink框架_如何解决Wink Hub的Z-Wave连接问题
  2. java 根据时间范围自动算间隔_Java根据开始时间结束时间计算时间间隔 x年x月x日...
  3. Flex学习笔记(2)——使用ActionScript脚本
  4. go restful 安全_Go语言构建 RESTful Web 服务
  5. 《CATIA V5 从入门到精通(第二版)》——2.3 操作草图(Operation)
  6. 关于类微博的timeline的设计思考
  7. 【MongoDb入门】15分钟让你敢说自己会用MongoDB了
  8. Linux快速构建apache web服务器
  9. 【2016北京集训】魔法游戏
  10. 2020线性代数辅导讲义练习答案
  11. 【Godot】Godot 插件制作流程
  12. 启动react项目报找不到文件的错误
  13. 【Java基础】· 面向对象编程(下)习题详解
  14. Flutter安装后出现HTTP host not reachable.
  15. 无法打开登录所请求的数据库 xxx。登录失败。用户 'AAA' 登录失败。
  16. python篮球-python画篮球
  17. error:jump to case label [-fpermissive]
  18. python英雄联盟脚本是什么_Python3爬取英雄联盟英雄皮肤大图实例代码
  19. 电脑内存条C14和C16的区别是什么?
  20. Application Log--使用BAL_DSP_LOG_DISPLAY展现日志

热门文章

  1. 机械革命x6ti拆机教程
  2. 基于KT6368A芯片开发SOP8蓝牙自拍杆方案记录总结
  3. QT和C++面试总结
  4. linux软连接解决文件目录空间不足的问题
  5. 【SIFT,FPGA】基于FPGA的图片sift算法,图像的配准融合在上位机上实现
  6. 【签名验证】WEB API 增加方法签名验证(包含文件上传功能)
  7. C# 倍福ADS带数组成员的结构体数组通信
  8. Xstart Insatll And Usage
  9. 用Python Turtle 画可爱的熊猫
  10. 签署《目标承诺书》,没完成目标,厚着脸皮不离职是否可行