串口乱码疑云

6 篇文章 0 订阅
6 篇文章 0 订阅

        凡是用串口工具调试APP的人都有一个绕不过去的坑,那就是乱码坑!最简单的乱码坑是由于串口的波特率与传送信息模块的波特率不一致造成的,在串口工具上重新设置正确的波特率就马上见效出坑了。出现乱码最先检查的就是波特率,因为它的纠正最简单迅捷。作者最近在调试一个蓝牙的APP时就进了这个乱码坑,而且不是波特率坑,花了好几天时间,也没把这个坑整得完全明白,但还是有一些体会,现分享给大家,供参考。

        作者调试的是一个手机与ble蓝牙jdy16模块链接进行通信的APP,在手机与蓝牙模块接通后,手机向蓝牙模块发送了一条中文信息,蓝牙模块接收到了,在串口工具上显示出来,这时发现显示出来是一堆乱码,见下图:

        首先检查波特率的设置,没有问题,想到乱码是由于编码与解码不一致造成的,就又检查android studio中的编码设置:

在android studio中的settings和Other settings中有关编码的部分是统一设置成了UTF-8编码的,是一致的,那产生乱码的原因有很大的可能是串口助手与APP的编码不一致造成的,那么,串口助手用的是哪种编码呢,在APP中,我试了很多种编码方法发送到串口助手,比如,用过URLEncoder.encode(“编码1”)与URLDecoder.docode(“编码2”)方法, 编码方式也试了好多种,比如GBK,GB2312,UTF-8...等等,但是结果却令人非常沮丧,在串口工具上始终显示的是乱码。同时,我注意到,同样的字符如果发送到手机上显示则是正确的汉字符号。在分析乱码时,找到一个乱码恢复网站,把乱码贴上去,得到一个意外的结果:

看上面这张图的最后一行,它把乱码准确地还原了,确认原码是UTG-8,现码是GBK,这个结论应该是对的,我在android studio中所有编码的设置都是UTF-8,那么串口助手的编码方式就应该是GBK,按照这个结论,如果我在APP中把中文字符的码编方式设置成GBK就应该与串口工具的编码方式一致了,不会再产生乱码,但是做了一系列的实验,乱码依然如旧。那么,这些在串口工具上产生乱码的编码再传回来会是什么效果?因为调试是一个透传蓝牙模块,想要得到蓝牙接收到的数据再回传的过程很简单,只需要在APP里再读取蓝牙的数据即可,于是我加了几行代码:

再把收到的信息显示出来就是:

可见,从蓝牙模块转了一圈后回传的信息与发送的信息是完全一致的。显然,目前这个乱码的锅应该由串口工具来背啊。那么,选用不同的串口工具会有什么结果呢,我试了不少于10种各式串口工具,大多数串口工具显示都是乱码,而且,这些串口工具都没有编码选择这个功能,只能按照工具本身设定的编码方式来解码,如果串口工具接收到的信息与工具设定的编码不致,就会产生乱码。但是,我还真找到两款在UTF-8编码下不产生乱码的串口工具:

第一款是格西烽火串口助手:

下面这个图是APP从蓝牙接收到的返回信息:

从这两个图能看出格西烽火串口工具可以很完美的显示UTF-8编码的字符,因为它的编码相同的,所以在所有的终端都会显示相同的信息。但是,它给我的注册时间只有几天,到年底,到期后不知道是不是免费使用的啦。还有就是貌似没有GBK编码选项。

        第二款是 深蓝串口助手,它的显示效果如下图:

这个是使用深蓝串口助手时从蓝牙返回的信息:

        从上面的图中可以看出,深蓝串口助手在中文字符解码上还是有些暇疵,有些没有显示出来。还有要说明的是,这两款串口助手都有编码选择功能,可以根据APP的编码选择串口工具的编码,这样一来,串口工具在中文时出现乱码机会就小很多,不过,格西烽火串口助手的编码有很多种,选择很丰富,深蓝串口助手只有只种编码方式可供选择。

        还要说明一点,这两款串口工具显示的字符与APP从接收从蓝牙返回的信息以及在手机上显示的信息是一致的,都是发出的原信息。

        后来总算是找到了在通常使用的串口工具上正确的显示中文字符的方法,那就是使用getByte()方法,把原字符转换成字节再转成目标编码方式显示:

在这段代码中,res是中文的字符串,GBK是要转换成的目标编码,用这个方法在普通串口工具上的显示效果:

        然而,虽然在串口工具上能正确的显示中文字符了,但手机上和从蓝牙返回的信息却成了乱码,下图是蓝牙模块接收到信息后透传的信息:

        同理,用String string=new String(“中文字符串”.getBytes(“编码1”),“编码2”)方法也能达到这个效果,其中编码1是中文字符串现在的编码,编码2要转换成的目标编码。

        正如上面的事实,要想在串口工具中不出现乱码,我看来有两种方式,一种是选用编码方式可选择的串口工具,设定与APP一致的编码,这样的发送的信息能保持较好的一致性,第二种方式是在普通串口工具中使用正确的编码转换方法,此种方式有可能产生串口工具与接收终端信息不一致的结果。建议还是选第一种方式吧,省心!再就是给那些串口工具的开发者提个建议,多加个编码选择功能很难么?有了编码选择功能使用者的感受会好很多,多费点心增加些实用的功能吧。

本文为作者原创,如转请注明出处!

 

  • 13
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值