我是靠谱客的博主 忧郁冬天,最近开发中收集的这篇文章主要介绍zigbee串口打印无法显示或乱码解决方法zigbee串口打印问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

zigbee串口打印问题

在终端节点向协调器发数据时,在数据流中伴有该节点的网络地址,而有时通过PC端无法打印出来。

1.可能是串口软件的问题:

  用过好几个串口软件,有时会出现停止,或乱码行为,在经过多次换用软件,发现**SecureCRT**这个软件还不错,解决的大部分问题

2.发过来的数据没有转换:

  一般的在终端发送数据的函数中,加入'0'转换就行了。
    SendBuf[0]='$';
    SendBuf[1]='@'; 
    SendBuf[2] = HI_UINT16( EndDeviceID );
    SendBuf[3] = LO_UINT16( EndDeviceID );
    SendBuf[4] = ZIGBEE_FUN_CODE_RFID_Conflict; //fc
    SendBuf[5]=5;   //data len
    SendBuf[6]=(RevBuffer[1]==0)?1:0;   //成功
    SendBuf[7]=RevBuffer[2];  //data
    SendBuf[8]=RevBuffer[3];  //data
    SendBuf[9]=RevBuffer[4];  //data
    SendBuf[10]=RevBuffer[5];  //data
    SendBuf[11] = XorCheckSum(&SendBuf[2], 9);
    SendBuf[12] = 'r';
    SendBuf[13] = 'n';

在data部分加入’0’,就行了

    SendBuf[8]=RevBuffer[3] + '0';  //data
    SendBuf[9]=RevBuffer[4] + '0';  //data
    SendBuf[10]=RevBuffer[5] + '0';  //data

3.还不能解决的话可以试试ZIGBBE中的数据转换的函数_ltoa(unsigned long l, unsigned char *buf, unsigned char radix)

在OSAL.c文件中:

unsigned char * _ltoa(unsigned long l, unsigned char *buf, unsigned char radix)
{
#if defined( __GNUC__ )
  return ( (char*)ltoa( l, buf, radix ) );
#else
  unsigned char tmp1[10] = "", tmp2[10] = "", tmp3[10] = "";
  unsigned short num1, num2, num3;
  unsigned char i;

  buf[0] = '';

  if ( radix == 10 )
  {
    num1 = l % 10000;
    num2 = (l / 10000) % 10000;
    num3 = (unsigned short)(l / 100000000);

    if (num3) _itoa(num3, tmp3, 10);
    if (num2) _itoa(num2, tmp2, 10);
    if (num1) _itoa(num1, tmp1, 10);

    if (num3)
    {
      strcpy((char*)buf, (char const*)tmp3);
      for (i = 0; i < 4 - strlen((char const*)tmp2); i++)
        strcat((char*)buf, "0");
    }
    strcat((char*)buf, (char const*)tmp2);
    if (num3 || num2)
    {
      for (i = 0; i < 4 - strlen((char const*)tmp1); i++)
        strcat((char*)buf, "0");
    }
    strcat((char*)buf, (char const*)tmp1);
    if (!num3 && !num2 && !num1)
      strcpy((char*)buf, "0");
  }
  else if ( radix == 16 )
  {
    num1 = l & 0x0000FFFF;
    num2 = l >> 16;

    if (num2) _itoa(num2, tmp2, 16);
    if (num1) _itoa(num1, tmp1, 16);

    if (num2)
    {
      strcpy((char*)buf,(char const*)tmp2);
      for (i = 0; i < 4 - strlen((char const*)tmp1); i++)
        strcat((char*)buf, "0");
    }
    strcat((char*)buf, (char const*)tmp1);
    if (!num2 && !num1)
      strcpy((char*)buf, "0");
  }
  else
    return NULL;

  return buf;
#endif
}

l代表的是要转换的数组
buf代表的是转换后的数组的指针
radix代表的是几进制,10或16

这是我自己写的转换函数(自己开了双串口):

//端口打印函数转化  UART:0->UART0,1->UART1;data目的数组;len长度;Slen从第几位开始;Elen倒数第几位结束
static void UART_printf(uint8 UART,uint8 *data,uint8 len,uint8 Slen,uint8 Elen)
{    
     uint8 i;
     uint8 DATA[30]={0};
     uint8 *ltoas;
     ltoas=DATA;
     for(i=Slen;i<len-Elen;i++)
     {
       _ltoa(data[i],ltoas,16);
       ltoas+=2;
       *ltoas++=' ';
     }
    *ltoas++='';
    if(UART==0)
      HalUARTWrite(UART0,DATA,len-Slen);
    else
      HalUARTWrite(UART1,DATA,len-Slen);
}

最后

以上就是忧郁冬天为你收集整理的zigbee串口打印无法显示或乱码解决方法zigbee串口打印问题的全部内容,希望文章能够帮你解决zigbee串口打印无法显示或乱码解决方法zigbee串口打印问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部