xxkj2010 发表于 2024-10-20 12:03:11

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

本帖最后由 DebugLab 于 2024-10-20 19:05 编辑

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

void SendDat(u8 *dat, u8 len) //向串口发送数据
{
    u8 i;
    for (i = 0; i < len; i++)
    {
      fBusy = 1;
      SBUF = dat;
      while (fBusy) ;//有时会停留在这里近1秒的时间
    }
    ge = 0;
}


void uart_isr() interrupt 4
{
    if (TI)
    {
      TI = 0;
      fBusy = 0;
    }

    if (RI)
    {
      RI = 0;
      ckdat = SBUF;
            ge++;
}
请问:怎样尽量减少串口发送数据等待中断(完成)的时间?

神农鼎 发表于 2024-10-20 12:10:44

换管脚基本兼容的 8H8K64U, 有DMA支持串口发送和接收

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

王昱顺 发表于 2024-10-20 13:27:46

初步怀疑是有其他中断打断串口标志位操作了,可以试一试把串口优先级调节到最高
单纯看你这个程序是看不出什么问题的,或许需要完整程序

远行的鹿 发表于 2024-10-20 14:59:40

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

xxkj2010 发表于 2024-10-20 15:33:17

远行的鹿 发表于 2024-10-20 14:59
看看有没有其他地方关闭中断了。可以考虑在中断里发生数据,每次填充一个字节然后等待下次中断再判断是否发 ...

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

xxkj2010 发表于 2024-10-20 15:33:54

本帖最后由 xxkj2010 于 2024-10-20 15:36 编辑

王昱顺 发表于 2024-10-20 13:27
初步怀疑是有其他中断打断串口标志位操作了,可以试一试把串口优先级调节到最高
单纯看你这个程序是看不出 ...
串口优先级有调节到最高(PS = 1;)
忙标志位 “fBusy” 只有这个地方和 重定义putchar系统函数 用到。


soma 发表于 2024-10-20 23:43:01

1秒钟,140字节时间有点长了

xxkj2010 发表于 2024-10-21 07:59:44

soma 发表于 2024-10-20 23:43
1秒钟,140字节时间有点长了
也不是每个字节都会停顿,只是偶尔会停顿一下。好像是机器应付不来,休息一下那个样子。
当然,一般情况下都是很顺畅的。

乘风飞扬 发表于 2024-10-21 09:01:58

xxkj2010 发表于 2024-10-21 07:59
也不是每个字节都会停顿,只是偶尔会停顿一下。好像是机器应付不来,休息一下那个样子。
当然,一般情况下 ...

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

_奶咖君_ 发表于 2024-10-21 09:35:39

这个变量怎么定义的?加一个volatile试一试,,
页: [1] 2
查看完整版本: 怎样尽量减少串口发送数据等待中断(完成)的时间?