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

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

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:690
  • 最近打卡:2025-10-31 08:05:58

125

主题

2077

回帖

4192

积分

论坛元老

积分
4192
发表于 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. }
复制代码

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

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:224
  • 最近打卡:2025-10-31 13:03:41

792

主题

1万

回帖

2万

积分

管理员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:605
  • 最近打卡:2025-10-31 18:35:33
已绑定手机
已实名认证

122

主题

2941

回帖

7648

积分

版主

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:327
  • 最近打卡:2025-10-31 09:16:28

10

主题

134

回帖

1657

积分

金牌会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:690
  • 最近打卡:2025-10-31 08:05:58

125

主题

2077

回帖

4192

积分

论坛元老

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:690
  • 最近打卡:2025-10-31 08:05:58

125

主题

2077

回帖

4192

积分

论坛元老

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

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


回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:605
  • 最近打卡:2025-11-01 00:01:02
已绑定手机

19

主题

3275

回帖

6114

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:690
  • 最近打卡:2025-10-31 08:05:58

125

主题

2077

回帖

4192

积分

论坛元老

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:544
  • 最近打卡:2025-10-31 09:14:02
已绑定手机

48

主题

2300

回帖

8110

积分

论坛元老

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:550
  • 最近打卡:2025-10-31 08:57:09

33

主题

2644

回帖

5865

积分

论坛元老

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-11-1 07:45 , Processed in 0.135895 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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