迪文科技论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: naze

【跪求】为什么串口中断有时候会掉帧

[复制链接]

3

主题

8

回帖

128

积分

注册会员

Rank: 2

积分
128
 楼主| 发表于 2026-5-18 16:19:47 | 显示全部楼层
nearsea 发表于 2026-5-18 15:04
那说明你自己写的OS程序有问题呗,优化一些,估计没算过通讯中断时间或者其它中断影响了串口中断的调用, ...

就是检查过了,就只有定时器2中断,没其他什么中断了,就是在想中断中会不会因为51跟GUI写入或者读取函数有关系,我功能函数用了不少写入读取,把功能函数屏蔽,串口就不会掉帧
回复

使用道具 举报

3

主题

8

回帖

128

积分

注册会员

Rank: 2

积分
128
 楼主| 发表于 2026-5-18 16:41:51 | 显示全部楼层
本帖最后由 naze 于 2026-5-18 16:44 编辑
紫狐 发表于 2026-5-17 09:07
应该是频繁的读写导致GUI繁忙。主循环中读写尽量用定时处理,定时个10~20ms操作一次。 ...

这个写读有什么建议吗,集中读写在定时10~20ms后处理?写入是用这段函数while(APP_ACK==0);中这里大概是要等多久的


void sys_write_vp(u16 addr,u8* buf,u16 len)
{   
        u8 i;  
        //while((UserUart.Tstate|UserUart.Rstate) != USART_STA_N);
                //u16 timeout = 1000;
                i = (u8)(addr&0x01);
                addr >>= 1;
                ADR_H = 0x00;
                ADR_M = (u8)(addr>>8);
                ADR_L = (u8)addr;   
                ADR_INC = 0x01;
                RAMMODE = 0x8F;
                while(APP_ACK==0);
                if(i && len>0)
                {       
                        RAMMODE = 0x83;       
                        DATA1 = *buf++;               
                        DATA0 = *buf++;       
                        APP_EN = 1;               
                        len--;
                }
                RAMMODE = 0x8F;
                while(len>=2)
                {       
                        DATA3 = *buf++;               
                        DATA2 = *buf++;
                        DATA1 = *buf++;               
                        DATA0 = *buf++;
                        APP_EN = 1;               
                        len -= 2;
                }
                if(len)
                {       
                        RAMMODE = 0x8C;
                        DATA3 = *buf++;               
                        DATA2 = *buf++;
                        APP_EN = 1;
                }
                RAMMODE = 0x00;       


回复

使用道具 举报

0

主题

524

回帖

3077

积分

论坛元老

Rank: 8Rank: 8

积分
3077
发表于 2026-5-18 17:47:32 | 显示全部楼层

用下面的读写函数试下。定时处理可以有效的降低cpu负载。
void read_dgus_vp(u16 addr, u8 *buf, u16 len)
{
    u16 OS_addr = 0;
    u16 OS_addr_offset = 0;
    u16 OS_len = 0, OS_len_offset = 0;
    u32 LenLimit;

    if (0 == len)
        return;
    LenLimit = 0xffffU - addr + 1;
    if (LenLimit < len)
    {
        len = LenLimit;
    }
    OS_addr = addr >> 1;
    OS_addr_offset = addr & 0x01;
#ifdef INTVPACTION
    EA = 0;
#endif
    ADR_H = 0;
    ADR_M = (u8)(OS_addr >> 8);
    ADR_L = (u8)OS_addr;
    ADR_INC = 1;
    RAMMODE = 0xAF;
    while (!APP_ACK)
        ;
    if (OS_addr_offset)
    {
        APP_EN = 1;
        while (APP_EN)
            ;
        *buf++ = DATA1;
        *buf++ = DATA0;
        len--;
    }
    OS_len = len >> 1;
    OS_len_offset = len & 0x01;
    while (OS_len--)
    {
        APP_EN = 1;
        while (APP_EN)
            ;
        *buf++ = DATA3;
        *buf++ = DATA2;
        *buf++ = DATA1;
        *buf++ = DATA0;
    }
    if (OS_len_offset)
    {
        APP_EN = 1;
        while (APP_EN)
            ;
        *buf++ = DATA3;
        *buf++ = DATA2;
    }
    RAMMODE = 0x00;
#ifdef INTVPACTION
    EA = 1;
#endif
}
/*****************************************************************************
函 数 名  : void write_dgus_vp(u32 addr,u8* buf,u16 len)
功能描述  : 写dgus地址数据
输入参数  :
回复

使用道具 举报

0

主题

524

回帖

3077

积分

论坛元老

Rank: 8Rank: 8

积分
3077
发表于 2026-5-18 17:52:33 | 显示全部楼层
while(APP_ACK==0);这里就是等待GUI处理完成,如果GUI有占用就等的时间长。
回复

使用道具 举报

27

主题

207

回帖

2539

积分

金牌会员

Rank: 6Rank: 6

积分
2539
发表于 2026-5-18 18:38:37 | 显示全部楼层
可以不关中断先测试一下,未必就是因为刷新问题,估计还是中断函数写的不规范,串口保存数据判断超时应该是很轻的任务,不要在主程序里面处理了,主程序要是真的等刷新或者是什么主流程有阻塞任务肯定就丢数据了。
回复

使用道具 举报

3

主题

8

回帖

128

积分

注册会员

Rank: 2

积分
128
 楼主| 发表于 2026-5-19 12:05:21 | 显示全部楼层
nearsea 发表于 2026-5-18 18:38
可以不关中断先测试一下,未必就是因为刷新问题,估计还是中断函数写的不规范,串口保存数据判断超时应该是 ...

关闭所有中断都试过了,还是会有掉帧问题,我现在打算试一下楼上定时处理一下读写,或者我调试一下串口接收多帧数据
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2026-6-16 18:15 , Processed in 0.034123 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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