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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2714|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)教單片機(jī)如何避免串口接收數(shù)據(jù)丟失?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:734017 發(fā)表于 2021-10-13 00:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
單片機(jī)與觸控屏通信  按下屏幕下發(fā) AA 79 ** ** 33 cc c3 3c  抬起屏幕下發(fā) AA 78 ** ** 33 cc c3 3c  中間兩個(gè)字節(jié)用戶定義相同指令
以下部分代碼
uchar buf[16];      //接收緩存區(qū)     這里因?yàn)樯想娢帐肿畲箝L度,所以給了16  下面程序只用到8個(gè)字節(jié)
uchar rp = 0;       //緩存區(qū)地址

void interrupt_uart() interrupt 4 //using 3   //串口接收,定時(shí)器2 115200
{
                if (RI)  
                        {  
                        RI = 0 ;               
                        buf[ rp++ ] = SBUF;
                        if(SBUF==0X3C)                      //接收到尾 地址復(fù)位
                                rp=0;               
                        }
        }



void key_service()                //放在大循環(huán)        while(1) 里一直調(diào)用                                                
{        
switch(buf[1])                         //對(duì)應(yīng)該按下 指令 79后進(jìn)行比較                                       
                        {
                                case 0X79:
                                
                                if(        buf[3]==0x01 && buf[7]==0x3c)             //buf[3]==0x01 是用戶指令01 只判定buf[3]                                       
                                 {
                                        memset(buf, 0, 16)
                                       **********此處省略**********
                                }
                                if(        buf[3]==0x02 && buf[7]==0x3c)                                                
                                {
                                           memset(buf, 0, 16)
                                        **********此處省略**********        
                                }
                                if(        buf[3]==0x03 && buf[7]==0x3c)                                                
                                {        
                                          memset(buf, 0, 16)
                                        **********此處省略**********
                                }
                                if(        buf[3]==0x04 && buf[7]==0x3c)                                                               
                                {
                                          memset(buf, 0, 16)
                                      **********此處省略**********
                                }
                                
                                ......................        
                               總共15個(gè)IF判斷
                        
                                break;        
                        
                        case 0X78:             //對(duì)應(yīng)該抬起 指令 78后進(jìn)行比較        
               
                                if(buf[0]==0xAA && buf[7]==0x3c)               //   接收完成
                        {        
                                for(i=0;i<16;i++)                                   //清空緩存區(qū)
                                {
                                        buf[ i]=0;
                                }
                                                               
                                //memset(buf, 0, 16)                              //清空緩存區(qū)   感覺這個(gè)函數(shù)比較費(fèi)時(shí),所以沒用 ,求指教
                        }
                                
                                  break;  
                                default:break;
                        }
}


目前程序運(yùn)行正常。
請(qǐng)問,如果數(shù)據(jù)接收慢,當(dāng)case 0X79: 跑完了,用戶指令才來,或者我要比較指令01 。但可能跑到03去比較了。這時(shí)候 01 才到。那么這一次不執(zhí)行。退出 case 0X79: 這時(shí)候緩存區(qū)未被清空,(此處為單次點(diǎn)擊)
當(dāng)抬起屏幕的時(shí)候指令78來了,會(huì)覆蓋緩存區(qū) ,然后 switch(buf[1]) 在while(1) 里一直調(diào)用。直到清空
(正常操作點(diǎn)擊屏幕按下抬起不作停留 。屏幕下發(fā)數(shù)據(jù)是  AA 79**********   AA 78 ********** 中間有很短的間隔)
這次點(diǎn)擊那就無效了。
如果在case 0X79后面加上while (buf[7]!=0x3c) 防止沒接收完就判斷,會(huì)有多大影響。謝謝大家
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:460753 發(fā)表于 2021-10-13 07:45 | 只看該作者
參考宋老師的串口接收部份。百度金沙灘工作室
回復(fù)

使用道具 舉報(bào)

板凳
ID:236035 發(fā)表于 2021-10-13 08:00 | 只看該作者
再加緩存,就不怕buf[]的變化了。當(dāng)一幀數(shù)據(jù)接收完畢,置標(biāo)志位,放入緩存,再進(jìn)行數(shù)據(jù)處理。
回復(fù)

使用道具 舉報(bào)

地板
ID:57657 發(fā)表于 2021-10-13 08:09 | 只看該作者
請(qǐng)?zhí)峁┫虏ㄌ芈屎途д耦l率確定是否為誤碼率高。
回復(fù)

使用道具 舉報(bào)

5#
ID:554500 發(fā)表于 2021-10-13 08:21 | 只看該作者
如果你的單片機(jī)處理速度比較慢,那就降低波特率。或者采用閉環(huán)控制的方式。
回復(fù)

使用道具 舉報(bào)

