串口输出乱码问题的解决方法汇总(持续更新):

2023-05-16

平时工作中程序员在调试时总会用到串口打印数据以及一些标志位查看程序是否出现问题。但是在使用时总会遇到各种各样的问题,最常见的就是输出乱码问题(指的是有收到数据但数据显示的是一堆不认识的汉字或字符),下面就我遇到过的串口乱码问题的相关几种解决方法:

方法一:检查GND线连接情况

电子系统接地非常重要,接地不当往往导致电子系统不能稳定工作。

在串口通信时地线是必须接的,比如串行数据通信接口标准(RS—232)的3线TX、RX、GND。虽然在使用RS-485总线工业标准时接两线TX、RX也能实现通信,但接Gnd 有利抑制干扰。RS-485的前身RS—422也一样。

一般建议在使用串口通信时需要把GND连接上,尤其是在长距离传输时。

方法二:查看串口助手和源程序就传输协议设置是否一致

串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。在使用串口时这些参数必须要保持一致。下面大致介绍一些这些参数的意义:

一、波特率

波特率(bandrate)是衡量符号传输速率的参数,指的是串口通信的速率,也就是串口通信时每秒钟可以传输多少个二进制位。比如串口常用波特率9600指的是串口每秒钟可以传输9600个二进制(传输一个二进制位需要的时间是1/9600秒,也就是104us)。

注意波特率和比特率的区别:

情形一:一个信号码元有且仅有两种状态:0或1

此时每种状态含一位二进制数(0或1),在这种情况下比特率值=波特率值

情形二:一个码元有4种不同的状态:01、11、00或10

此时每种状态含两位二进制数(00、01、10、11),在这种情况下比特率值=波特率值×2

以此类推可以得到:比特率=波特率 * 单个调制状态对应的二进制位数

二、数据位

数据位是衡量通信中实际数据的参数。当计算机发送一个信息包,实际的数据不一定是8位的(标准的值是6、7和8位),如何设置取决于你想传送的信息。

比如,标准的ASCII码是0~127(7位),扩展的ASCII码是0~255(8位)。如果数据使用标准 ASCII码,那么每个数据包使用7位数据;如果数据使用扩展 ASCII码,那么每个数据包使用8位数据(每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位)。

三、停止位

停止位是用于表示单个包的最后一位。典型的值为1,1.5和2位。

由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也相应越慢。

四、奇偶校验位

奇偶校验位是串口通信中在数据位后面加一位用于简单地检查数据发送是否有错。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。

对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

例如,如果传输的数据是011,那么对于偶校验(校验位为0),则此时数据位 + 校验位的数据为:0110,保证逻辑高的位数是偶数个。如果是奇校验(校验位为1),则此时数据位 + 校验位的数据为:0110,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

在实际使用中要确保这四个参数在源程序和助手设置是一致的。

方法三:在源程序中查看主频设置是否有误

上面两个是一般会出现乱码的原因,除此之外在源程序里面也会出现一些大意操作导致串口乱码(最难且不容易想到的出错点)。我目前尚未遇到过这种情况导致串口乱码的但在不少大佬的博客和文章中看见有遇到过,这里也引用下来大家可以看看是否能解决你的串口乱码问题。

STM32F407系统时钟配置不准确导致串口发送数据乱码、定时器定时不准问题

https://blog.csdn.net/lqj11/article/details/108058008

stm32f407等芯片(HAL库)时钟频率修改(乱码)

https://blog.csdn.net/bulefire2009/article/details/119633701?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-119633701-blog-108058008.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-119633701-blog-108058008.pc_relevant_recovery_v2&utm_relevant_index=2

方法四:Printf重定向函数

关于重定向导致数据输出乱码我遇到过几次,关于重定向引用一篇大佬的文章printf重定向原文链接:https://blog.csdn.net/RONG_YAO/article/details/115746940。这能解决大家关于重定向的一些疑惑。但我遇到过另外一种重定向导致输出乱码的情况。

在调试一个项目时一直出现乱码问题,虽然能接到数据但一直显示“IIIIIIIt”,看着不像乱码但与实际要显示的内容天差地别(不管输出的是汉字还是ASCII都一样),前面几个解决方法都检查过没有问题,但乱码现象依然没有改变。后面仔细研究源代码发现问题出在printf重定向上,不是没有添加重定向函数,而是添加了两个重定向函数(分别添加在了sys.c和usart.c中)

在sys.c函数中定义了一次:

#pragma import(__use_no_semihosting)                             
struct __FILE { 
    int handle; 
}; 

