点击上方「嵌入式大杂烩」,选择「置顶公众号」第一时间查看编程笔记!

平时使用串口打印出现乱码的绝大部分原因是串口波特率没对。那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下波特率的概念。

什么是波特率、比特率?

  • 比特率(Bitrate)表示每秒钟传输的二进制位数,单位为比特每秒(bit/s)。

  • 波特率(Baudrate)表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标。

  • 码元是通讯信号调制的概念,通讯中常用时间间隔相同的符号来表示一个二进制数字,这样的信号称为码元。

常见的通讯传输中,用 0V 表示数字 0, 5V 表示数字 1,那么一个码元可以表示两种状态 0 和 1,所以一个码元等于一个二进制比特位,此时波特率的大小与比特率一致。

如果在通讯传输中,有 0V、2V、 4V 以及 6V 分别表示二进制数 00、 01、 10、 11,那么每个码元可以表示四种状态,即两个二进制比特位,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。

因为很多常见的通讯(比如串口通讯)中一个码元都是表示两种状态,所以大家常常直接以波特率来表示比特率 。

串口通讯协议

在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其数据帧组成如下:

下面我们来实际验证一下其数据帧是不是真的是这样的。编写如下代码:

代码很简单,就是使用串口不断地往外发数据0xAA(当然发送其它数据也是可以的)  。我们的串口配置如下:

我们可以使用示波器或者逻辑分析仪抓取实际信号看看数据是不是符合上面的帧格式。这里,我们使用逻辑分析仪抓取USART1的发送信号线(TX)

从实际结果中我们可以看到的确是按帧格式来发的。这里可能会有人有疑问,上面那个数据帧的图片中有个空闲状态,这个又是什么呢?空闲、空闲,当然是没有在发数据时候的状态呀,我们把我们的代码改为:

在初始化完成之后只发送一次0xAA,逻辑分析仪抓到的数据为:

可见,空闲状态是个高电平。在上一个的范例中,我们一直在while循环中发送数据0xAA,所以就没有空闲状态。

在这个实验中我们需要知道的是两个点是:

  • 串口发送数据是低位先发的。我们单片机发0xAA(10101010B),所以逻辑分析仪抓到的有效数据是01010101B

  • 单片机的串口使用的是TTL电平,为正逻辑电平信号。逻辑分析仪抓到的数据0对应着实际电压0~0.5V,数据1对应着实际电压2.4V-5V

经常与TTL电平标准做对比的是RS-232电平标准,如:

常见的电子电路中常使用 TTL 的电平标准,理想状态下,使用 5V 表示二进制逻辑 1,使用 0V 表示逻辑 0;而为了增加串口通讯的远距离传输及抗干扰能力,RS-232电平标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。

在旧式的台式计算机中一般会有 RS-232 标准的 COM 口(也称 DB9 接口)  :

在这个示例程序中,我们设置的串口波特率为115200bps。在串口通讯中,码元只用1个二进制数来表示(即只有0 和 1两种状态),所以波特率与比特率在数值上是相等的。

而比特率表示的是每秒钟传输的二进制位数,那我们知道传一位数据的时间岂不是就可以反推出波特率是多少了吗?从逻辑分析仪中,我们可以知道发送一位数据的时间如下:

发送一位数据的时间大约为8.667us,所以1秒钟发送多少位数据是可以算出来的:

算出来的波特率为115380bps,与115200bps很相近。最终肯定是有一定的误差,这个误差产生的原因包括逻辑分析仪的质量及我们的测量环境等等因素。但是这个误差也是在允许的范围内的,可以看看串口助手接收到的数据是不是正确的:

可见,数据接收正确,也就是波特率对的上了。

串口波特率对不上怎么解决?

在实际中。我们可能会遇到这样的情况,代码里配置的波特率与串口助手上设置的波特率一样了,但还是出现异常情况。

异常情况如我们往串口助手发送字符串,串口助手上本该显示的字符串出现了乱码。或者我们往串口助手发送一个数据,发现数据移位了。

出这种情况大多是波特率对应不上,我们就得自己检查我们的底层文件了,代码中的某个与波特率计算相关的值(时钟)与实际不匹配了,就会出现这样的现象,比如之前我的一位同事就遇到这样的情况就是这个原因导致的。

我们用STM32的时候,一般都是使用外部晶振,比如STM32F103系列,可输入的外部晶振的范围是4~16MHz

经验值往往是8MHz,而且一般的demo工程底层代码里默认的也是设置为8MHz,比如:

但是,如果实际晶振贴的不是8M的话,就出问题了(比如串口波特率就不正确了)。追根溯源,串口波特率是配进USART_Init函数中的,打开这个函数:

计算串口波特率需要一个apbclock变量,而这个值得来源从RCC_GetClocksFreq函数来,再打开这个函数:

所以要注意的是,HSE_VALUE这个值要与实际做对应。

遇到这种问题找谁说理去。。经验就是不断采坑不断积累的一个过程,早点遇到坑可能也是一件好事。像类似底层的问题很少遇到,但是一旦遇到那就得比较棘手的问题了,需要很有耐心地去查找。

能用稳定的芯片是一件很幸福的事情,用不稳定、不成熟的芯片的时候,那个才是真的难啊,遇到问题真是让人怀疑人生啊,软件、硬件、芯片都可能有问题。。。

以上就是本次的笔记分享,希望各位喜欢!如有错误欢迎指出,谢谢!

参考资料:野火教程文档。

最后

原创不易,如果觉得文章不错,转发、在看,也是我们继续更新得动力。

猜你喜欢:

STM32的ISP下载的原理是什么呢?

