1,开发板:STC12C5A60S2,串口1。
在使用STC12C5A60S2串口1发送数据的时候,接收端无法收到完整的字符串,我的发送方式如下:
UART_Send_Str("00");
UART_Send_Byte(':');
UART_Put_Num(dat[0]);
UART_Send_Byte('.');
UART_Put_Num(dat[1]);
UART_Send_Byte(':');
UART_Put_Num(dat[2]);
UART_Send_Byte('.');
UART_Put_Num(dat[3]);
UART_Send_Byte(':');
UART_Put_Num(status_move);
UART_Send_Byte(':');
UART_Put_Num(status_fire);
void UART_Send_Str(uchar *s)
{
uint len = sizeof(s) / sizeof(s[0]);
uint i;
for(i = 0; i < len; i++)
//UART_Send_Byte(s[i]);
{
if(s[i] == '\n')
{
UART_Send_Enter();
}
else
{
UART_Send_Byte(s[i]);
}
}
}
发现接收端只能收到'00',串口无法完整接收字符,甚是诡异,把串口助手的十六进制显示勾上之后,终于发现了猫腻
“00”字符串之后竟然是空字符,而遇到空字符,一般就当作字符串结束,自然,后面的字符就无法显示了。
于是把UART_Send_Str函数改为如下即可正常运行
uint len = sizeof(s) / sizeof(s[0]);
uint i;
for(i = 0; i < len; i++)
//UART_Send_Byte(s[i]);
{
if(s[i] == '\n')
{
UART_Send_Enter();
}
else if(s[i]!='\0')//空字符ASCII为0x00,不发,不然接收端会认为字符串已经结束
{
UART_Send_Byte(s[i]);
}
//if(i==len-1)UART_Send_Byte('\0');//字符串最后再发结束符号
}
或者改为如下:
uint len = sizeof(s) / sizeof(s[0]);
uint i;
for(i = 0; i < len; i++)
//UART_Send_Byte(s[i]);
{
if(s[i] == '\n')
{
UART_Send_Enter();
}
else if(s[i])//空字符ASCII为0x00,不发,不然接收端会认为字符串已经结束
{
UART_Send_Byte(s[i]);
}
//if(i==len-1)UART_Send_Byte('\0');//字符串最后再发结束符号
}
即干脆不发送空字符,也不知道这样会不会有什么隐患,暂时就先这样用了,欢迎各位同学批评指正,给些意见 ~~~~