大家看看,一个题目,求思路

2019-07-21 04:16发布

碰到一个题目,其中有一条要求写一个函数如下:
a) bool serial_out(uint8_t chByte);
非阻塞的串口单字符发送函数。所谓非阻塞是指,当因为任何原因发送失败时(比如上一个字符还没有发送完毕)直接返回false;发送字符时不允许在该函数内等待发送成功(即不允许等待寄存器发送完成标志位举起或busy标志位清除),只要成功的将chByte中所保存的数据送到数据寄存器中即可立即返回true

如果要用STM32实现,我想法如下,
bool serial_out(uint8_t chByte)
{
 USART1->DR = (uint16_t) chByte&0x01ff; 

 if( (USART1->DR & 0x01FF) == (uint16_t) chByte  ){
  return true;
 }  
 else{
  return false; 
 }
}
很不幸,事与愿违, (USART1->DR & 0x01FF) == (uint16_t) chByte )这个等式永远不成立,仿真得出USART1->DR值始终为0.

通过查询参考手册得知,STM32串口的的Data register实际是是分TDR和RDR的,结构图如下:


也就是说串口的 data register读和写其实是分开的,你要读USART1->DR的值,实际读的是RDR的值,如果没有外部数据输入,始终是0.
所以以上函数功能实现失败。
头疼,在不通过查询标志位的前提下,大家有什么好思路来实现这个函数。




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
jplzl10000
1楼-- · 2019-07-22 01:13
很奇怪,你为什么是读的DR,不是读TDR的么?
还有就是,写的也是DR,不是应该写TDR的么
爱上cmu
2楼-- · 2019-07-22 04:03
个人感觉,非阻塞传输就是不要去等待确认标志位,提升CPU效率,其实就用中断实现就OK了啊,建立一个队列,中断搞定,我弄过,比较高效

一周热门 更多>