RT-Thread Studio的使用体验:真香!

物尽其用,分享一个很棒的工具

自定义协议的这些典型例子你会了吗?

在公众号聊天界面回复【1024】,即可免费获取大杂烩资料包,包括但不限于:C/C++、Python、Linux、单片机、FPGA等。

c++实现sscom串口助手循环发送_串口通讯你真的会了吗?不妨看看这些经验相关推荐

  1. 野火串口助手协议发送文件通讯协议——XMODEM协议——YMODEM协议

    野火串口助手协议发送文件通讯协议 修订历史 日期 版本 更新内容 2020/6/22 0.0.1 首次发布 XMODEM协议 上位机是现实了XModem-CRC16和XModem-1K; XModem ...

  2. 【C#】基础篇(2) C#实现串口助手,C#扫描串口

    大家好,我是皮皮猫吖! 每文一言:愿新年,胜旧年! 本篇文章: 主要是关于C#制作简单的串口助手,实现串口之间收发数据.本篇文章制作的串口助手存在一个中文乱码问题,后期文章会解决这个问题.[后期文章: ...

  3. 友善串口助手与VSPD模拟串口传输信息

    这几天在研究串口之间数据连通,发现友善串口助手和VSPD这两个软件可以进行串口信息之间的模拟调试. 1. 配置VSPD的虚拟串口 VSPD可以快速在本机上创建虚拟的串口,供使用者进行串口的调试 2. ...

  4. python 串口助手 简书_[pyqt5-pyserial实现一个串口调试工具记录]

    遇到的问题 1. 程序结构 创建一个主窗口的类:在里面主要实现窗口UI的绘制,并定义一些槽函数接口 创建主框架类:该类继承自主窗口类,并实现主窗口类中的槽函数,在该类中创建串口接收线程 串口接收线程类 ...

  5. 串口助手-简易串口助手-带时间戳的串口助手-极简串口助手-V1.5 自动保存配置参数 能显示收发时间方便调试

    1.串口助手 2.带时间戳的串口助手,每次收发指令带上了时间戳,方便调试 3.极简串口助手 4.简单易用 高速稳定 5.每次修改的参数都能自动保存,免去了重复配置的工作 软件下载地址:https:// ...

  6. python 串口读取地磅仪表_串口读取称或是地磅数据

    论坛里经常碰到称或是地磅对接的问题,想当年我也是一路问过来啊,自动一人在客户那磨练下就知道怎么做的了,今天总结下吧.我接触的称或是地磅都是串口输出数据,貌似都是串口输出(可能有别的我没接触到的). 1 ...

  7. sever串口wifi拓展板_串口Wifi模块的工作原理和详细功能介绍

    在无线网络领域里面,无线wifi是最火的名词.对于串口wifi模块的工作原理是什么呢?串口wifi模块又有什么功能呢?wifi方案设计远嘉科技给大家讲解有关串口wifi模块的工作原理,以及详细功能介绍 ...

  8. 两个串口通信助手之间通信_串口通信原理

    LC串口通信原理 PLC各型主机均内建2个通信接口的标准配置,即一个RS232和一个RS485通信接口,其RS232接口主要用于上下载程序或用来与上位机.触摸屏通信,而RS485接口主要用于组建使用R ...

  9. qt tcp不可以循环发送_不知道低温冷却液循环泵的冷却剂选择和更换条件?这这里可以找到答案...

    低温冷却也循环泵的冷却液更换并没有固定的期限,但我们可以根据低温冷却液循环泵的使用频率和仪器的使用状态来决定.冷却液可以定期排放然后经抽滤后重复使用,通常建议抽滤3~5次后更换.除此之外,如果冷却液被 ...

最新文章

  1. Ntop性能提升方案
  2. 心得体悟帖---13、编程和学习同时进行
  3. 深度学习框架的比较(MXNet, Caffe, TensorFlow, Torch, Theano)
  4. python读取文件路径报invalid_关于Python读取文件的路径中斜杠问题
  5. 57岁博士,第三次出征太空...
  6. 转android项目开发 工作日志 2011.10.8--toast消息框使用
  7. [转贴] 电脑族请关爱自己的身体--远离“电脑病”完全实用手册
  8. thinkphp页面请求时间超过40S报404错误解决办法
  9. 微软小冰迎来了一个新姐妹:“欣小然”
  10. ofstream 二进制 文本_C/C++读写文本文件、二进制文件的方法
  11. 样本均值的抽样分布_抽样分布样本均值
  12. linux俄罗斯方块游戏
  13. 人人网,给我个“上”你的理由吧?
  14. python get函数用法_详解python中get函数的用法(附代码)
  15. 实验4 FIR数字滤波器设计及软件实现
  16. 金蝶生成凭证模板_金蝶精斗云产品的优势
  17. 防疫新装备友倍康血氧仪
  18. Tomcat——配置Tomcat的服务端口(默认端口8080)
  19. 安装tensorflow
  20. 软考高级系统架构设计师所需要的所有资料,教程、大纲、整体 (清华版本)

热门文章

  1. Delphi字符串函数Delete
  2. 安装python模块时出现:error: Setup script exited with error: command 'gcc' failed with exit status 1...
  3. [转] MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
  4. Azure Backup和Azure Site Recovery的区别是什么
  5. [UE4]虚幻引擎的C++环境安装
  6. django_4数据库3——admin
  7. centos 6.5安装VMware tools
  8. 【转】指令周期,机器周期,时钟周期,振荡周期有什么关系
  9. 人生第一份Offer,国企、私企、外企该选择哪一个?
  10. 一根29cm长的尺子,只允许在它上面刻7个刻度。