亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 為什么串口屏丟包 [打印本頁]

作者: happy2058    時間: 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 可能點一下會來兩幀。按下。再抬起









作者: coody_sz    時間: 2026-5-25 16:47
有線串口通信(無干擾)都能丟包,只能是程序執行時間安排不恰當引起的(特別是中斷函數耗時過長)。
作者: man1234567    時間: 2026-5-25 17:14
為了讓設計容錯的人有口飯吃
作者: happy2058    時間: 2026-5-26 09:14
coody_sz 發表于 2026-5-25 16:47
有線串口通信(無干擾)都能丟包,只能是程序執行時間安排不恰當引起的(特別是中斷函數耗時過長)。

我這個還好吧




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1