WCH沁恒单片机
直播中

王敏

7年用户 1423经验值
私信 关注
[问答]

ch579串口收发,RB_LSR_DATA_RDY标志位不起作用怎么解决?

使用查询的方式进行串口收发,对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标志位也无效导致的,还是因为连续发送波特率误差累计导致的?


回帖(2)

王颖

2022-7-27 10:03:39
单字节首发的接口在evt里面uart1.c里面有,可以参考
举报

张坤

2022-7-27 10:03:44
例程确实是用的fifo计数来做的,但是为什么这个标志位不行呢?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分