串口接收到乱码什么原因
1个回答
展开全部
乱码很正常,因为是通讯嘛,硬件的接收当然要可能出现预料外的数据,比如,有些调制方式的Modem就是会必定产生乱码,足够强的电磁干扰信号也可能让数据出错。乱码是有的,但不存在“多余的”这样的概念,如果你觉得“多余”,那只是你通讯协议没制定好。
串口的协议,通常情况下格式是这样的:起始字(多字节),数据区长度(根据需要,一般是1或2字节),校验和(多字节),数据区(多字节)。
每个包都如此,起始字一般是全部正常通讯数据中不可能用到的字节序列组合,校验和一般采用CRC校验的为多(这样比较可靠,源代码在网上很多)。
对协议的接收分包工作,是个稍微复杂的编码工作(代码本身不复杂,你需要思维复杂点),你需要定义一个“接受状态”的标志值,每接一个字节变换一次状态值,它标志着你下一次将接收什么字节,比如:起始字字节1,起始字字节2,……,数据区长度字节1,数据区长度字节2,……,校验和字节1,校验和字节2……,数据区(已经进数据区了,因为已经知道长度,只积攒缓冲而已,一个标志就够)。积攒完数据区字节后,计算校验和,如果不符合前面协议给的结果,则将“接受状态”的标志值复位(将接收起始字字节1),从前面的起始字字节2开始(模拟接收)重复上面过程。以上这个过程需要你熟练编码操控二进制缓冲区。
有很多人把数据结构指针当发送缓冲,后面跟一个sizeof()就直接发出去;接收那端直接预期有多少字节数据,死等在那里;或者,按时间去接受(规定协议间要间隔若干秒),这些都是丝毫不懂通讯的胡作非为,早晚要出问题,如果你代码里有这些做法,推荐你早点把它们改过来。
对串口通讯的接收,实际上用计算机处理起来是这样的:串口是按位接收数据的,但PC机的底层硬件和软件已经能按标准协议规定把位缓冲并识别转换成字节了,不过,每收一个字节的时间远比PC机程序运行慢得多,因此,对你的程序而言,接收的数据,其实就是一串无限长的字节任意序列慢慢向你走来,你一次只能见到一个,任何一个字节都与其他字节没什么特殊地方,它们可能是数据包的一部分或几个数据包,也许有的是错的,甚至根本全是错的,这全靠你程序去分辨——在了解了这些实际的基础上,你才可以设计你的协议和程序。
串口的协议,通常情况下格式是这样的:起始字(多字节),数据区长度(根据需要,一般是1或2字节),校验和(多字节),数据区(多字节)。
每个包都如此,起始字一般是全部正常通讯数据中不可能用到的字节序列组合,校验和一般采用CRC校验的为多(这样比较可靠,源代码在网上很多)。
对协议的接收分包工作,是个稍微复杂的编码工作(代码本身不复杂,你需要思维复杂点),你需要定义一个“接受状态”的标志值,每接一个字节变换一次状态值,它标志着你下一次将接收什么字节,比如:起始字字节1,起始字字节2,……,数据区长度字节1,数据区长度字节2,……,校验和字节1,校验和字节2……,数据区(已经进数据区了,因为已经知道长度,只积攒缓冲而已,一个标志就够)。积攒完数据区字节后,计算校验和,如果不符合前面协议给的结果,则将“接受状态”的标志值复位(将接收起始字字节1),从前面的起始字字节2开始(模拟接收)重复上面过程。以上这个过程需要你熟练编码操控二进制缓冲区。
有很多人把数据结构指针当发送缓冲,后面跟一个sizeof()就直接发出去;接收那端直接预期有多少字节数据,死等在那里;或者,按时间去接受(规定协议间要间隔若干秒),这些都是丝毫不懂通讯的胡作非为,早晚要出问题,如果你代码里有这些做法,推荐你早点把它们改过来。
对串口通讯的接收,实际上用计算机处理起来是这样的:串口是按位接收数据的,但PC机的底层硬件和软件已经能按标准协议规定把位缓冲并识别转换成字节了,不过,每收一个字节的时间远比PC机程序运行慢得多,因此,对你的程序而言,接收的数据,其实就是一串无限长的字节任意序列慢慢向你走来,你一次只能见到一个,任何一个字节都与其他字节没什么特殊地方,它们可能是数据包的一部分或几个数据包,也许有的是错的,甚至根本全是错的,这全靠你程序去分辨——在了解了这些实际的基础上,你才可以设计你的协议和程序。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询