專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

單片機(jī)串口通信-字符數(shù)組

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2009年12月08日   【字體:

     在上一篇文章中可以看到,利用一個(gè)一個(gè)字符來(lái)判斷命令和通信協(xié)議不但很麻煩,而且有很大的缺陷,比如:輸入一個(gè)字符串其中只要有命令就會(huì)執(zhí)行,而且上一篇的程序不可以處理一些特殊的字符串(停止命令是end,但是如果是輸入一個(gè)en的話,就會(huì)卡在while(RI==0),這個(gè)語(yǔ)句里,沒(méi)有下一個(gè)字符的輸入,RI在上面的程序被置為0,就會(huì)一直在while語(yǔ)句里出不來(lái)。如果一開(kāi)始就置為1的話,就接受不到下一個(gè)字符了)

         所以我又重新開(kāi)始考慮用字符數(shù)組處理命令,再用上個(gè)程序之前其實(shí)最初是用字符數(shù)組來(lái)做這個(gè)程序的,但是一直都有一些問(wèn)題沒(méi)有解決;昨天我用c++來(lái)做了一個(gè)字符接收和判讀函數(shù),然后用keil做一個(gè)同樣的程序發(fā)現(xiàn)還是用一些同的:

 

    C語(yǔ)言和c++里面定義字符數(shù)組用兩種形式:

例如(1)char t[6]="start";這個(gè)字符串的長(zhǎng)度是5但是系統(tǒng)默認(rèn)這種定義方法在字符串的后面加上一個(gè)\0;所以就要用一個(gè)長(zhǎng)度位六位的字符數(shù)組來(lái)存放,如果定義5位(t[5])編譯器就會(huì)報(bào)出一個(gè)錯(cuò)誤,說(shuō)數(shù)組存放不了;

           (2)char a[5]={'s','t','a','r','t'}     這樣定義可以省去系統(tǒng)默認(rèn)的\0,但是可以明顯發(fā)現(xiàn),這種定義方法對(duì)于長(zhǎng)的字符串的定義并不實(shí)用;

   keil里定義數(shù)組:

     上面的第二種方法同樣可以定義,不過(guò)第一種方法就會(huì)用不同了:

   定義一個(gè)start數(shù)組:char t[5]="start";   明顯發(fā)現(xiàn)在keil里面編譯器沒(méi)有給字符數(shù)組一個(gè)默認(rèn)的\0,這就是這兩個(gè)編譯器的不同了;

         在有的情況下,這個(gè)不同是致命的:

#include<reg52.h>
#include<stdio.h>
#include<string.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;i<5;)   //輸入到數(shù)組里
  {RI=0;
  while(RI==0);                        //如果在此處定義的字符串的長(zhǎng)度位6位的話,就會(huì)一直等待第六個(gè)輸入,造成程序無(wú)法執(zhí)行
  a[i]=SBUF;i++;
  }
  for(i=0;i<5;)   //通過(guò)單片機(jī)輸出到電腦
  {
  SBUF=a[i];
  while(TI==0);i++;TI=0;
  }
}
}  

關(guān)閉窗口

相關(guān)文章