#if( defined  DEBUG)
int fputc( int c, FILE *f )
{
#if  DEBUG == Debug_UART0
  while( R8_UART0_TFC == UART_FIFO_SIZE );                        /* 等待数据发送 */
  R8_UART0_THR = c;                                               /* 发送数据 */
#elif DEBUG == Debug_UART1       
  while( R8_UART1_TFC == UART_FIFO_SIZE );                        /* 等待数据发送 */
  R8_UART1_THR = c;                                               /* 发送数据 */
#elif DEBUG == Debug_UART2       
  while( R8_UART2_TFC == UART_FIFO_SIZE );                        /* 等待数据发送 */
  R8_UART2_THR = c;                                               /* 发送数据 */
#elif DEBUG == Debug_UART3       
  while( R8_UART3_TFC == UART_FIFO_SIZE );                        /* 等待数据发送 */
  R8_UART3_THR = c;                                               /* 发送数据 */
#endif
  return( c );
}
#endif

在usart.c中又重复添加了一个重定向函数:

#pragma import(__use_no_semihosting)                             
struct __FILE { 
    int handle; 
}; 


FILE __stdout;          
void _sys_exit(int x) 
{ 
    x = x; 
}

int fputc(int ch, FILE *f)
{      
    while(R8_UART1_TFC != UART_FIFO_SIZE)
    {
            R8_UART1_THR = ch;
    }       
    return ch;
}

有人会觉得两次重定向了程序应该会报错,但不好意思程序真没报错。将sys.c中下面这段代码删除后再测试串口收发数据正常。

#pragma import(__use_no_semihosting)                             
struct __FILE { 
    int handle; 
}; 

