找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1038|回复: 10
收起左侧

stm单片机串口发送的疑问

[复制链接]
ID:525511 发表于 2023-11-28 11:39 | 显示全部楼层 |阅读模式
在串口数据发送操作中,单片机代码一般是这样写的:void USART_SendByte(USART_TypeDef* USARTx, uint8_t Data){    while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);    USART_SendData(USARTx,Data);    }
那么这里while不是一直在死等吗?这个过程程序是不做任何事的,和delay有什么分别?都说程序中不要用延时死等,那么这里怎么办?如果要发送的数据很多的话,每次都在这里死等一下,整体会拖慢程序运行速度吧?不加这个while的话还有其它方法实现发送功能吗?我知道可以用DMA,但好像不是所有片子都有DMA吧?虚心求教
回复

使用道具 举报

ID:401564 发表于 2023-11-28 14:35 | 显示全部楼层
虽然说都是死等,但效率并不会太慢
你看一下代码就知道了
调用函数之后并不是先发送数据,而是先查询发送完成标志位
然后,就发送数据,函数就返回了,程序在返回之后就可以去做其它的事了
其实这就已经可以了,串口本身就是不用来进行超高速数据传送的
回复

使用道具 举报

ID:94031 发表于 2023-11-28 14:50 | 显示全部楼层
while是检测到发送完就进行下一步,delay不可能比while时间短,最好用while。
回复

使用道具 举报

ID:744809 发表于 2023-11-28 15:23 | 显示全部楼层
可以写一个发送队列,然后用发送中断的方式进行发送,每发送一个字节会进入发送中断一次,此时在中断里判断发送buf还有没有待发送的字节,有则继续发送,没有则说明此次发送已经好了。
回复

使用道具 举报

ID:470485 发表于 2023-11-28 16:12 | 显示全部楼层
不是死等,是反复检查,当检测到发送完(时间可长可短),就进入下一步
Delay等待只能固定时间,不能灵活控制。
回复

使用道具 举报

ID:1093268 发表于 2023-11-28 16:12 | 显示全部楼层
大部分应用对于:“串口阻塞发送”,并不会对其他进程的时效有多大影响。除非要发送很多很多字节或其他进程的实时要求特别高,才不会选择这种阻塞发送。如果不能用阻塞发送,可以利用串口BUF空中断+串口发送完成中断+软件做个发送缓冲器。
回复

使用道具 举报

ID:124486 发表于 2023-11-28 18:43 | 显示全部楼层
不是死等,是检测是否接收或者发送完成等待,任务不需要即时响应的话,波特率调快一点还好这种方式也还行,如果不想等就用中断做
回复

使用道具 举报

ID:384109 发表于 2023-11-28 19:33 | 显示全部楼层
改中断发送方式就好了
回复

使用道具 举报

ID:883242 发表于 2023-11-28 22:43 | 显示全部楼层
可以把这个死等程序放主循环里面,其他功能在中断完成,就不会有卡死的现象了。这个死等只要别放在中断里面等就没问题。
回复

使用道具 举报

ID:744809 发表于 2023-11-29 16:53 | 显示全部楼层
Hephaestus 发表于 2023-11-28 22:43
可以把这个死等程序放主循环里面,其他功能在中断完成,就不会有卡死的现象了。这个死等只要别放在中断里面 ...

你这太抽象了,哪有把串口放主函数,其他放中断的。本末倒置了不是
回复

使用道具 举报

ID:525511 发表于 2023-12-1 15:51 | 显示全部楼层
好的,明白了,多谢各位
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表