使用查詢的方式進(jìn)行串口收發(fā),對(duì)uart1寫了兩個(gè)函數(shù)分別為單字節(jié)收和單字節(jié)發(fā),代碼如下。
void sendbyteuart1(char s){
while(!R8_UART1_LSR&RB_LSR_TX_ALL_EMP);
R8_UART1_THR=s;
while(!R8_UART1_LSR&RB_LSR_TX_ALL_EMP);
}
char readbyteuart1(){
char t=0;
while(!R8_UART1_LSR&RB_LSR_DATA_RDY);
t=R8_UART1_RBR;
return t;
}
此時(shí)在main函數(shù)中使用sendbyteuart1(readbyteuart1())回環(huán)會(huì)導(dǎo)致上電即開始無限發(fā)送,而從電腦發(fā)給ch579的數(shù)據(jù)雖然也能被回環(huán)回來但是會(huì)淹沒在無效數(shù)據(jù)中,判斷是RB_LSR_DATA_RDY標(biāo)志位不起作用。
當(dāng)我把接收函數(shù)的代碼改成:
char readbyteuart1(){
char t=0;
while(R8_UART1_RFC==0);
t=R8_UART1_RBR;
return t;
}
使用接收fifo的計(jì)數(shù)判斷時(shí),一切正常,可以正?;丨h(huán),不會(huì)產(chǎn)生無效數(shù)據(jù)。
請問是ch579的RB_LSR_DATA_RDY標(biāo)志位不能用嗎?還是它有一些其他的使用邏輯?
另外還發(fā)現(xiàn)在連續(xù)發(fā)送長串?dāng)?shù)據(jù)時(shí)會(huì)造成數(shù)據(jù)丟失,需要隔幾個(gè)數(shù)據(jù)加一次delay才能完整發(fā)送,是因?yàn)榘l(fā)送函數(shù)的RB_LSR_TX_ALL_EMP標(biāo)志位也無效導(dǎo)致的,還是因?yàn)檫B續(xù)發(fā)送波特率誤差累計(jì)導(dǎo)致的?