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’。
写的欠好请见谅!欢迎我们批评指正