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

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条回答
正点原子
1楼-- · 2019-07-21 08:06
你老师有病。
这题目完全不可能实现,有本事让他自己写个试试。
判断发送完成 的唯一方式,就是等待标志位,既然不等待标志位,那就没法确认发送是否完成,既然没法确认,就是伪命题。
综上,不可能实现。
别浪费时间了。
好人
2楼-- · 2019-07-21 08:12
为什么不去检查USART1_SR的TXE呢?
styleno1
3楼-- · 2019-07-21 13:56
很有创意,我从未想到过这样实现。
Danielyuan
4楼-- · 2019-07-21 18:12
回复【2楼】好人:
---------------------------------
题目就是这样,不能通过查询寄存器的方法来实现
好人
5楼-- · 2019-07-21 22:08
 精彩回答 2  元偷偷看……
正点原子
6楼-- · 2019-07-21 23:39
所以说,不了解底层的人出题目真可怕。

一周热门 更多>