㈠ 51單片機串口接收字元串
51單片機串口接收字元串,接收的字元串長度不定,無結束符,要判斷這個字元串結束,確實比較難。如果每個字元串還是連續發送,幾乎是無法判斷的。如果每個字元串之前有一定的空閑時間,可以根據最短的空閑時間來判斷結束。即接收每一個字元都開始計時,接收下一個字元結束計時,如果計時的時間超過最短的空閑時間,則前一個字元為結束,且新字元串開始。並再重新計時。
㈡ C51單片機如何從PC機串口接收字元串
我的程序的一部分,供參考
//主流程
void main(void)
{
//系統初始化
SCON = 0x50; //串口方式為1,SM2= 0,TB8= 1
PCON = 0x80; // SMOD=1
TMOD = 0x22; //設定定時器0/1的工作模式為方式2
//設置T0中斷的定時時間為1/7200毫秒
TH0 = 0x00;
TL0 = 0x00;
//設置非同步串口的波特率
//TH1 = 0x0f4; //OSC = 11.0592MHz bps = 4800 SMOD=1
//TL1 = 0x0f4;
TH1 = 0x0fd; //OSC = 11.0592MHz bps = 19200 SMOD=1
TL1 = 0x0fd;
//設置中斷優先順序,T0中斷為高優先順序中斷,其他為低優先順序中斷
IP = 0x02; // 設置中斷優先順序--T0為高優先順序,其他低
ET0 = 1; //定時器0中斷
ES = 1; //串列介面中斷
EA = 1; //系統中斷允許
TR0 = 1; //啟動定時器0
TR1 = 1;
......................
//串口接收中斷處理程序
//發送採用查詢處理
void SerialComm(void) interrupt 4
{
_pReceive[_cReceive] = SBUF;
_cReceive ++;
if(_cReceive >= RecBuffSize) _cReceive = 0;
RI = 0;
}
//串口發送一個位元組
//senddata:需要發送的數據
void SendOneByte(unsigned char senddata)
{
ES = 0;
TI = 0;
SBUF = senddata;
while(TI == 0);
TI = 0;
ES = 1;
}
㈢ 51單片機串口收發字元串求助
51單片機串口發字元串的方法有多種,比較容易理解的方法是:先定義一個要發送的字元串,就是一個字元串數組。
發送時,連續發送個數組。
接收字元串,也可以採用類似的方法,先聲明一個字元串,接收時,每接收一個就存入這個串中,接收結束,查這個字元串就行了。
㈣ 51單片機 串口通信 檢查接收的字元串
首先SBUF只有8位 即一位元組,而"adcd"有4位元組+『 』個,你這把temp和「abcd」比較永遠只能為假。所以LED1=!LED1;這條語句不能執行。正確的做法是建立一個變數,將SBUF接受到的字元存入變數,然後再比較
㈤ 單片機怎麼接收字元串
void init_ser(){ TMOD=0X20;//定時器1工作在方式2 TH1=0XFD; TL1=0XFD; //波特率9600 TR1=1; EA=1; SM0=0; SM1=1; REN=1;//允許串口接收 ES=1;//開串口 中斷 }void delay(unint z){ unint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }void ser() interrupt 4 //中斷函數不用聲明 { if(RI==1) { RI=0; ser_receive=SBUF; if(ser_receive=='a') { m=1; } if( m==1 && ser_receive!='z') { receive_data[i]=ser_receive; i++;// if(i==36)// {// i=0;// ser_flag=1;// } } else if (ser_receive=='z') { i=0; m=0; ser_flag=1; xianshi=1; } } }void uart(){ if(ser_flag==1) { ES=0; ser_flag=0; for(j=0;j<57;j++) { SBUF=receive_data[j]; while(!TI); TI=0; delay(10); } ES=1; }}我剛寫的,接受以a開始,以z結束的字元串,測試沒問題。
㈥ 請問51單片機如何接收字元串
上位機 與 下位機,發送 與 接收 一串數據,單片機接收 是一個位元組 一個位元組 接收的
需要有 通訊協議,可以自己設計 一個 如 多機通訊
指令碼 機器號 數據1 數據2 - - - 數據n 校驗碼 結束碼
這樣 單片機可以判斷 接收的數據 類型,接收到數據 先存放在 緩沖區,收到結束碼後
再判斷 指令 是否是 本機數據,是再按照 數據類型處理。
㈦ 51單片機串口用數組接收字元串程序怎麼寫
對於固定的數據,可以通過順序判斷來識別用if或switch語句來判決即可
通過串口中斷,每次進入把SBUF的值賦給T,通過判決、累加NUM的值最終取得冒號後面的數值(不知樓主是否是要最後的數值)
voidUART_Int(void)interrupt4
{
staticucharNUM=0;
ucharT;
if(RI==1)
{
RI=0;
T=SBUF;//接收串口數據
switch(T)//如果是按value":0的順序讀進的話會最終觸發NUN=7的條件
{
case'v':
NUM=1;
break;
case'a':
if(NUM==1)
{
NUM=2;
}
else
{
NUM=0;
}
break;
case'l':
if(NUM==2)
{
NUM=3;
}
else
{
NUM=0;
}
break;
case'u':
if(NUM==3)
{
NUM=4;
}
else
{
NUM=0;
}
break;
case'e':
if(NUM==4)
{
NUM=5;
}
else
{
NUM=0;
}
break;
case'"':
if(NUM==5)
{
NUM=6;
}
else
{
NUM=0;
}
break;
case':':
if(NUM==6)
{
NUM=7;
}
else
{
NUM=0;
}
break;
default:
if(NUM==7)
{
LED=T; //LED為全局變數
}//把最後的數據傳給LED
NUM=0;
break;
}
}
}
㈧ 請問51單片機怎麼通過串口接收字元串能解釋一下代碼嗎謝謝了
看流程是什麼了,如果等待14個位元組接收完,那就是for循環,或者while等待。如果只是接收的話,就中斷,然後去讀數組,超過14個位元組就處理。
㈨ 單片機 串口接收的字元串如何轉為字元
樓主你好,樓上兄弟說的太復雜了,
恕我直言
沒看懂你想說明神馬問題,串口接收到的字元串如何轉化成字元,首先字元串是字元的連續儲存方式,那麼
例:
1char temp[4] = { A, B, C };這是一個標准字元串
那麼temp[0]=='A';為真
以此類推temp[1]
=='B'
1temp[3] == '/0';//c語言字元串結尾標示符./0轉義符
如果你想顯示中文那麼
中文是16bit的,雙位元組字元
1234short temp;temp=sbuf;將第一個數據獲取回來 temp<<=8;將數據左移8位temp|=sbuf;將第二次的數據帶入進來
可能會我記錯了高低位順序,要是出錯可以反過來即可!
小弟告訴你一個最簡單最實用的辦法
如何把字元中的數字變成變數數據
switch
你會用么
就是開關選擇語句
123456789static char temp;//申明一個變數 這是個全局靜態變數temp = sbuf;switch(temp) {case '0':temp = 0; break;//break必須要加,否則數據覆蓋case '1':temp = 1; break;case '2':temp = 2;break;...}
以此類推
,這樣你的道的字元串或字元數據則能變成數據,
字元串也只是數組而已
而樓主想要的字元也就是其中的一個元素罷了
可以用指針方式提取
亦可以用數組下標提取!這用的都是ascll碼
但是不需要理解到碼表上
請樓主明察搶答時間
,樓下請勿復制,祝樓主早日解決程序問題,加油加油
㈩ 串口通信時 如何讓單片機接收以特定字元開頭的字元串,比如「a 10 11 12 13 ff 」 如果判斷發過來的字元串
你可以開辟一個緩沖區,Buf[100],做成一個循環隊列,串口中斷裡面接收到一個字元,就往隊列裡面添加接收到的新字元。主程序裡面查詢是否連續幾個字元為你定義的包頭:「a 10 11 12 13 ff 」 ,如果是,就開始處理以下的字元。