STC12C5A60S2单片机串口1无法连续发送字符的问题

开发环境(蓝色粗体字为特别注意内容)

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');//字符串最后再发结束符号
	}
即干脆不发送空字符,也不知道这样会不会有什么隐患,暂时就先这样用了,欢迎各位同学批评指正,给些意见大笑~~~~


阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页