找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5|回复: 0
打印 上一主题 下一主题
收起左侧

为什么串口屏丢包

[复制链接]
跳转到指定楼层
楼主
ID:734017 发表于 2026-5-25 02:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void Send_Array_UR1( u8 *str, u8 strlen)   
{  
        
u8 k = 0;
                        do  
                        {  
          SBUF = (*(str + k));
          k++;
          TI_Busy_1=1;
        while (TI_Busy_1);                                          
                        }  
                        while (k < strlen);
}  

void UARTO1_ISR() interrupt 4 //接收中断,不同处理器可能是不同的函数声明
{
u8 i; //用处提取接收缓冲器的字符
        if(TI)
                        {
                                TI  = 0;

                                TI_Busy_1 = 0;        
                        }
        if(RI)
                {
                        i=SBUF;                         //提取字符
                        RI=0;
                                
if(!complete_data_flag_1) //前台程序处完成
                                {
                                        if(RX_1) //如果接收到0XAA,继续接收后面的字符
                                                {
                                                        buffer_1[RX_P]=i; //字符存入数组
                                                if((RX_P>3)&&(buffer_1[RX_P-3]==0xcc) && (buffer_1[RX_P-2]==0x33)&&(buffer_1[RX_P-1]==0xc3)&&                                                                  (buffer_1[RX_P]==0x3c)) //判断是是否接收完毕一帧数据
                                                                {
                                                                        
                                                                       
complete_data_flag_1=1; //如果接收完成,置位RXFRMOK
                                                                        RX_1 = 0;                                 //清零开始标志位RXAAOK
                                                                        
                                                                }
                                                        RX_P++;                                       //接收计数器加一
                                                }

                                        if(!RX_1 && (i==0xaa))
                                        {
                                                RX_1=1;
                                                RX_P=0;
                                                
                                        }
                                }
        }
}

// 触摸指令处理函数

void Touch_command_selection(void)
{
    // 如果没有一帧完整数据,直接退出函数,不执行任何操作
    if (!complete_data_flag_1)
        return;



    // 判断帧头:0x79 = 触摸按键按下
    if (buffer_1[0] == 0x79)
    {
        // 如果触摸锁已经上锁,不响应任何按键
        if (Screen_touch_lock)
        {
            complete_data_flag_1 = 0;  // 清除数据接收完成标志
            return;                    // 退出,不处理
        }


        // 根据 buffer_1[2] 里的按键指令执行对应功能
        switch (buffer_1[2])
        {
            // ====================== 主页功能 ======================
            case 0xA4:  // 按下:主页 - 1
                Screen_touch_lock = 1;  // 上锁触摸,防止重复触发
                Loop_sending(6);        // 执行发送指令 6
                break;


            case 0xA5:  // 按下:主页 - 2
                Screen_touch_lock = 1;  // 上锁触摸
                Loop_sending(5);        // 执行发送指令 5
                break;


            case 0xA7:  // 按下:主页 - 3                                       //第一次按运行
                Screen_touch_lock = 1;  // 上锁触摸
                image_loop_flag = 0;     // 关闭动画循环
                Loop_sending(4);        // 执行发送指令 4
                break;


            default:
                break;  // 其他指令不处理
        }
    }
    // 判断帧头:0x78 = 触摸按键松开
    else if (buffer_1[0] == 0x78)
    {
        Screen_touch_lock = 0;  // 解锁触摸,可以再次响应
    }


    // 数据处理完毕,清除接收完成标志,准备接收下一帧数据
    complete_data_flag_1 = 0;
}


// 水模式动画循环函数
void image_loop(void)
{
    static u8 count = 0;  // 静态变量:保存帧计数,不会被重置


    // 循环:只要 image_loop_flag = 1,就一直跑动画
    do
    {
        if (++count > 60)  // 计数自增,超过60归零
            count = 0;


        HIM_page_0_temp[2] = count;        // 把计数值放入发送数组
        Send_Array_UR1(HIM_page_0_temp, 7); // 发送一帧动画数据
        delay_ms(60);                      // 延时60ms,控制动画速度
        Touch_command_selection();         // 调用触摸处理,检测按键    第一次按下


    } while (image_loop_flag);  // 判断是否继续循环
}


// 主函数:程序入口
void main()
{
    IOsatar();                                                // 芯片IO口初始化
      Delay100ms();  // 开机延时100ms,稳定系统
    image_loop();  // 进入动画循环(一旦进入,除非flag=0,否则不退出)


    // 主死循环:系统正常运行任务
    while(1)
    {
        TIME_START();         // 计时/定时器启动      
        Touch_command_selection();  // 触摸按键指令处理    //第二,三次按下判断
        While_loop_sending(); // 循环发送数据
    }
}


流程
开机给屏幕发送动画循环,当按下屏幕后转跳。(第一次按下可以正常切换页面,再次按下没反应,第三次按下正常了)
第一次按下后,T
ouch_command_selection(); i函数里mage_loop_flag = 0;     // 关闭动画循环
程序到达while(1) 不然第一次就不会切换面。但是complete_data_flag_1 = 0;这条有时候不运行。导至第二次按下屏幕没反应。

如果中断发生在delay_ms(60);  只运行了按下,锁键,没有抬起动作,第二次按下没反应该?等待抬起?


delay_ms(60);                      // 延时60ms,控制动画速度
        Touch_command_selection();         // 调用触摸处理,检测按键    第一次按下
complete_data_flag_1 = 0; 在这里增加后,正常了。没想明白。

屏幕下发间隔100MS 可能点一下会来两帧。按下。再抬起








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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