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

这篇具有很好参考价值的文章主要介绍了串口输出乱码问题的解决方法汇总(持续更新):。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

方法一:检查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个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

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

msp430f5529串口打印乱码,项目经验汇总,单片机,经验分享,个人开发,Powered by 金山文档

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

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

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; 
}; 

目前就遇到过这么几种常见(或不常见)的情况,后面会持续更新遇到的串口问题。文章来源地址https://www.toymoban.com/news/detail-785404.html

到了这里,关于串口输出乱码问题的解决方法汇总(持续更新):的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • K8s 生产环境问题汇总及解决方案(持续更新 ing)

    目录 一、前端页面显示 503 Service Temporarily Unavailable 问题背景 解决方案 原理 二、Dockfile 构建镜像失败:When using COPY with more than one source file, the destination must be a directory and end with a /  问题背景 解决方案 原理 三、前端页面显示 502 Bad Gateway 问题背景  解决方案 原理 时间:2

    2024年02月02日
    浏览(39)
  • Sigrity常见问题解决方法(持续更新)

    错误信息如下: 该问题是因为Mesh设置的过大,导致via和note在同一个mesh网格上存在粘连 解决方法是:将mesh进行auto设置 在仿真时,为了减小计算量,加快仿真速度,一般需要对所仿真的部分进行切割。对于speedem来说,切割主要是用的就是以下几个工具 其中: 用于绘制切割

    2023年04月18日
    浏览(53)
  • 关于ESP8266串口输出中文时出现乱码的解决方案

    本人之前并没有c语言的项目编程经验,第一次使用ESP8266以及Eclipse编程环境,因此犯了诸多新手会犯的错误,但在网上查找相关问题时发现许多初级错误并不能完整的找到解决办法,因此希望将个人踩过的坑分享出来,如果有初学者遇到类似问题可以得到较快解决方案。 日前

    2024年02月03日
    浏览(54)
  • java spring boot 注解、接口和问题解决方法(持续更新)

    @RestController         是SpringMVC框架中的一个注解,它结合了@Controller和@ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染 @Controller         是Spring Framework中的注解,用于

    2024年02月06日
    浏览(55)
  • Hyperledger Fabric问题汇总(持续更新)

    Ubuntu 20.04 Hyperledger Fabric 2.3.3 SDK对应的Go 1.17.5 链码对应的Go 1.18 Fabric-sdk-go 1.0.0 Docker 20.10.12 Docker-Compose 2.11.2 调用命令: peer chaincode invoke -o localhost:7050 – ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts

    2023年04月15日
    浏览(45)
  • 逆向效率提升工具与方法汇总(持续更新...)

    油猴插件,可以把它理解为一个脚本,相当于给浏览器添加一些新功能。在逆向时我一般会用它来hook逆向参数位置,大家可以直接在浏览器应用商城搜索下载,或者进入官网下载,具体使用文档可以参考此文章 最强浏览器插件:油猴脚本的安装及使用教程 SwitchyOmega是一款在

    2024年02月03日
    浏览(80)
  • Nginx 报错问题汇总(持续更新ing)

    目录 一、nginx: [emerg] invalid number of arguments in \\\"include\\\" directive in C:Program Filesnginx-1.15.4/conf/nginx.conf:61 总结: 二、nginx: [error] OpenEvent(\\\"Globalngx_reload_2152\\\") failed (5: Access is denied) 解决方案: 三、nginx: [emerg] unknown directive \\\"stream\\\" in /etc/nginx/nginx.conf:13 问题原因 解决办法 时间:2022-1

    2024年02月05日
    浏览(45)
  • Docker安装MinIO遇到的问题汇总——持续更新中

    本文章记录作者使用Docker安装MinIO过程中遇到的所有问题, 将持续更新 ,如果你在使用Docker安装MinIO过程中遇到了一些问题,但是本文没有记载,你可以直接在本文评论区贴图、或打字描述,这样大家都能看到,可以给你一些建议,从而不断完善,让后来者少走更多的弯路,

    2024年02月04日
    浏览(44)
  • 北邮22级信通院数电:Verilog-FPGA(1)实验一“跑通第一个例程” 过程中遇到的常见问题与解决方案汇总(持续更新中)

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 问题一:Verilog代码没有跑通  报错信息: 错因分析: 问题二:已连

    2024年02月07日
    浏览(64)
  • 解决VSCode输出框中文乱码问题

    在使用VSCode进行开发过程中,有时候会遇到输出框中显示的中文乱码问题。这可能是由于编码设置不正确或缺少相应的字体支持导致的。以下是一些解决方法,供您尝试解决这个问题。 方法一:更改VSCode的编码设置 打开VSCode,并在顶部菜单中选择“文件”(File)选项。 在下

    2024年02月03日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包