久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2777|回復: 6
打印 上一主題 下一主題
收起左側

關于51單片機串口通信 中斷服務函數處理數據問題,希望前輩們可以幫忙看看,指點一二...

[復制鏈接]
跳轉到指定樓層
樓主
ID:894654 發表于 2021-5-26 21:36 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關于51單片機串口通信 中斷服務函數處理數據問題,希望前輩們可以幫忙看看,指點一二...在此表示感謝用的單片機是STC8A8K  在中斷服務函數里 開了8個數組進行保存上位機發下來的8個數組,處理數據是在中斷服務函數里處理的.用的是狀態機的思想.開兩個數組的時候沒什么太大的問題,開了8個數組就卡死了.想請教一下前輩們怎么解決這個問題啊? 把數據處理放在主函數嘛? 還是重新定義一個函數呢? 我試了試,沒能移植成功,希望前輩們能給點建議  晚輩不勝感激.

中斷服務函數代碼如下:(每個數組有兩個幀頭 一個幀尾)


void uart_ISR() interrupt 4
{unsigned int recv_data;
if(RI)
{   RI=0;
        recv_data=SBUF;
        switch(machine_step_0)
        {//接收數據存入第1個數組
        case 0:
        if(recv_data==0xAA)
        {machine_step_0=1;}
        else
        {machine_step_0=0;}
        break;
       
        case 1:
        if(recv_data==0x55)
        {machine_step_0=2;
        recv_cnt_0=0;
        }
        else
        {machine_step_0=0;}
        break;
       
        case 2:
        if(recv_data!=0x0A)
        { recv_buf_0[recv_cnt_0]=recv_data;
          recv_cnt_0++;
          }       
        else
        {
        machine_step_0=3;
        }
    break;
        //接收數據存入第2個數組
        case 3:
        if(recv_data==0xBB)
        {
    machine_step_0=4;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 4:
        if(recv_data==0x44)
        {
    machine_step_0=5;
        recv_cnt_1=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 5:
        if(recv_data!=0x0B)
        {
        recv_buf_1[recv_cnt_1]=recv_data;
        recv_cnt_1++;
        }
        else
        {
        machine_step_0=6;
        }
    break;
        //接收數據存入第3個數組
        case 6:
        if(recv_data==0xCC)
        {
    machine_step_0=7;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 7:
        if(recv_data==0x33)
        {
    machine_step_0=8;
        recv_cnt_2=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 8:
        if(recv_data!=0x0C)
        {
        recv_buf_2[recv_cnt_2]=recv_data;
        recv_cnt_2++;
        }
        else
        {
        machine_step_0=9;
        }
    break;
        //接收數據存入第4個數組
        case 9:
        if(recv_data==0xDD)
        {
    machine_step_0=10;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 10:
        if(recv_data==0x22)
        {
    machine_step_0=11;
        recv_cnt_3=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 11:
        if(recv_data!=0x0D)
        {
        recv_buf_3[recv_cnt_3]=recv_data;
        recv_cnt_3++;
        }
        else
        {
        machine_step_0=12;
        }
    break;
        //接收數據存入第5個數組
        case 12:
        if(recv_data==0xEE)
        {led=0;
    machine_step_0=13;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 13:
        if(recv_data==0x11)
        {
    machine_step_0=14;
        recv_cnt_4=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 14:
        if(recv_data!=0x0E)
        {
        recv_buf_4[recv_cnt_4]=recv_data;
        recv_cnt_4++;
        }
        else
        {
        machine_step_0=15;
        }
    break;
        //接收數據存入第6個數組
        case 15:
        if(recv_data==0xFF)
        {
    machine_step_0=16;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 16:
        if(recv_data==0x55)
        {
    machine_step_0=17;
        recv_cnt_5=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 17:
        if(recv_data!=0x0F)
        {
        recv_buf_5[recv_cnt_5]=recv_data;
        recv_cnt_5++;
        }
        else
        {
        machine_step_0=18;
        }
    break;
        //接收數據存入第7個數組
        case 18:
        if(recv_data==0xAB)
        {
    machine_step_0=19;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 19:
        if(recv_data==0x44)
        {
    machine_step_0=20;
        recv_cnt_6=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 20:
        if(recv_data!=0x1A)
        {
        recv_buf_6[recv_cnt_6]=recv_data;
        recv_cnt_6++;
        }
        else
        {
        machine_step_0=21;
        }
    break;
        //接收數據存入第8個數組
        case 21:
        if(recv_data==0xCD)
        {
    machine_step_0=22;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 22:
        if(recv_data==0x33)
        {
    machine_step_0=23;
        recv_cnt_7=0;
        }
        else
        {
        machine_step_0=0;
        }
    break;
       
        case 23:
        if(recv_data!=0x1B)
        {
        recv_buf_7[recv_cnt_7]=recv_data;
        recv_cnt_7++;
        }
        else
        {
        recv_cnt_0=0;
        recv_cnt_1=0;
        machine_step_0=0;
        recv_flag_0=1;
        led1=0;
        }
    break;
       
        default:break;
        }}
if(TI)
  {TI=0;}
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:213173 發表于 2021-5-27 06:31 | 只看該作者
一般來說串口中斷函數只負責正確接收數據。根據通信協議對諸如數據頭尾,長度等部分判斷。逐字節接收并保存在緩沖數組中,不具體處理數據內容。一幀數據串接收結束后產生完成標志。然后在主函數中解析處理數據,執行相應任務。
回復

使用道具 舉報

板凳
ID:894654 發表于 2021-5-27 09:06 | 只看該作者
wulin 發表于 2021-5-27 06:31
一般來說串口中斷函數只負責正確接收數據。根據通信協議對諸如數據頭尾,長度等部分判斷。逐字節接收并保存 ...

所以一般是先將一包數據完整接收到一個緩沖數組中,然后再對應解析嘛?  因為sram空間有限,我就想著直接接收放在對應數組了,就沒開一個大的數組先接收全部數據了.
回復

使用道具 舉報

地板
ID:928015 發表于 2021-5-27 10:37 | 只看該作者
中斷一般只收數,不處理。否則很容易發生中斷嵌套,或者看門狗溢出。
回復

使用道具 舉報

5#
ID:451718 發表于 2021-5-27 11:57 | 只看該作者
你那些recv_buf_0[]到recv_buf_7[],在編譯的時候,不是一樣會占用內存么?   直接用結構體來緩存,結構體里面在申明recv_buf_0[]到recv_buf_7[],這樣就可以用  結構體名稱.recv_buf_0[]來調用實際數據了。
回復

使用道具 舉報

6#
ID:894654 發表于 2021-5-27 13:37 | 只看該作者
robinsonlin 發表于 2021-5-27 11:57
你那些recv_buf_0[]到recv_buf_7[],在編譯的時候,不是一樣會占用內存么?   直接用結構體來緩存,結構體 ...

是說直接將處理好的數據直接放結構體嘛?
回復

使用道具 舉報

7#
ID:894654 發表于 2021-5-27 13:40 | 只看該作者
xkdigital 發表于 2021-5-27 10:37
中斷一般只收數,不處理。否則很容易發生中斷嵌套,或者看門狗溢出。

好的 謝謝你。我以為為了節省空間可以在中斷里邊接收邊解析放對應數組的。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品视频一区 | 久久专区 | 在线播放中文字幕 | 国产在线精品一区二区三区 | 毛片免费观看 | 国产精品久久久久久久久久免费看 | 一级毛片免费 | 亚洲风情在线观看 | 日韩欧美中文在线 | 亚洲国产成人精品女人久久久 | 成人深夜福利在线观看 | 欧美亚洲国产日韩 | 日韩国产三区 | 韩国成人在线视频 | 四虎影院新地址 | 国产精品福利网站 | 日韩一区二区三区四区五区六区 | 色爱区综合 | 久久午夜精品福利一区二区 | 国产一区二区毛片 | 亚洲精品一区二区三区中文字幕 | 国产资源在线视频 | 亚洲视频自拍 | 日韩一区二区三区视频 | 国产精品国产精品国产专区不蜜 | 第一av| 亚洲图片视频一区 | 久久鲁视频 | 中文在线a在线 | av片免费 | 免费艹逼视频 | 国产精品久久久久久久 | 好姑娘影视在线观看高清 | 九九热在线观看 | 一区影院 | 欧美亚洲国产一区 | 久久99精品久久久久蜜桃tv | av网站免费观看 | 国产良家自拍 | 国产精品久久久久久久久久三级 | 午夜视频网站 |