OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7797|回复: 8

Z-Stack协议栈串口打印乱码问题的可能性及解决办法

[复制链接]

7

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-1-23
在线时间
4 小时
发表于 2014-9-5 17:24:55 | 显示全部楼层 |阅读模式
在通过串口打印的时候,经常出现乱码现象,分析可能的原因
1.配置有误
这个是最低级,最不应该发生的错误了,如果你调试了半天,结果发现是自己波特率设置或者是其他串口相关配置不正确,是不是有种想抽自己几个耳光的冲动。
2.串口助手的问题
这是可能发生的。我在用一个串口助手调试了大半天后,发现怎么调试都是乱码,无奈抱着试试看的心理换了一个串口助手,奇迹出现了,竟然不再乱码了
3.打印的数据类型不全是char类型的
基本出现乱码的情况都是此种情况。一般直接打印字符串的话,不会出现乱码,但我们打印的经常并不是字符串。最典型的例子就是,我们在接收到信息后,想打印出来,然后直接调用    HalUARTWrite(HAL_UART_PORT_0,pData,len);
其中pData是传递过来的指针。
如果pData是字符串形式的,自然没有问题,但事实是pData大多情况下并不是字符串形式的,直接打印自然就乱码了。
解决办法就是通过加字符‘0’转换成ASII码形式。
pData = pData + '0';
4.屏蔽以MT开头的预编译宏
这一点我并没有验证,是参照别人所说,这里只是提供一种可能性

以上即是我在多次碰到串口打印乱码后,总结出来的经验,仅供参考,如有不足或不当的地方,还望大家补充。



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-9-5 21:17:01 | 显示全部楼层
回复 支持 反对

使用道具 举报

7

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-1-23
在线时间
4 小时
 楼主| 发表于 2014-9-9 12:29:57 | 显示全部楼层
首先感谢原子哥力挺,不过由于是第一次发帖,难免有疏漏和不足之处,这里再做一些补充。

以ED和协调组成的简单网络为例,ED绑定协调后周期性发送信息给协调。

1.ED发送的信息为纯字符串形式
uint8 pData[] = "chuan kou da yin";
collector接收到后,不需要转换,直接打印,不会出现乱码。
如果进行了转换,则会出现乱码

2.ED发送的信息是数值形式的
uint8 pData[] = {0x58,0x29,0x53,0x77,0x89};
collector接收到后,不进行转换,直接打印,会出现乱码。
如果直接按照下面的形式进行转换,依然会出现乱码。
uint8 pData[] = {0x58,0x29,0x53,0x77,0x89};
collector接收到后,不进行转换,直接打印,会出现乱码。
如果直接按照下面的形式进行转换,依然会出现乱码。
void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData  )

    ……
    for(i=0;i<len;i++)
    {
      pData = pData+'0';
    } 
    ……


问题出在哪里了?
其实这个问题也很简单了,0x58虽然是一个数,但是转码的时候并不能直接加‘0’转码,需要对5和8分别进行转码,然后再合并在一起。
好在协议栈为我们提供一个转码函数
unsigned char * _ltoa(unsigned long l, unsigned char *buf, unsigned char radix)
减少了不少麻烦。
按下面的处理即能完整打印
void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData  )
{
  uint8 i;
  uint8 *pBuf;
  uint8 Data[128];
  pBuf = Data;
  if(command == SENSOR_REPORT_CMD_ID)
  {
    for(i=0;i<len;i++)
    {      
        _ltoa( pData, pBuf, 16 );
        pBuf +=2;
        *pBuf++ = ' ';      
    }
   *pBuf++ = '\0';
    HalUARTWrite(HAL_UART_PORT_0,Data,osal_strlen(Data));
  }
}
打印结果如下图

 
3.还有一种就是字符串与数值混合打印的处理,协议栈的simpleApp例程就是这种形式的。


不过,不论哪一种形式,还是要预先知道传递信息的格式的。


 




回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-9-9 21:37:40 | 显示全部楼层
回复【3楼】浮生长恨:
---------------------------------
这类问题,很容易仿真解决啊。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-1-23
在线时间
4 小时
 楼主| 发表于 2014-9-10 14:05:01 | 显示全部楼层
这个……这个……你懂得!
然后再弱弱的问一下,能简单说下怎么仿真解决吗!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-9-10 23:13:17 | 显示全部楼层
回复【5楼】浮生长恨:
---------------------------------
一步步跟踪,代码肯定是跟着你的思路写出来的对不?
然后就跟踪代码,看看运行的时候,得到的值,与你的期望值符合不?跳转的逻辑,与你的期望值符合不?
如果不符合,那么再看是为什么导致不符合?
是思路的问题?还是数据的问题?

这不就清晰了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-1-23
在线时间
4 小时
 楼主| 发表于 2014-9-11 16:38:31 | 显示全部楼层
一般我单步调试,执行完HalUARTWrite,看到打印不正确,并不知道是什么原因引起的,最终又沦为多次尝试查找原因,很是浪费时间。
还是很感谢原子哥的,这方面我还需要提升。
努力!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165353
金钱
165353
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-9-12 00:52:25 | 显示全部楼层
回复【7楼】浮生长恨:
---------------------------------
HalUARTWrite的参数,肯定就是打印出来的内容是不?如果是,那么肯定在进入HalUARTWrite之前,就有问题了,自然就是在HalUARTWrite之前就应该找问题。
然后看传递的是哪个参数?在哪里被修改了,这就是针对性的找问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

63

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-1-23
在线时间
4 小时
 楼主| 发表于 2014-9-23 11:27:33 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
很是感谢原子哥的耐心解答,新技能get!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 12:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表