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] = '\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++='\0';
if(UART==0)
HalUARTWrite(UART0,DATA,len-Slen);
else
HalUARTWrite(UART1,DATA,len-Slen);
}