微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 深藏不露的‘NUL‘(51单片机串口通讯是遇到的错误之一)

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

时间:11-20 来源:互联网 点击:
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’。

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top