怎样尽量减少串口发送数据等待中断(完成)的时间?
本帖最后由 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++;
}
请问:怎样尽量减少串口发送数据等待中断(完成)的时间?
换管脚基本兼容的 8H8K64U, 有DMA支持串口发送和接收
最新 8H8K64U 数据手册
www.stcai.com/cp_stc8hxl
初步怀疑是有其他中断打断串口标志位操作了,可以试一试把串口优先级调节到最高
单纯看你这个程序是看不出什么问题的,或许需要完整程序
看看有没有其他地方关闭中断了。可以考虑在中断里发生数据,每次填充一个字节然后等待下次中断再判断是否发送完成,不过需要有个缓冲区,更复杂一点的用环形缓冲区。这样就不用在发送的时候干等了,while(fBusy);这种方式会一直占用CPU,如果是在多任务下非常不划算。 远行的鹿 发表于 2024-10-20 14:59
看看有没有其他地方关闭中断了。可以考虑在中断里发生数据,每次填充一个字节然后等待下次中断再判断是否发 ...
只能干等,因为没有其他任务。
系统还开了Timer0中断,不过有设置串口中断优先。 本帖最后由 xxkj2010 于 2024-10-20 15:36 编辑
王昱顺 发表于 2024-10-20 13:27
初步怀疑是有其他中断打断串口标志位操作了,可以试一试把串口优先级调节到最高
单纯看你这个程序是看不出 ...
串口优先级有调节到最高(PS = 1;)
忙标志位 “fBusy” 只有这个地方和 重定义putchar系统函数 用到。
1秒钟,140字节时间有点长了 soma 发表于 2024-10-20 23:43
1秒钟,140字节时间有点长了
也不是每个字节都会停顿,只是偶尔会停顿一下。好像是机器应付不来,休息一下那个样子。
当然,一般情况下都是很顺畅的。
xxkj2010 发表于 2024-10-21 07:59
也不是每个字节都会停顿,只是偶尔会停顿一下。好像是机器应付不来,休息一下那个样子。
当然,一般情况下 ...
能否提供能够复现问题的最简项目程序?这样才好分析。 这个变量怎么定义的?加一个volatile试一试,,
页:
[1]
2