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

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

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

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

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:54
  • 最近打卡:2025-05-01 09:07:55

717

主题

1万

回帖

1万

积分

管理员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2219

回帖

5452

积分

版主

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:177
  • 最近打卡:2025-04-30 13:52:43

10

主题

134

回帖

993

积分

高级会员

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

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

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


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-01 09:54:52
已绑定手机

19

主题

3190

回帖

4866

积分

论坛元老

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:520
  • 最近打卡:2025-05-01 08:06:21

109

主题

1897

回帖

5204

积分

论坛元老

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

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

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 02:30 , Processed in 0.151712 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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