目前就遇到过这么几种常见(或不常见)的情况,后面会持续更新遇到的串口问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口输出乱码问题的解决方法汇总(持续更新): 的相关文章

  • OpenCore-EFI-配置模版(持续更新)

    前言 随着OpenCore日臻完善 xff0c 将在以后会更多的用于黑苹果的安装 同时 xff0c 在各位大佬的大力支持与推广 xff0c 各种入门 xff0c 进阶教程的推出 xff0c OpenCore已经从神界降临到人间 逐渐为普通黑
  • 关于python部分包离线安装所需的依赖包列表...(持续更新)

    x1f4d6 写在前面 xff0c 由于工作原因 xff0c 平时需要将python的环境部署在离线环境内 xff0c 虽然有anaconda等优秀的第三方集成环境 xff0c 不过我平时用的爬虫却没有 xff0c 所以写了这个文章记录下所
  • Linux远程管理常用命令(超全超详细)【持续更新】

    目录 1 shutdown命令 2 ifconfig命令 3 uname命令 4 uptime命令 5 free命令 6 who命令 7 last命令 8 history命令 9 ping命令 10 chmod 命令 11 chown 命令
  • YOLOv5总结--持续更新

    1 Data Augmentation 数据增强操作可以看做是一种正则化方法 xff0c 防止过拟合 v4数据增强 创新使用了图像遮挡 Random Erase随机删除一个矩形区域通过均值填充 Cutout随机删除一个矩形区域通过0填充 M
  • ROS中安装配置并使用VScode(持续更新)

    1 为什么使用VScode VSCode 全称 Visual Studio Code xff0c 是微软出的一款轻量级代码编辑器 xff0c 免费 开源而且功能强大 它支持几乎所有主流的程序语言的语法高亮 智能代码补全 自定义热键 括号匹配
  • 解决的问题记录(持续更新)

    1 Ubuntu Server2020 4 树莓派WiringPi的安装与编译 链接 http i lckiss com p span class token operator 61 span span class token number
  • openstack-neutron-OVS agent(持续更新)

    概述 ML2Plugin的主要工作是管理虚拟网络资源 xff0c 保证数据正确无误 xff0c 具体物理设备的设置则由Agent完成 L2Agent通常运行在Hypervisor xff0c 与neutron server通过RPC通信 x
  • 2023Java最新真实面试题汇总(持续更新)

    一 面经 适当夸夸面试官 xff08 或所在公司 xff09 不会有坏处 如果某个问题完全不会 xff08 或稍微懂点 xff09 xff0c 直接承认 xff08 或略作回答 xff09 并把话题引导向类似话题 xff08 redis集群
  • Qt调试问题记录(持续更新)

    目录 前言调试平台调试记录configure报C 43 43 11缺失g 43 43 编译选项不支持 前言 本人调试Qt所遇到的问题均会记录在此 xff0c 方便回溯 调试平台 Qt版本 xff1a 5 12 11Host PC xff1a
  • 计算机视觉中的编码-解码器结构总结(持续更新)

    文章目录 NLP领域的编码解码器结构机器学习中的编码器自动编码器 视觉领域中的编码解码器结构 编码器 解码器结构 xff1a 编码器原始输入信号转化为中间格式 xff0c 然后解码器将中间格式转化为目的信号 在NLP领域的机器翻译 摘要提取
  • 超好用的网站推荐(持续更新)

    1 在线学习 1 1 网课学习 网易公开课 链接 xff1a https open 163 com 中国大学MOOC 链接 xff1a https www icourse163 org 哔哩哔哩 链接 xff1a https www bil
  • 计算机视觉领域常用数据集汇总(持续更新)

    入坑CV两年以来收藏的数据集网址或博文 xff0c 与大家分享 xff0c 欢迎评论区补充 网址领域类型人脸数据集大全人脸识别 检测转载DeepFahion衣服属性 类型识别 xff0c 关键点检测官网coco物体检测官网IMDB WIKI
  • VSCode上的Git使用手记(持续更新ing...)

    诸神缄默不语 个人CSDN博文目录 本笔记是我想要学习如何将本地文件发布到GitHub上时开始看廖雪峰的Git教程 xff0c 然后打开了VSCode xff0c 发现VSCode上面集成的Git辅助使用功能真的很好用 基本上到了不用看教程
  • docker源码分析(1)(持续更新)

    docker源码分析 xff08 1 xff09 xff08 持续更新 xff09 daemondocker DaemonClient的启动内部函数分析newAPIServerConfigloadListenersinitContainer
  • Redis博客、教程学习资料汇总(持续更新)

    在这篇博客中 xff0c 总结一下写过的博客和一些好的学习资料 博客 xff1a Redis基础 xff0c Linux下安装Redis和hredis xff0c C 43 43 调用Redis xff0c Redis中字符串设计 Redi
  • ESP8266初学(一) 遇问题大全及解决方案(持续更新)

    最近开始学习wifi模块 xff0c 谁知一开始用PC连接调试wifi模块就遇到了很多问题 一 输入指令后没有反应 刚起步就头大 快乐地接好各种接口各种线 xff0c 连上电脑发现它冒蓝光光了 xff0c 好耶 xff01 然后兴致勃勃打开
  • Make 命令(持续更新)

    一 背景 Make是最常用的构建工具 xff0c 诞生于1977年 xff0c 主要用于C语言的项目 但是实际上 xff0c 任何只要某个文件有变化 xff0c 就要重新构建 的项目 xff0c 都可以用Make构建 make只是一个根据指
  • APM(pixhawk)飞控疑难杂症解决方法汇总(持续更新)

    原文链接 xff1a http www nufeichuiyun com p 61 28
  • 记flume部署过程中遇到的问题以及解决方法(持续更新)

    项目需求是将线上服务器生成的日志信息实时导入kafka xff0c 采用agent和collector分层传输 xff0c app的数据通过thrift传给agent xff0c agent通过avro sink将数据发给collector
  • QCC300x笔记(3) -- QCC3007开发调试经验

    哈喽大家好 这是该系列博文的第三篇 篇 lt lt 系列博文索引 快速通道 gt gt 写在前面 这篇博客主要记录 在使用QCC300x平台中所遇到的问题以及解决方法 会不定时更新 1 使用的堆栈空间大小超出或者全局变量超出 会报以下错误

