PIC24F32KA304-关于UART轮训发送数据出现数据发送不全问题的解决
来源:互联网 发布:政务数据资源管理平台 编辑:程序博客网 时间:2024/05/19 18:46
出现问题的代码:
while(U2STAbits.UTXBF && !U2STAbits.TRMT) continue;
代码中涉及到了两个寄存器:UxSTA<9>UTXBF:UARTx发送缓冲器满状态位(只读)和UxSTA<8>TRMT:UARTx发送移位寄存器空位(只读)
数据手册对这两个寄存器位的描述为:
UTXBF:UARTx 发送缓冲器满状态位(只读)1 = 发送缓冲器满
0 = 发送缓冲器未满,至少还可写入一个字符TRMT:UARTx 发送移位寄存器空位(只读)
1 = 发送移位寄存器为空,同时发送缓冲器为空(上一次发送已完成)
0 = 发送移位寄存器非空,发送正在进行或等待发送
对于PIC24F32系列的PIC单片机的UART,都具有一个4级深度的FIFO加一个发送移位寄存器(UxTSR),组合起来实际上就有五级深度。
第一次开始发送的时候,由于UxTSR寄存器为空,这样传输数据到UxTXREG寄存器会导致该数据立即传输到UxTSR,但是在第二次及以后的发送则不会。
如果采用上述轮询方式同时查询上述两个寄存器位的话,首先
- TRMT会变为1,表明发送移位寄存器为空,同时发送缓冲器为空(上一次发送已完成),这个时候其实就可以向UxTXREG(UARTx发送寄存器)写入新的数据了。
↓
- 但是还需要判断UTXBF,当这个满足判断条件,即该寄存器为1的时候,表明发送缓冲器未满,至少还可写入一个字符。这会导致其传送出现越过数据位的情况。比如说发送40位数据,就会有40 ÷ 5 = 8个数据位可能丢失(实际测试,8位全丢了)
所以,正确的轮训方式为:
while(!U2STAbits.TRMT) continue;
0 1
- PIC24F32KA304-关于UART轮训发送数据出现数据发送不全问题的解决
- 关于串口发送数据的问题
- UART的发送FIFO问题
- Tcp发送或接收数据不全
- stm32串口发送数据出现问题
- 调试cdma模块发送数据出现的问题
- Zstack之uart中断方式数据发送
- STM32 UART(接收 ,发送数据)
- 解决网络不通数据只有发送不接收的问题
- 关于POST请求数据发送问题
- 关于TCP服务器端与客户端数据发送的问题
- 关于异步发送数据
- Android客户端发送json数据乱码出现问好解决
- socket10053发送数据出现错误
- 解决Postman发送post数据但是Node.js中req.body接收不到数据的问题
- 进程间发送数据的问题
- socket 发送数据需要注意的问题
- Socket连接发送数据的一点问题
- PostgreSQL的日志类型
- 统计特定字符串出现的次数
- 除去字符串两端的空格
- java 生成 解析XML 文件 Dom4J
- Trusting all certificates with okHttp
- PIC24F32KA304-关于UART轮训发送数据出现数据发送不全问题的解决
- maven自定义目录
- log4j配置
- Spring MVC-Request method 'POST' not supported:
- Range
- hadoop配置文件
- 梵塔问题
- Linux vi命令
- hdu3586 Information Disturbing 树形DP