深藏不露的'NUL'(51单片机串口通讯是遇到的错误之一)

NUl的定义:

C语言中规定以字符‘\0'作为字符串结束标志。’\0'是一个ASCII码为0的字符,从ASCII码表中可以看到ASCII码为0的字符是“空操作字符”,

它不引起任何控制动作,也不是一个可显示的字符

 

    这是本人在用单片机做串口通讯时遇到的小问题,因为那个电子设备比较特殊,发送的数据也是比较的特殊,所以我便遇到了这个问题。一开始按照预定的指令和电子设备通讯,总是不行,后来通过串口调试器才发现,发送的数据只能发送一半。于是我返回去看代码,这才发现了症结所在。

以下便是我的程序出错的原因:

 

出错的程序代码段: 

void Send_data(char p[])
{
	a=0;
	while(p[a] != '\0')
   {
	SBUF = p[a];	        //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
    while(!TI);				// 等特数据传送	(TI发送中断标志)
	TI = 0;					// 清除数据传送标志
	a++;					    // 下一个字符
	} 
}


调用该程序的代码段:

 

const char Message[8]={0x01,0x03,0x00,0xB9,0x00,0x02,0x15,0xEE};
 
while(1)
    { 
	
	  if (Flag==1)
	  {	
	  	Send_data(Message);
	    while(TI!=0);
         TI=0;
		 Flag=0;
	  }

 }

(刚开始的时候没发现,很郁闷,通过串口调试器才找到原因。)

对于程序错误的分析:

程序执行到0x00==p[2]时,即相当于‘\0’==p[2];(即遇到NUL退出)到这一步程序的判断结束,发送函数也结束。

在C语言中'\0'其实就是ASCII码表上值为0的,它是不显示的

 

我想通过这个小问题来说明在写程序是尤其要和硬件打交道的时候一定要注意‘\0’。

写的不好请见谅!欢迎大家批评指正

  

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值