微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机串口通信-字符数组

单片机串口通信-字符数组

时间:11-06 来源:互联网 点击:
在上一篇文章中可以看到,利用一个一个字符来判断命令和通信协议不但很麻烦,而且有很大的缺陷,比如:输入一个字符串其中只要有命令就会执行,而且上一篇的程序不可以处理一些特殊的字符串(停止命令是end,但是如果是输入一个en的话,就会卡在while(RI==0),这个语句里,没有下一个字符的输入,RI在上面的程序被置为0,就会一直在while语句里出不来。如果一开始就置为1的话,就接受不到下一个字符了)

所以我又重新开始考虑用字符数组处理命令,再用上个程序之前其实最初是用字符数组来做这个程序的,但是一直都有一些问题没有解决;昨天我用c++来做了一个字符接收和判读函数,然后用keil做一个同样的程序发现还是用一些同的:

C语言和c++里面定义字符数组用两种形式:

例如(1)char t[6]="start";这个字符串的长度是5但是系统默认这种定义方法在字符串的后面加上一个\0;所以就要用一个长度位六位的字符数组来存放,如果定义5位(t[5])编译器就会报出一个错误,说数组存放不了;

(2)char a[5]={'s','t','a','r','t'} 这样定义可以省去系统默认的\0,但是可以明显发现,这种定义方法对于长的字符串的定义并不实用;

keil里定义数组:

上面的第二种方法同样可以定义,不过第一种方法就会用不同了:

定义一个start数组:char t[5]="start"; 明显发现在keil里面编译器没有给字符数组一个默认的\0,这就是这两个编译器的不同了;

在有的情况下,这个不同是致命的:

#includereg52.h>
#includestdio.h>
#includestring.h>
#define uchar unsigned char
uchar t[5]="start";
int i;uchar a[5];
void main()
{
TMOD=0x20;
TH1=0xfd;TL1=0xfd;
SM1=1;SM0=0;
REN=1;ET1=1;TR1=1;ES=1;
while(1)
{
for(i=0;i5;) //输入到数组里
{RI=0;
while(RI==0); //如果在此处定义的字符串的长度位6位的话,就会一直等待第六个输入,造成程序无法执行
a[i]=SBUF;i++;
}
for(i=0;i5;) //通过单片机输出到电脑
{
SBUF=a[i];
while(TI==0);i++;TI=0;
}
}
}

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

网站地图

Top