使用查询的方式进行串口收发,对uart1写了两个函数分别为单字节收和单字节发,代码如下。
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;
}
此时在main函数中使用sendbyteuart1(readbyteuart1())回环会导致上电即开始无限发送,而从电脑发给ch579的数据虽然也能被回环回来但是会淹没在无效数据中,判断是RB_LSR_DATA_RDY标志位不起作用。
当我把接收函数的代码改成:
char readbyteuart1(){
char t=0;
while(R8_UART1_RFC==0);
t=R8_UART1_RBR;
return t;
}
使用接收fifo的计数判断时,一切正常,可以正常回环,不会产生无效数据。
请问是ch579的RB_LSR_DATA_RDY标志位不能用吗?还是它有一些其他的使用逻辑?
另外还发现在连续发送长串数据时会造成数据丢失,需要隔几个数据加一次delay才能完整发送,是因为发送函数的RB_LSR_TX_ALL_EMP标志位也无效导致的,还是因为连续发送波特率误差累计导致的?