串口显示乱码的原因有哪些 串口显示乱码是不是受电源干扰

来源:科讯网

用ARM2103 给电脑发送信息,用串口高度精灵看,一直接收的都是错误码。

波特率 换了好几档 比如9600 4800 2400 1200(我用的晶振是 11M多点的那个) 等都试过 都是乱码 区别是一个乱码来得快 一个乱码来得慢 串口线 23 脚短接能正常的自收自发 下载到单片机的程序也没啥问题。

真的不知道,原因出现在哪里!

1.USB转串口的问题

解决方法:我曾用一个12块钱的那种U转串,出现过乱码,换一个好的就没事了

2.波特率不同步的问题

解决方法:两边设置的波特率的一样,会导致这样的问题

3.在通信波特率为 38400 时,通信正常,arm 板上解受到的数据(ascII码)显示正常。

但是当波特率为 115200 时,解受到的数据就出现乱码的现象!

解决方法:暂无

4.用ARM2103 给电脑发送信息,用串口高度精灵看,一直接收的都是错误码

解决方法: 我用的44b0曾经出现过显示乱码的问题,在超级终端上显示的;

后来才发现是在boot汇编程序里设置了主频为60M;但是在串口初始化时用的是40M,在c语言程序里忘记重新设定主频了

乱码很正常,因为是通讯嘛,硬件的接收当然要可能出现预料外的数据,比如,有些调制方式的Modem就是会必定产生乱码,足够强的电磁干扰信号也可能让数据出错。乱码是有的,但不存在“多余的”这样的概念,如果你觉得“多余”,那只是你通讯协议没制定好。

串口的协议,通常情况下格式是这样的:起始字(多字节),数据区长度(根据需要,一般是1或2字节),校验和(多字节),数据区(多字节)。

每个包都如此,起始字一般是全部正常通讯数据中不可能用到的字节序列组合,校验和一般采用CRC校验的为多(这样比较可靠,源代码在网上很多)。

对协议的接收分包工作,是个稍微复杂的编码工作(代码本身不复杂,你需要思维复杂点),你需要定义一个“接受状态”的标志值,每接一个字节变换一次状态值,它标志着你下一次将接收什么字节,比如:起始字字节1,起始字字节2,……,数据区长度字节1,数据区长度字节2,……,校验和字节1,校验和字节2……,数据区(已经进数据区了,因为已经知道长度,只积攒缓冲而已,一个标志就够)。积攒完数据区字节后,计算校验和,如果不符合前面协议给的结果,则将“接受状态”的标志值复位(将接收起始字字节1),从前面的起始字字节2开始(模拟接收)重复上面过程。以上这个过程需要你熟练编码操控二进制缓冲区。

有很多人把数据结构指针当发送缓冲,后面跟一个sizeof()就直接发出去;接收那端直接预期有多少字节数据,死等在那里;或者,按时间去接受(规定协议间要间隔若干秒),这些都是丝毫不懂通讯的胡作非为,早晚要出问题,如果你代码里有这些做法,推荐你早点把它们改过来。

对串口通讯的接收,实际上用计算机处理起来是这样的:串口是按位接收数据的,但PC机的底层硬件和软件已经能按标准协议规定把位缓冲并识别转换成字节了,不过,每收一个字节的时间远比PC机程序运行慢得多,因此,对你的程序而言,接收的数据,其实就是一串无限长的字节任意序列慢慢向你走来,你一次只能见到一个,任何一个字节都与其他字节没什么特殊地方,它们可能是数据包的一部分或几个数据包,也许有的是错的,甚至根本全是错的,这全靠你程序去分辨——在了解了这些实际的基础上,你才可以设计你的协议和程序。

标签: 电脑系统 移动储存 任务管理器 核心进程

推荐

财富更多》

动态更多》

热点