找回密码
 立即注册
查看: 992|回复: 15

怎样尽量减少串口发送数据等待中断(完成)的时间?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:566
  • 最近打卡:2025-06-16 07:52:44

113

主题

2027

回帖

5810

积分

论坛元老

积分
5810
发表于 2024-10-20 12:03:11 | 显示全部楼层 |阅读模式
本帖最后由 DebugLab 于 2024-10-20 19:05 编辑

最近弄了一个小制作,需要用到15F2K60S2的串口发送数据。具体地说,单片机收到上位机发送数据的命令后,随即从IO口收集数据,然后将数据(有时大约140字节)返回上位机。在单片机向上位机发送数据的时候,有时会遇到等待中断(完成标志)的时间过长(最长近1秒),暂时还找不到真实原因。部分代码如下:

  1. void SendDat(u8 *dat, u8 len) //向串口发送数据
  2. {
  3.     u8 i;
  4.     for (i = 0; i < len; i++)
  5.     {
  6.         fBusy = 1;
  7.         SBUF = dat[i];
  8.         while (fBusy) ;//有时会停留在这里近1秒的时间
  9.     }
  10.     ge = 0;
  11. }
  12. void uart_isr() interrupt 4
  13. {
  14.     if (TI)
  15.     {
  16.         TI = 0;
  17.         fBusy = 0;
  18.     }
  19.     if (RI)
  20.     {
  21.         RI = 0;
  22.         ckdat[ge] = SBUF;
  23.             ge++;
  24. }
复制代码

请问:怎样尽量减少串口发送数据等待中断(完成)的时间?

回复

使用道具 举报 送花

  • 打卡等级:常住居民II
  • 打卡总天数:99
  • 最近打卡:2025-06-16 09:28:47

733

主题

1万

回帖

1万

积分

管理员

积分
16643
发表于 2024-10-20 12:10:44 | 显示全部楼层
换管脚基本兼容的 8H8K64U, 有DMA支持串口发送和接收

最新 8H8K64U 数据手册
www.stcai.com/cp_stc8hxl
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:499
  • 最近打卡:2025-06-16 10:06:31
已绑定手机
已实名认证

112

主题

2391

回帖

6016

积分

版主

积分
6016
发表于 2024-10-20 13:27:46 | 显示全部楼层
初步怀疑是有其他中断打断串口标志位操作了,可以试一试把串口优先级调节到最高
单纯看你这个程序是看不出什么问题的,或许需要完整程序
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:221
  • 最近打卡:2025-06-16 09:04:39

10

主题

134

回帖

1209

积分

金牌会员

积分
1209
发表于 2024-10-20 14:59:40 | 显示全部楼层
看看有没有其他地方关闭中断了。可以考虑在中断里发生数据,每次填充一个字节然后等待下次中断再判断是否发送完成,不过需要有个缓冲区,更复杂一点的用环形缓冲区。这样就不用在发送的时候干等了,while(fBusy);这种方式会一直占用CPU,如果是在多任务下非常不划算。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:566
  • 最近打卡:2025-06-16 07:52:44

113

主题

2027

回帖

5810

积分

论坛元老

积分
5810
发表于 2024-10-20 15:33:17 | 显示全部楼层
远行*** 发表于 2024-10-20 14:59
看看有没有其他地方关闭中断了。可以考虑在中断里发生数据,每次填充一个字节然后等待下次中断再判断是否发 ...

只能干等,因为没有其他任务。
系统还开了Timer0中断,不过有设置串口中断优先。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:566
  • 最近打卡:2025-06-16 07:52:44

113

主题

2027

回帖

5810

积分

论坛元老

积分
5810
发表于 2024-10-20 15:33:54 | 显示全部楼层
本帖最后由 xxkj2010 于 2024-10-20 15:36 编辑
王*** 发表于 2024-10-20 13:27
初步怀疑是有其他中断打断串口标志位操作了,可以试一试把串口优先级调节到最高
单纯看你这个程序是看不出 ...

串口优先级有调节到最高(PS = 1;)
忙标志位 “fBusy” 只有这个地方和 重定义putchar系统函数 用到。


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2025-06-15 22:44:24
已绑定手机

19

主题

3231

回帖

5281

积分

论坛元老

积分
5281
发表于 2024-10-20 23:43:01 | 显示全部楼层
1秒钟,140字节时间有点长了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:566
  • 最近打卡:2025-06-16 07:52:44

113

主题

2027

回帖

5810

积分

论坛元老

积分
5810
发表于 2024-10-21 07:59:44 | 显示全部楼层
so*** 发表于 2024-10-20 23:43
1秒钟,140字节时间有点长了

也不是每个字节都会停顿,只是偶尔会停顿一下。好像是机器应付不来,休息一下那个样子。
当然,一般情况下都是很顺畅的。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:444
  • 最近打卡:2025-06-16 09:26:42
已绑定手机

39

主题

2059

回帖

7070

积分

论坛元老

积分
7070
发表于 2024-10-21 09:01:58 | 显示全部楼层
xxkj*** 发表于 2024-10-21 07:59
也不是每个字节都会停顿,只是偶尔会停顿一下。好像是机器应付不来,休息一下那个样子。
当然,一般情况下 ...

能否提供能够复现问题的最简项目程序?这样才好分析。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:462
  • 最近打卡:2025-06-16 10:02:39

33

主题

2447

回帖

5168

积分

论坛元老

积分
5168
发表于 2024-10-21 09:35:39 | 显示全部楼层
这个变量怎么定义的?加一个volatile试一试,,
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-16 18:00 , Processed in 0.150884 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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