6#
ID:94031 發(fā)表于 2021-10-13 08:35 | 只看該作者
應(yīng)該是一幀數(shù)據(jù)接收完設(shè)置標(biāo)志,再進(jìn)行判斷,不應(yīng)該收一個(gè)判斷一個(gè)。
回復(fù)

使用道具 舉報(bào)

7#
ID:734017 發(fā)表于 2021-10-13 09:51 | 只看該作者
npn 發(fā)表于 2021-10-13 08:09
請(qǐng)?zhí)峁┫虏ㄌ芈屎途д耦l率確定是否為誤碼率高。

24M 1T  115200
回復(fù)

使用道具 舉報(bào)

8#
ID:429003 發(fā)表于 2021-10-13 10:16 | 只看該作者
總體思路:中斷僅緩存接收數(shù)據(jù),接收完畢喚醒任務(wù)處理數(shù)據(jù)。
使用一個(gè)定時(shí)器,每次串口中斷接收到一個(gè)字節(jié),緩存數(shù)據(jù)后更新定時(shí)器延后一段時(shí)間產(chǎn)生定時(shí)器超時(shí)中斷,只要串口連續(xù)接收到數(shù)據(jù),超時(shí)中斷不會(huì)產(chǎn)生,反之只要定時(shí)器發(fā)生超時(shí)中斷,則判定為一幀連續(xù)數(shù)據(jù)接收完畢。
整個(gè)串口數(shù)據(jù)接收過程,全部由串口和定時(shí)器中斷完成,無需任務(wù)參與,任務(wù)只需要在接收完畢后由定時(shí)器中斷喚醒后做數(shù)據(jù)幀解析處理。
如果其它功能應(yīng)用對(duì)中斷占用時(shí)間不敏感,可以直接在定時(shí)器超時(shí)中斷里面處理數(shù)據(jù)幀。全程任務(wù)完全無需參與了。
回復(fù)

使用道具 舉報(bào)

9#
ID:57657 發(fā)表于 2021-10-13 11:00 | 只看該作者

串口需要用 22.1184Mhz 或 33.1776Mhz 才可以的。
回復(fù)

使用道具 舉報(bào)

10#
ID:971661 發(fā)表于 2021-10-13 11:50 | 只看該作者
增加數(shù)據(jù)緩存是比較好的方法,可以的話最好做個(gè)環(huán)形隊(duì)列,先進(jìn)先出。
回復(fù)

使用道具 舉報(bào)

11#
ID:158375 發(fā)表于 2021-10-13 14:12 | 只看該作者
建議改變整個(gè)程序結(jié)構(gòu),那樣更簡單,更有效。
回復(fù)

使用道具 舉報(bào)

12#
ID:123289 發(fā)表于 2021-10-13 17:10 | 只看該作者
所有的中斷程序處理時(shí)間,不大于1個(gè)字節(jié)的串行拼裝時(shí)間,你能做到就可以。
回復(fù)

使用道具 舉報(bào)

13#
ID:971769 發(fā)表于 2021-10-13 17:17 | 只看該作者
加緩存, 數(shù)據(jù)接收完畢,設(shè)置標(biāo)志位,放入緩存后再進(jìn)行數(shù)據(jù)處理
回復(fù)

使用道具 舉報(bào)

14#
ID:624769 發(fā)表于 2021-10-13 20:46 | 只看該作者
做緩沖池,比如你一個(gè)指令8個(gè)字節(jié),你做一個(gè)128字節(jié)的緩沖池,最多保存16個(gè)指令,那么,應(yīng)該就沒啥問題了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产三级大片 | 91xh98hx 在线 国产| 色狠狠桃花综合 | 99久久久久久久久 | 波多野结衣一区二区三区在线观看 | 国产免费a | 午夜欧美一区二区三区在线播放 | 狠狠影院 | japanhd美女动| 国产精品视频入口 | 中文字幕亚洲欧美日韩在线不卡 | 夜久久| 亚洲一区中文字幕在线观看 | 龙珠z国语版在线观看 | 国产精品久久国产精品 | av电影手机在线看 | 久草院线| 国内精品久久久久久久影视简单 | 国产精品久久久久av | 国产精品美女久久久久久久网站 | 久久99精品久久久久蜜桃tv | 久久免费视频网 | 91网站在线观看视频 | 成人欧美一区二区三区视频xxx | 狠狠狠 | 国产一区不卡 | 国产精品爱久久久久久久 | 中文字幕高清 | 日本久久一区二区三区 | 午夜影院在线观看 | 欧美日韩电影一区二区 | 欧美 视频 | 国产一区二区免费在线 | 免费黄色日本 | 精品久久电影 | 鲁一鲁资源影视 | 国产精品欧美精品日韩精品 | 免费午夜视频在线观看 | 久久精品91久久久久久再现 | 国产精品我不卡 | av在线电影网 |