一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法
【專利摘要】本發(fā)明屬于光電產(chǎn)品應用【技術(shù)領(lǐng)域】,具體涉及一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法。包括以下步驟:(1)打開設(shè)備與DSP連接的串口,設(shè)置設(shè)備主板與DSP兩端的串口參數(shù)一致;分配讀取串口數(shù)據(jù)的緩沖區(qū);建立堆棧組,清空堆棧組;(2)循環(huán)監(jiān)聽按鍵的操作;(3)按鍵操作產(chǎn)生的數(shù)據(jù),由DSP獲取并通過串口發(fā)送到設(shè)備,存放到設(shè)備的臨時數(shù)據(jù)緩沖區(qū)中;依次讀取緩沖區(qū)中的數(shù)據(jù);(4)設(shè)定一個時間閾值,每隔一個時間閾值,掃描一次數(shù)據(jù)緩沖區(qū);(5)根據(jù)協(xié)議中規(guī)定的長度讀取堆棧組中的每個堆棧棧頂相應數(shù)目的元素進行處理;(6)系統(tǒng)退出程序時,進行下一步驟;否則,重復進行步驟(2)~步驟(5);(7)關(guān)閉串口,清空堆棧組,釋放為接收數(shù)據(jù)分配的內(nèi)存資源。
【專利說明】一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于光電產(chǎn)品應用【技術(shù)領(lǐng)域】,具體涉及一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法。
【背景技術(shù)】
[0002]通過按鍵實現(xiàn)人機交互或控制功能是數(shù)字電路設(shè)計中經(jīng)常遇到的一種方式。因為按鍵都是機械開關(guān)結(jié)構(gòu),由于機械觸點的彈性及電壓突跳等原因,在觸點閉合和斷開的瞬間會出現(xiàn)電壓抖動,導致在按鍵的初始狀態(tài)和終止狀態(tài)之間會產(chǎn)生一個或多個中間狀態(tài),如果不加處理,會產(chǎn)生意想不到的后果,尤其是在需要精確控制的地方。去除按鍵抖動的軟件方法有延遲法和抖動法。延遲法需要知道按鍵抖動的時間長短,掃描時間設(shè)置不當會導致等待時間過長或漏掉數(shù)據(jù);采樣法由于對噪聲的不敏感,很容易出現(xiàn)錯誤。
[0003]因此,亟需一種基于堆棧的去除鍵抖動的實現(xiàn)方法,在獲取按鍵的信號后,通過利用堆棧數(shù)據(jù)結(jié)構(gòu)的后入先出特性,將鍵抖動產(chǎn)生的中間狀態(tài)去除,從而達到精確控制的目的。
【發(fā)明內(nèi)容】
[0004]本發(fā)明要解決的技術(shù)問題是提供一種基于堆棧的去除鍵抖動的實現(xiàn)方法,在獲取按鍵的信號后,通過利用堆棧數(shù)據(jù)結(jié)構(gòu)的后入先出特性,將鍵抖動產(chǎn)生的中間狀態(tài)去除,從而達到精確控制的目的。
[0005]為了實現(xiàn)這一目的,本發(fā)明采取的技術(shù)方案是:
[0006]一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法,包括以下步驟:
[0007](1)打開設(shè)備與DSP (數(shù)字信號處理器)連接的串口,設(shè)置設(shè)備主板與DSP兩端的以下串口參數(shù)一致:波特率、數(shù)據(jù)位數(shù)、奇偶校驗、停止位數(shù);
[0008]分配讀取串口數(shù)據(jù)的緩沖區(qū);
[0009]建立堆棧組以同時獲取N個按鍵操作產(chǎn)生的數(shù)據(jù),N≥1 ;
[0010]堆棧組的長度為通信協(xié)議的條數(shù);
[0011]清空堆棧組;
[0012](2)循環(huán)監(jiān)聽按鍵的操作;
[0013](3)按鍵操作產(chǎn)生的數(shù)據(jù),由DSP獲取并通過串口發(fā)送到設(shè)備,存放到設(shè)備的臨時數(shù)據(jù)緩沖區(qū)中;
[0014]同步控制對象,將讀取操作放在同步控制對象限制的范圍內(nèi)以防止數(shù)據(jù)緩沖區(qū)發(fā)生讀取和寫入引起的沖突;
[0015]依次讀取緩沖區(qū)中的數(shù)據(jù),依照DSP和設(shè)備的通信協(xié)議,根據(jù)標識位將協(xié)議規(guī)定長度的數(shù)據(jù)壓入到堆棧組的相應索引位置的堆棧中;
[0016]控制每條協(xié)議的標識位彼此不同,且與協(xié)議中的其它信息不同;
[0017](4)設(shè)定一個時間閾值,每隔一個時間閾值,掃描一次數(shù)據(jù)緩沖區(qū);[0018]在一個時間閾值內(nèi),當數(shù)據(jù)緩沖區(qū)中持續(xù)有數(shù)據(jù)到來時,按鍵操作產(chǎn)生的信號仍在發(fā)送,進行步驟(3);
[0019]在一個時間閾值內(nèi),數(shù)據(jù)緩沖區(qū)中沒有數(shù)據(jù)到來,按鍵操作產(chǎn)生的信號已經(jīng)全部獲取,進行下一步驟;
[0020](5)根據(jù)協(xié)議中規(guī)定的長度讀取堆棧組中的每個堆棧棧頂相應數(shù)目的元素進行處理;
[0021]步驟(5)中,采取如下措施保證數(shù)據(jù)的正確性:①在讀取數(shù)據(jù)前,通過對比數(shù)據(jù)長度對堆棧組中的每個堆棧中的數(shù)據(jù)進行判斷,以確定讀取到協(xié)議的完整性;②在取得按照協(xié)議規(guī)定長度的數(shù)據(jù)后,校驗數(shù)據(jù)的頭部、尾部是否與協(xié)議規(guī)定的相同,數(shù)據(jù)的校驗和是否與校驗位相同;
[0022]分析數(shù)據(jù)以保證數(shù)據(jù)的正確性;然后對數(shù)據(jù)行解析,進行系統(tǒng)規(guī)定的操作,同時清空堆棧組;
[0023](6)系統(tǒng)退出程序時,進行下一步驟;
[0024]否則,重復進行步驟(2)?步驟(5);
[0025](7)關(guān)閉串口,清空堆棧組,釋放為接收數(shù)據(jù)分配的內(nèi)存資源。
[0026]進一步的,如上所述的一種基于堆棧的去除鍵抖動的實現(xiàn)方法,其中:步驟(3)中,同步控制對象采用以下方式中的一種或多種:臨界區(qū)、信號量、事件。
[0027]進一步的,如上所述的一種基于堆棧的去除鍵抖動的實現(xiàn)方法,其中:步驟(3)中,各條協(xié)議的長度相同。
[0028]進一步的,如上所述的一種基于堆棧的去除鍵抖動的實現(xiàn)方法,其中:步驟(4)中,時間閾值為l(T30ms。
[0029]進一步的,如上所述的一種基于堆棧的去除鍵抖動的實現(xiàn)方法,其中:步驟(5)中,采取如下措施保證數(shù)據(jù)的正確性:①在讀取數(shù)據(jù)前,通過對比數(shù)據(jù)長度對堆棧組中的每個堆棧中的數(shù)據(jù)進行判斷,以確定讀取到協(xié)議的完整性;②在取得按照協(xié)議規(guī)定長度的數(shù)據(jù)后,校驗數(shù)據(jù)的頭部、尾部是否與協(xié)議規(guī)定的相同,數(shù)據(jù)的校驗和是否與校驗位相同。
[0030]采用本發(fā)明技術(shù)方案的一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法,在切換具有多個狀態(tài)的開關(guān)時,通過串口調(diào)試助手可以看到會有多個中間狀態(tài)。利用該方法,可以正確獲取最后一個狀態(tài)信息,即最終狀態(tài)。
【專利附圖】
【附圖說明】
[0031]圖1是本發(fā)明一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法的流程示意圖。
【具體實施方式】
[0032]下面結(jié)合附圖對本發(fā)明技術(shù)方案進行進一步詳細說明。
[0033]按鍵操作后,DSP通過串口和設(shè)備進行通信??紤]到按鍵操作后,無論從初始狀態(tài)經(jīng)過多少個中間過程,都會停在終止狀態(tài)。利用堆棧的后入先出特性,將從串口接收的數(shù)據(jù)依次壓入堆棧中,這樣初始狀態(tài)壓入棧底,中間狀態(tài)依次壓入棧中,最終狀態(tài)會位于棧頂。然后取出棧頂?shù)臄?shù)據(jù),即為最終狀態(tài)數(shù)據(jù)。最后清空整個堆棧,用于下次按鍵操作的數(shù)據(jù)處理。[0034]如圖1所示,本發(fā)明一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法的具體步驟包括:
[0035](I)打開設(shè)備與DSP連接的串口,設(shè)置設(shè)備主板與DSP兩端的以下串口參數(shù)一致:波特率、數(shù)據(jù)位數(shù)、奇偶校驗、停止位數(shù);
[0036]分配讀取串口數(shù)據(jù)的緩沖區(qū);
[0037]建立堆棧組以同時獲取N個按鍵操作產(chǎn)生的數(shù)據(jù),N≥I ;
[0038]堆棧組的長度為通信協(xié)議的條數(shù);
[0039]清空堆棧組;
[0040](2)循環(huán)監(jiān)聽按鍵的操作;
[0041](3)按鍵操作產(chǎn)生的數(shù)據(jù),由DSP獲取并通過串口發(fā)送到設(shè)備,存放到設(shè)備的臨時數(shù)據(jù)緩沖區(qū)中;
[0042]采用以下方式中的一種或多種:臨界區(qū)、信號量、事件來同步控制對象,將讀取操作放在同步控制對象限制的范圍內(nèi)以防止數(shù)據(jù)緩沖區(qū)發(fā)生讀取和寫入引起的沖突;
[0043]依次讀取緩沖區(qū)中的數(shù)據(jù),依照DSP和設(shè)備的通信協(xié)議,根據(jù)標識位將協(xié)議規(guī)定長度的數(shù)據(jù)壓入到堆棧組的相應索引位置的堆棧中;
[0044]控制每條協(xié)議 的標識位彼此不同,且與協(xié)議中的其它信息不同;
[0045]此具體實施例中,各條協(xié)議的長度相同。
[0046](4)設(shè)定一個時間閾值,每隔一個時間閾值,掃描一次數(shù)據(jù)緩沖區(qū);
[0047]在一個時間閾值內(nèi),當數(shù)據(jù)緩沖區(qū)中持續(xù)有數(shù)據(jù)到來時,按鍵操作產(chǎn)生的信號仍在發(fā)送,進行步驟(3);
[0048]在一個時間閾值內(nèi),數(shù)據(jù)緩沖區(qū)中沒有數(shù)據(jù)到來,按鍵操作產(chǎn)生的信號已經(jīng)全部獲取,進行下一步驟;
[0049]此具體實施例中,時間閾值為l(T30ms。
[0050](5)根據(jù)協(xié)議中規(guī)定的長度讀取堆棧組中的每個堆棧棧頂相應數(shù)目的元素進行處理;
[0051]步驟(5)中,采取如下措施保證數(shù)據(jù)的正確性:①在讀取數(shù)據(jù)前,通過對比數(shù)據(jù)長度對堆棧組中的每個堆棧中的數(shù)據(jù)進行判斷,以確定讀取到協(xié)議的完整性;②在取得按照協(xié)議規(guī)定長度的數(shù)據(jù)后,校驗數(shù)據(jù)的頭部、尾部是否與協(xié)議規(guī)定的相同,數(shù)據(jù)的校驗和是否與校驗位相同;
[0052]分析數(shù)據(jù)以保證數(shù)據(jù)的正確性;然后對數(shù)據(jù)行解析,進行系統(tǒng)規(guī)定的操作,同時清空堆棧組;
[0053](6)系統(tǒng)退出程序時,進行下一步驟;
[0054]否則,重復進行步驟(2)~步驟(5);
[0055](7)關(guān)閉串口,清空堆棧組,釋放為接收數(shù)據(jù)分配的內(nèi)存資源。
【權(quán)利要求】
1.一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法,其特征在于:包括以下步驟: (1)打開設(shè)備與DSP連接的串口,設(shè)置設(shè)備主板與DSP兩端的以下串口參數(shù)一致:波特率、數(shù)據(jù)位數(shù)、奇偶校驗、停止位數(shù); 分配讀取串口數(shù)據(jù)的緩沖區(qū); 建立堆棧組以同時獲取N個按鍵操作產(chǎn)生的數(shù)據(jù),N^l; 堆棧組的長度為通信協(xié)議的條數(shù); 清空堆棧組; (2)循環(huán)監(jiān)聽按鍵的操作; (3)按鍵操作產(chǎn)生的數(shù)據(jù),由DSP獲取并通過串口發(fā)送到設(shè)備,存放到設(shè)備的臨時數(shù)據(jù)緩沖區(qū)中; 同步控制對象,將讀取操作放在同步控制對象限制的范圍內(nèi)以防止數(shù)據(jù)緩沖區(qū)發(fā)生讀取和與入引起的沖突; 依次讀取緩沖區(qū)中的數(shù)據(jù),依照DSP和設(shè)備的通信協(xié)議,根據(jù)標識位將協(xié)議規(guī)定長度的數(shù)據(jù)壓入到堆棧組的相應索引位置的堆棧中; 控制每條協(xié)議的標識位彼此不同,且與協(xié)議中的其它信息不同; (4)設(shè)定一個時間閾值,每隔一個時間閾值,掃描一次數(shù)據(jù)緩沖區(qū); 在一個時間閾值內(nèi),當數(shù)據(jù) 緩沖區(qū)中持續(xù)有數(shù)據(jù)到來時,按鍵操作產(chǎn)生的信號仍在發(fā)送,進行步驟(3); 在一個時間閾值內(nèi),數(shù)據(jù)緩沖區(qū)中沒有數(shù)據(jù)到來,按鍵操作產(chǎn)生的信號已經(jīng)全部獲取,進行下一步驟; (5)根據(jù)協(xié)議中規(guī)定的長度讀取堆棧組中的每個堆棧棧頂相應數(shù)目的元素進行處理; 分析數(shù)據(jù)以保證數(shù)據(jù)的正確性;然后對數(shù)據(jù)行解析,進行系統(tǒng)規(guī)定的操作,同時清空堆棧組; (6)系統(tǒng)退出程序時,進行下一步驟; 否則,重復進行步驟(2)~步驟(5); (7)關(guān)閉串口,清空堆棧組,釋放為接收數(shù)據(jù)分配的內(nèi)存資源。
2.如權(quán)利要求1所述的一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法,其特征在于:步驟(3)中,同步控制對象采用以下方式中的一種或多種:臨界區(qū)、信號量、事件。
3.如權(quán)利要求1所述的一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法,其特征在于:步驟(3)中,各條協(xié)議的長度相同。
4.如權(quán)利要求1所述的一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法,其特征在于:步驟(4)中,時間閾值為l(T30ms。
5.如權(quán)利要求1所述的一種基于堆棧的去除鍵抖動的軟件實現(xiàn)方法,其特征在于:步驟(5)中,采取如下措施保證數(shù)據(jù)的正確性:①在讀取數(shù)據(jù)前,通過對比數(shù)據(jù)長度對堆棧組中的每個堆棧中的數(shù)據(jù)進行判斷,以確定讀取到協(xié)議的完整性;②在取得按照協(xié)議規(guī)定長度的數(shù)據(jù)后,校驗數(shù)據(jù)的頭部、尾部是否與協(xié)議規(guī)定的相同,數(shù)據(jù)的校驗和是否與校驗位相同。
【文檔編號】G06F3/02GK103677282SQ201210359952
【公開日】2014年3月26日 申請日期:2012年9月24日 優(yōu)先權(quán)日:2012年9月24日
【發(fā)明者】賈雨生, 謝曉丹 申請人:中國航天科工集團第二研究院二O七所