首先是自己遇到了問題,然后在同事的幫助下解決了,然后上網(wǎng)一查有這樣的注意文章,就轉(zhuǎn)過來了
一、深入了解字符串的問題
char str11[]="a";
P1=strlen(str11);
上面的一個是一個測試字符個數(shù)的實例,用仿真就可以看到結(jié)果。結(jié)果是1。也就是說字符’’是不會被計入的。那么我們就可以通過此函數(shù)來分辯是否是字符和字符串。當(dāng)然如果字符串是一個字符的話,那么就是我們上面的那個情況了,會直接被當(dāng)做一個數(shù)看待。
注:上位機發(fā)過來的數(shù)據(jù)全部是字符串格式的。
二、串口中斷問題
先看下面的程序。
void UART_SendByte(unsigned char dat)
{
SBUF=dat;
while(!TI) ;//等待發(fā)送完畢
TI=0;
}
這個程序就是一個簡單的串口發(fā)送字符的程序,為了能夠?qū)崿F(xiàn)自動發(fā)送和接收,我們分析一下它。我們要同時實現(xiàn)接收,有接收那么就要有串口中斷,通過串口中斷達到接收數(shù)據(jù)的目的??墒钱?dāng)ES=1,程序并不會像我們想的那樣運行,當(dāng)執(zhí)行完SBUF=dat后,程序開始等待,大概是5個時鐘周期后,程序并沒有直接運行TI=0這句,而是,因為緩沖區(qū)中的字符而直接跳轉(zhuǎn)到串口中斷函數(shù)中,甚至出現(xiàn)死循環(huán)這樣的情況。
為了避開這種情況,我們引入了下面的程序:
void UART_SendByte(unsigned char dat)
{
SBUF=dat;
ES=0;
while(!TI) ;
TI=0;
ES=1;
}
或者寫做一個中斷處理函數(shù),空的函數(shù)也可以:
void Com_INT() interrupt 4//串口中斷
{
}