找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2254|回复: 6
收起左侧

关于如何解决单片机串口重复发送字符串的问题

[复制链接]
ID:1091909 发表于 2023-8-24 21:05 | 显示全部楼层 |阅读模式
单片机串口重复发送字符串,大佬回答说加while(1),可是我加了之后计算机收不到数据
回复

使用道具 举报

ID:213173 发表于 2023-8-24 21:43 | 显示全部楼层
设置发送的条件即可
回复

使用道具 举报

ID:161164 发表于 2023-8-24 21:54 | 显示全部楼层
贴完整代码
回复

使用道具 举报

ID:123289 发表于 2023-8-25 08:24 | 显示全部楼层
我的方案及实用:没有等待,几乎不占(几条机器指令)其它低级中断时间。
1、建立一个缓冲区SS,专放需要发送的字节。
2、建立两个指针:其一,PCS1指向需要发送但还未发送的字节,也即向SS写一个,PCS1就+1个。
其二,PCS2指向正在发送的字节,也即发一个,PCS2就+1个。
3、规则1:起始让PCS1=PCS2,表示没有发送字节,或所有字节已发完。
4、发送中断(TI)服务程序,检查,当PCS1<>PCS2,就发送PCS2指向的字节,并将PCS2+1,退出中断。这样中断一次发一个字节,发完就走,用时极短,没有等待(从不等待TI),几乎不占时间。
5、所有需要发送的字节,依序写入SS即可:写入PCS1指向和地址,写完后PCS+1。
如此写入SS并不管它是否被发送,除非它是第一个字节(PCS1=PCS2时)。

回复

使用道具 举报

ID:123289 发表于 2023-8-25 08:46 | 显示全部楼层
6、将SS做成循环地址,如256个,64个,32个,这样方便循环(只要限制PCS1、2的高位=0即可达成循环)
另:高级防止意外部分(如,意外无TI中断,发送未通连续):
如果间隔△t(如20ms)无发送,复位PCS1=PCS1=0(丢弃意外)。这需要做发送计时标记,定时器……,不在此细述了。

总结:
1、新手发送10个字节,会发1个等1个(等TI=1),再发下1个,直到发完10个字节。
假设发送一个字节需要2ms,则发送10字节就用了20ms,而真正地执行10个字节的发送,只需不到10us(CPU执行10个BSUF=A指令,及其它辅助指令),这里20ms几乎白白地等待浪费了。
2、当你调用【发送函数】时,谁能知道【发送函数】是如何发送的呢?它有没有象1、一样呢?
这是你不能控制的,因为程序是别人的。

楼主要重复发送:
只要将需要重复的字节写入SS即可,想重复几次就写几次。
回复

使用道具 举报

ID:1073939 发表于 2023-8-25 12:01 | 显示全部楼层
看了你另一个相关帖子。
  1. void main()
  2. {
  3.         uart_init();
  4.         delay_ms(500); delay_ms(500); delay_ms(500); delay_ms(500); delay_ms(500); delay_ms(500);
  5.         uart1_send_string("yes,you can!\r\n");
  6.         delay_ms(500);
  7. while(1);
  8. }
复制代码
回复

使用道具 举报

ID:320306 发表于 2023-8-25 16:22 | 显示全部楼层
发送需要延时处理一下比较好!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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