随机推荐

  • Jetpack-LiveData原理补充

    本篇主要对上篇分析LiveData时遗留的问题进行补充 xff0c 阅读本文需要实现对LiveData的原理有一定的了解 xff0c 如果不了解可以参考上一篇文章 xff1a Jetpack LiveData LiveData粘性事件 可以
  • postgre删除数据表重复数据

    select distinct into t sup supcomm copy from t sup supcomm drop table t sup supcomm select into t sup supcomm from t sup
  • postgre——to_date使用

    s date 61 to date to char date in 39 yyyy MM dd 39 39 yyyy MM dd 39 date in为time类型 xff0c s date为date类型
  • 旧电脑通过转接卡安装nvme固态硬盘无需修改bios即可用旧SATA硬盘实现UEFI启动win10/11

    注意 xff1a 本文探讨的是支持UEFI启动的旧电脑 MBR启动个人感觉已经被淘汰 xff0c 作者不再做研究 主要材料 xff1a PCI E转M 2的转接卡 xff08 根据你旧电脑支持情况选择 xff09 支持NVME协议M 2接口
  • postgre——case、union、小计总计(GROUP BY ROLLUP)写法

    将几张不同表结构的数据全部合并在一起 xff0c 使用了case union xff0c 同时实现小计总计 小计总计使用的 GROUP BY ROLLUP函数 xff0c GROUP BY ROLLUP使用双括号将字段括起来 xff0c 是
  • postgre连接符

    一 逻辑操作符 xff1a 常用的逻辑操作符有 xff1a AND OR 和NOT 其语义与其它编程语言中的逻辑操作符完全相同 二 比较操作符 xff1a 下面是PostgreSQL中提供的比较操作符列表 xff1a 操作符 描述 lt 小
  • springmvc拦截器

    1 自定义的拦截器 publicclass FirstInterceptor implements HandlerInterceptor 实现这个接口并重写方法 lt 配置自定义的拦截器 gt lt bean class 61 34 com
  • springmvc异常处理

    1 64 ExceptionHandler 在 64 ExceptionHandler 方法的入参中可以加入 Exception 类型的参数 该参数即对应发生的异常对象 64 ExceptionHandler 方法的入参中不能传入 Map
  • SpringMCV运行流程及整合spring

    一 Spring整合SpringMVC 64 Service用于标注业务层组件 64 Controller用于标注控制层组件 xff08 如struts中的action xff09 64 Repository用于标注数据访问组件 xff0c
  • Mac 下 man 命令汉化

    brew install automake brew install opencc git clone https github com man pages zh manpages zh git cd manpages zh autorec
  • FTP配置多用户多目录多权限

    环境介绍 根据开发的需求 要求创建FTP服务器 xff0c 把前端和后端分开用不同的FTP账号 系统环境 centos 7 4 防火墙设置 systemctl stop firewalld service 停止firewall xff08
  • Process finished with exit code -1073740791 (0xC0000409)

    选择编辑配置 勾选这个 出来具体问题 RuntimeError Unsupported image type must be 8bit gray or RGB image 就是这个原因 然后我卡在这里 xff0c 现在都还没有解决这个问题
  • Centos 6.8升级Python2.6.6至2.7.8

    由于之前用Python 2 7版本写了一个脚本 xff0c 移植到新的环境之后 xff0c 由于CentOS自带的Python版本较低 xff0c 有些函数执行出错 本文介绍CentOS 6 8从自带的Pyhon版本是2 6 6升级到2 7
  • Windows Server取消登录需按Ctrl+Alt+Delete组合键

    通过远程软件频繁远程Windows Server会遇到Ctrl 43 Alt 43 Delete组合键无法进入输入用户和密码的界面 xff0c 导致机器并没死机但是想登录又没法输入密码 xff0c 记录下取消方法 xff1a 1 Windo
  • 安装 Ubuntu 22.04.1 LTS 桌面版(详细步骤)

    文章目录 前言 xff1a 安装 Ubuntu 22 04 1 LTS 的先决条件 一 下载 Ubuntu 22 04 1 LTS 安装介质 二 制作 Ubuntu 22 04 1 LTS 引导 U 盘 三 从 U 盘引导 Ubuntu 四
  • Windows Server 2016-重置目录还原模式密码

    目录还原模式 xff1a Directory Services Restore Mode xff0c 简称DSRM xff0c 又称目录服务恢复模式 是Windows域控制器的服务器安全模式启动选项 DSRM允许管理员用来修复或还原修复或重
  • 人的梦想 是不会结束的!

    文章目录 前言一 一年之约1 学习嵌入式2 探寻嵌入式之路 二 我的心跳1 奉劝2 行动人的梦想是永远不会结束的 xff01 前言 随着在程序员这条路上不断发展 xff0c 自己学得越多 xff0c 就会感觉自己学的东西有多渺小 下面就说说
  • 记一次centos系统下的串口登陆异常问题

    一 问题概述 在使用centos7 5版本系统时 xff0c 安装配置好官方原版桌面环境后 xff0c 发现通过串口登陆系统出现了问题 具体问题现象有两种情况 xff1a 第一次通过串口输入用户名后 xff0c 输入密码的第一字符 xff0
  • Android Studio中引入Kotlin

    安装Kotlin插件 从Android studio3 0开始我们已经全面支持Kotlin 我们不需要添加Kotlin插件 而在Android2 X xff0c 我们还是需要添加Kotlin插件 Setting gt Plugins中下载k
  • 串口输出乱码问题的解决方法汇总(持续更新):

    平时工作中程序员在调试时总会用到串口打印数据以及一些标志位查看程序是否出现问题 但是在使用时总会遇到各种各样的问题 xff0c 最常见的就是输出乱码问题 xff08 指的是有收到数据但数据显示的是一堆不认识的汉字或字符 xff09 xff0