欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

數(shù)據(jù)通信方法及系統(tǒng)與流程

文檔序號:11623657閱讀:321來源:國知局
數(shù)據(jù)通信方法及系統(tǒng)與流程

本發(fā)明單片機(jī)技術(shù)領(lǐng)域,特別涉及一種數(shù)據(jù)通信方法及系統(tǒng)。



背景技術(shù):

spi(serialperipheralinterface,串行外設(shè)接口)通信多用于嵌入式開發(fā)中主單片機(jī)與外圍芯片之間的通信,spi的通信速率一般在1-10mbps范圍內(nèi),主要傳輸一些芯片狀態(tài)信息和主機(jī)的控制指令。spi為主從通信模式,可以一主多從。大多數(shù)采用四線制,也可以采用三線制。如圖1和圖2所示,四線制里的四條信號線包括時鐘信號、片選信號、主收從發(fā)和主發(fā)從收信號,三線制沒有主收從發(fā)信號線。spi的通信速率取決于spi總線時鐘,每一次可發(fā)送的數(shù)據(jù)為4~64位的位長。當(dāng)spi通信開始時,片選信號由空閑變?yōu)橛行?,主機(jī)發(fā)送時鐘信號作為通信的時鐘信號,主機(jī)和從機(jī)同時開始發(fā)送數(shù)據(jù),數(shù)據(jù)發(fā)送完成后時鐘信號結(jié)束,片選信號變?yōu)榭臻e狀態(tài)。

目前相關(guān)的技術(shù)方案中,一般情況下數(shù)據(jù)都是單個發(fā)送的,一次通信中,必須等待發(fā)送接收完成后才能開始下一次通信,否則會產(chǎn)生發(fā)送數(shù)據(jù)丟失或者接收數(shù)據(jù)溢出的錯誤。這是因?yàn)閟pi的數(shù)據(jù)寄存器空間是有限的,同一時間段內(nèi),如果向數(shù)據(jù)寄存器中發(fā)送了過多的數(shù)據(jù),就會發(fā)生丟失或者覆蓋的情況,造成接收不到數(shù)據(jù)或者得到錯誤的數(shù)據(jù)。為了避免產(chǎn)生這樣的錯誤,需要在寫數(shù)據(jù)時判斷發(fā)送數(shù)據(jù)寄存器是否為空,如果非空則進(jìn)行等待,為空時才進(jìn)行發(fā)送,這樣可以避免丟失發(fā)送數(shù)據(jù)。同時,為了避免接收數(shù)據(jù)錯誤,需要在發(fā)送完成后進(jìn)行等待的動作,在接收完成后再從接收數(shù)據(jù)寄存器中取出接收數(shù)據(jù)。由于spi通信的速率是微秒級的,而一般的系統(tǒng)程序運(yùn)行是納秒級的,程序在執(zhí)行的過程中等待spi通信完成,會占用較長的系統(tǒng)時間。如果是spi要處理大量的數(shù)據(jù),這樣的運(yùn)行方式無疑是非常影響程序執(zhí)行效率的。



技術(shù)實(shí)現(xiàn)要素:

有鑒于此,本發(fā)明旨在提出一種數(shù)據(jù)通信方法,該方法能夠降低系統(tǒng)占用,減少程序執(zhí)行時間,提升系統(tǒng)的執(zhí)行效率,另外,該方法能夠解決spi數(shù)據(jù)寄存器存儲空間不足,難以實(shí)現(xiàn)隊(duì)列化的spi通信的問題。

為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:

一種數(shù)據(jù)通信方法,包括以下步驟:獲取一個或多個數(shù)據(jù)的地址,并根據(jù)所述一個或多個數(shù)據(jù)的地址將所述一個或多個數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)隊(duì)列;將所述一個或多個數(shù)據(jù)隊(duì)列按照先后順序依次存入緩存區(qū);判斷是否滿足數(shù)據(jù)發(fā)送和接收條件;如果滿足所述數(shù)據(jù)發(fā)送和接收條件,則將所述緩存區(qū)中的一個或多個數(shù)據(jù)隊(duì)列按照所述先后順序依次進(jìn)行發(fā)送;以及在所述一個或多個數(shù)據(jù)隊(duì)列發(fā)送完畢后,按照存儲順序依次接收所述一個或多個數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù),并按照所述存儲順序?qū)⑺鲆粋€或多個數(shù)據(jù)傳遞至相應(yīng)數(shù)據(jù)單元中。

進(jìn)一步地,在所述一個或多個數(shù)據(jù)接收完成后,還包括:調(diào)用返回函數(shù)對接收到的所述一個或多個數(shù)據(jù)進(jìn)行相應(yīng)處理。

進(jìn)一步地,所述一個或多個數(shù)據(jù)以數(shù)據(jù)鏈表的形式構(gòu)成在所述一個或多個數(shù)據(jù)隊(duì)列。

進(jìn)一步地,所述一個或多個數(shù)據(jù)隊(duì)列的個數(shù)與所述緩存區(qū)的個數(shù)相同,所述一個或多個數(shù)據(jù)隊(duì)列一一對應(yīng)地存入一個或多個緩存區(qū)。

進(jìn)一步地,還包括:設(shè)置當(dāng)前目標(biāo)存儲計(jì)數(shù)器、當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器和當(dāng)前目標(biāo)接收計(jì)數(shù)器;在將所述一個或多個數(shù)據(jù)隊(duì)列存入所述一個或多個緩存區(qū)時,首先判斷所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向的緩存區(qū)的是否為空,并在所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向緩存區(qū)不為空時,將一個數(shù)據(jù)隊(duì)列存入所述緩存區(qū),并在存儲完成后將所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器的值加1,并將所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器的指針指向下一個緩存區(qū),按照上述存儲方式將另一個數(shù)據(jù)隊(duì)列存入所述下一個緩存區(qū),直至所有的數(shù)據(jù)隊(duì)列均被存入所述緩存區(qū)中,將所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器的值清零;在發(fā)送所述一個或多個數(shù)據(jù)隊(duì)列時,首先判斷所述當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列是否為空,并在所述當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指的數(shù)據(jù)隊(duì)列不為空時,發(fā)送所述當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列,并在發(fā)送完成后將所述當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器的值加1,并將所述當(dāng)前發(fā)送目標(biāo)計(jì)數(shù)器的指針指向下一個數(shù)據(jù)隊(duì)列以進(jìn)行所述下一個數(shù)據(jù)隊(duì)的發(fā)送,直至所有的數(shù)據(jù)隊(duì)列都發(fā)送完成后將所述當(dāng)前發(fā)送目標(biāo)計(jì)數(shù)器的值清零;在接收所述一個或多個數(shù)據(jù)隊(duì)列中的地址的一個或多個數(shù)據(jù)時,首先判斷是否需要接收所述當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù),并在判定需要接收時,將所述當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù)按照存儲順序依次進(jìn)行接收,并在該數(shù)據(jù)隊(duì)列的地址中所有數(shù)據(jù)都接收完成后,將所述當(dāng)前目標(biāo)接收計(jì)數(shù)器的值加1,并將所述當(dāng)前目標(biāo)接收計(jì)數(shù)器的指針指向下一個數(shù)據(jù)隊(duì)列以對所述下一個數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù)進(jìn)行接收,直至所有數(shù)據(jù)隊(duì)列的地址中的數(shù)據(jù)均被接收完成后,將所述當(dāng)前目標(biāo)接收計(jì)數(shù)器的值清零。

相對于現(xiàn)有技術(shù),本發(fā)明所述的數(shù)據(jù)標(biāo)定方法具有以下優(yōu)勢:

本發(fā)明的數(shù)據(jù)通信方法,可以將數(shù)據(jù)構(gòu)成的數(shù)據(jù)隊(duì)列存儲至緩存區(qū),然后按數(shù)據(jù)隊(duì)列存 儲的先后順序進(jìn)行發(fā)送,無需執(zhí)行發(fā)送后等待接收的動作,從而降低了系統(tǒng)占用,縮短了spi通信中的等待時間,減少了程序執(zhí)行時間,提升了系統(tǒng)執(zhí)行效率,而且隊(duì)列化通信和鏈表存儲的實(shí)現(xiàn)方式都具有較好的移植性和對其它通信方式來說非常實(shí)用的借鑒意義,且隨著單片機(jī)系統(tǒng)時鐘的提高,對于程序執(zhí)行效率的提升會更加可觀。

本發(fā)明的另一個目的在于提出一種數(shù)據(jù)通信系統(tǒng),該系統(tǒng)能夠降低系統(tǒng)占用,減少程序執(zhí)行時間,提升系統(tǒng)的執(zhí)行效率。

為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:

一種數(shù)據(jù)通信系統(tǒng),包括:數(shù)據(jù)隊(duì)列生成模塊,所述數(shù)據(jù)隊(duì)列生成模塊用于獲取一個或多個數(shù)據(jù)的地址,并根據(jù)所述一個或多個數(shù)據(jù)的地址將所述一個或多個數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)隊(duì)列;緩存模塊,所述緩存模塊用于將所述一個或多個數(shù)據(jù)隊(duì)列按照先后順序依次存入緩存區(qū);判斷模塊,所述判斷模塊用于判斷是否滿足發(fā)送和接收條件;數(shù)據(jù)發(fā)送模塊,所述數(shù)據(jù)發(fā)送模塊用于在滿足所述數(shù)據(jù)發(fā)送和接收條件時,將所述緩存區(qū)中的一個或多個數(shù)據(jù)隊(duì)列按照所述先后順序依次進(jìn)行發(fā)送;數(shù)據(jù)接收模塊,所述數(shù)據(jù)接收模塊用于在所述一個或多個數(shù)據(jù)隊(duì)列發(fā)送完畢后,按照存儲順序依次接收所述一個或多個數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù),并按照所述存儲順序?qū)⑺鲆粋€或多個數(shù)據(jù)傳遞至相應(yīng)數(shù)據(jù)單元中。

進(jìn)一步的,還包括:函數(shù)調(diào)用模塊,所述函數(shù)調(diào)用模塊用于在所述一個或多個數(shù)據(jù)接收完成后,用返回函數(shù)對接收到的所述一個或多個數(shù)據(jù)進(jìn)行相應(yīng)處理。

進(jìn)一步的,所述一個或多個數(shù)據(jù)以數(shù)據(jù)鏈表的形式構(gòu)成在所述一個或多個數(shù)據(jù)隊(duì)列。

進(jìn)一步地,所述一個或多個數(shù)據(jù)隊(duì)列的個數(shù)與所述緩存區(qū)的個數(shù)相同,所述一個或多個數(shù)據(jù)隊(duì)列一一對應(yīng)地存入一個或多個緩存區(qū)。

進(jìn)一步地,還包括:當(dāng)前目標(biāo)存儲計(jì)數(shù)器、當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器和當(dāng)前目標(biāo)接收計(jì)數(shù)器,其中,在將所述一個或多個數(shù)據(jù)隊(duì)列存入所述一個或多個緩存區(qū)時,首先判斷所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向的緩存區(qū)的是否為空,并在所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向緩存區(qū)不為空時,將一個數(shù)據(jù)隊(duì)列存入所述緩存區(qū),并在存儲完成后將所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器的值加1,并將所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器的指針指向下一個緩存區(qū),按照上述存儲方式將另一個數(shù)據(jù)隊(duì)列存入所述下一個緩存區(qū),直至所有的數(shù)據(jù)隊(duì)列均被存入所述緩存區(qū)中,將所述當(dāng)前目標(biāo)存儲計(jì)數(shù)器的值清零;在發(fā)送所述一個或多個數(shù)據(jù)隊(duì)列時,首先判斷所述當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列是否為空,并在所述當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指的數(shù)據(jù)隊(duì)列不為空時,發(fā)送所述當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列,并在發(fā)送完成后將所述當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器的值加1,并將所述當(dāng)前發(fā)送目標(biāo)計(jì)數(shù)器的指針指向下一個數(shù)據(jù)隊(duì)列以進(jìn)行所述下一個數(shù)據(jù)隊(duì)的發(fā)送,直至所有的數(shù)據(jù)隊(duì)列都發(fā)送完成后將所述當(dāng)前發(fā)送目標(biāo)計(jì)數(shù)器的值清零;在接收所述一個或多個數(shù)據(jù)隊(duì)列中的地址的一個或多個數(shù)據(jù)時,首先判斷是否需要接收所述當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù),并在判定需要接收時,將所述當(dāng) 前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù)按照存儲順序依次進(jìn)行接收,并在該數(shù)據(jù)隊(duì)列的地址中所有數(shù)據(jù)都接收完成后,將所述當(dāng)前目標(biāo)接收計(jì)數(shù)器的值加1,并將所述當(dāng)前目標(biāo)接收計(jì)數(shù)器的指針指向下一個數(shù)據(jù)隊(duì)列以對所述下一個數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù)進(jìn)行接收,直至所有數(shù)據(jù)隊(duì)列的地址中的數(shù)據(jù)均被接收完成后,將所述當(dāng)前目標(biāo)接收計(jì)數(shù)器的值清零。

所述的數(shù)據(jù)通信系統(tǒng)與上述的數(shù)據(jù)通信方法相對于現(xiàn)有技術(shù)所具有的優(yōu)勢相同,在此不再贅述。

附圖說明

構(gòu)成本發(fā)明的一部分的附圖用來提供對本發(fā)明的進(jìn)一步理解,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:

圖1為的現(xiàn)有spi的四線制通信模式示意圖;

圖2為現(xiàn)有spi的四線制通信模式中各信號的波形圖;

圖3為本發(fā)明實(shí)施例所述的數(shù)據(jù)通信方法的流程圖;

圖4為本發(fā)明另一個實(shí)施例的數(shù)據(jù)通信方法的軟件流程示意圖;

圖5為本發(fā)明實(shí)施例的數(shù)據(jù)隊(duì)列緩存原理示意圖;以及

圖6為本發(fā)明實(shí)施例的數(shù)據(jù)通信系統(tǒng)的結(jié)構(gòu)框圖。

附圖標(biāo)記說明:

100-數(shù)據(jù)通信系統(tǒng)、110-數(shù)據(jù)隊(duì)列生成模塊、120-緩存模塊、130-判斷模塊、140-數(shù)據(jù)發(fā)送模塊、150-數(shù)據(jù)接收模塊。

具體實(shí)施方式

需要說明的是,在不沖突的情況下,本發(fā)明中的實(shí)施例及實(shí)施例中的特征可以相互組合。

下面將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。

圖3是根據(jù)本發(fā)明一個實(shí)施例的數(shù)據(jù)通信方法的流程圖。圖4是根據(jù)本發(fā)明另一個實(shí)施例的數(shù)據(jù)通信方法的軟件流程示意圖。

如圖3所示,并結(jié)合圖4,根據(jù)本發(fā)明一個實(shí)施例的數(shù)據(jù)標(biāo)定方法,包括以下步驟:

步驟s1:獲取一個或多個數(shù)據(jù)的地址,并根據(jù)一個或多個數(shù)據(jù)的地址將一個或多個數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)隊(duì)列。其中,一個或多個數(shù)據(jù)例如為spi數(shù)據(jù)。

其中,在本發(fā)明的一個實(shí)施例中,一個或多個數(shù)據(jù)例如以數(shù)據(jù)鏈表的形式構(gòu)成在一個或多個數(shù)據(jù)隊(duì)列。其中,一個或多個數(shù)據(jù)隊(duì)列的長度可調(diào)。

具體地說,在具體實(shí)施例中,依據(jù)spi通信的特點(diǎn),并結(jié)合程序設(shè)計(jì)的需要,本發(fā)明的實(shí)施例設(shè)計(jì)了spi數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),以結(jié)構(gòu)體的形式,此數(shù)據(jù)結(jié)構(gòu)包含spi數(shù)據(jù)的多個屬性, 具體為發(fā)送數(shù)據(jù)的地址、接收數(shù)據(jù)的地址、鏈表所需下一個數(shù)據(jù)的地址和接收完成后需調(diào)用的返回函數(shù)的地址。發(fā)送、接收數(shù)據(jù)的地址是用來存儲發(fā)送和接收數(shù)據(jù),發(fā)送數(shù)據(jù)由主機(jī)提供,接收數(shù)據(jù)來自于從機(jī),需等待每次接收完成后將接收數(shù)據(jù)寫入此數(shù)據(jù)結(jié)構(gòu)中。下一個數(shù)據(jù)的地址,是為了將數(shù)據(jù)隊(duì)列內(nèi)的spi數(shù)據(jù)以鏈表的形式鏈接在一起,在spi通信中根據(jù)鏈表指針的前后順序進(jìn)行隊(duì)列化的發(fā)送接收操作。

步驟s2:將一個或多個數(shù)據(jù)隊(duì)列按照先后順序依次存入緩存區(qū)。

步驟s3:判斷是否滿足數(shù)據(jù)發(fā)送和接收條件。

步驟s4:如果滿足數(shù)據(jù)發(fā)送和接收條件,則將緩存區(qū)中的一個或多個數(shù)據(jù)隊(duì)列按照先后順序依次進(jìn)行發(fā)送。

步驟s5:在一個或多個數(shù)據(jù)隊(duì)列發(fā)送完畢后,按照存儲順序依次接收一個或多個數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù),并按照存儲順序?qū)⒁粋€或多個數(shù)據(jù)傳遞至相應(yīng)數(shù)據(jù)單元中。

具體地說,本發(fā)明的主要目的即實(shí)現(xiàn)數(shù)據(jù)隊(duì)列的發(fā)送和接收。上述過程中所實(shí)現(xiàn)了隊(duì)列化通信,取代現(xiàn)有方案中在程序執(zhí)行時每個數(shù)據(jù)需單獨(dú)的占用一個發(fā)送接收循環(huán)的機(jī)制。本發(fā)明的實(shí)施例設(shè)置了緩存區(qū),以對spi數(shù)據(jù)進(jìn)行緩沖存儲,按數(shù)據(jù)隊(duì)列的存儲順序進(jìn)行連續(xù)的發(fā)送接收。在數(shù)據(jù)隊(duì)列發(fā)送的機(jī)制建立之后,可以將大量的發(fā)送數(shù)據(jù)存儲在緩存區(qū)中,當(dāng)中斷發(fā)送的條件(即數(shù)據(jù)發(fā)送和接收條件)滿足時,按順序進(jìn)行發(fā)送。其中,數(shù)據(jù)隊(duì)列發(fā)送的含義是將數(shù)據(jù)鏈接成若干個數(shù)據(jù)隊(duì)列,然后按數(shù)據(jù)隊(duì)列在緩存區(qū)存儲的先后順序進(jìn)行發(fā)送。數(shù)據(jù)隊(duì)列的形成是通過數(shù)據(jù)結(jié)構(gòu)中的下一個數(shù)據(jù)地址來實(shí)現(xiàn)的,通過數(shù)據(jù)鏈表可以將內(nèi)存中放置在不同地址段的數(shù)據(jù)鏈接在一起。數(shù)據(jù)隊(duì)列接收的機(jī)制與發(fā)送是類似的,當(dāng)接收數(shù)據(jù)接收完成以后,會按照緩存區(qū)中的數(shù)據(jù)隊(duì)列的存儲順序進(jìn)行數(shù)據(jù)的傳遞,第一個接收數(shù)據(jù)放入第一個發(fā)送數(shù)據(jù)所在的數(shù)據(jù)單元中,以此類推。

其中,使用數(shù)據(jù)鏈表的方式可以很容易的實(shí)現(xiàn)大量數(shù)據(jù)的隊(duì)列化存儲,數(shù)據(jù)以數(shù)據(jù)隊(duì)列的形式被放置在固定個數(shù)的緩存區(qū)中,每個數(shù)據(jù)隊(duì)列中包含的數(shù)據(jù)可以是一個或者多個,個數(shù)沒有限制,編程人員可根據(jù)自己的需要進(jìn)行選擇。

其中,數(shù)據(jù)隊(duì)列的個數(shù)是取決于數(shù)據(jù)緩存區(qū)的長度。在本發(fā)明的一個實(shí)施例中,上述的一個或多個數(shù)據(jù)隊(duì)列的個數(shù)與緩存區(qū)的個數(shù)相同,一個或多個數(shù)據(jù)隊(duì)列一一對應(yīng)地存入一個或多個緩存區(qū)。其中,緩存區(qū)的個數(shù)應(yīng)該是固定的,即可以同時存放的數(shù)據(jù)隊(duì)列的個數(shù)是有上限的,其上限就是緩存區(qū)的個數(shù)。這樣的存儲方式理論上可以容納無限多個數(shù)據(jù),只要設(shè)計(jì)合理,可以保證對大量數(shù)據(jù)的臨時存儲。存儲數(shù)據(jù)時,僅需將隊(duì)列的第一個數(shù)據(jù)的地址存儲到緩存區(qū)的地址中,隊(duì)列中的其他數(shù)據(jù)就會通過地址鏈接的方式鏈接到一起,不需進(jìn)行其他的動作,例如圖5所示。其中,固定的緩存區(qū)例如是以數(shù)組的形式定義的,緩存區(qū)實(shí)際上是內(nèi)存中的一段連續(xù)的存儲空間。

進(jìn)一步地,數(shù)據(jù)隊(duì)列的長度可以自由選擇,但是需避免過長或者過短,數(shù)據(jù)隊(duì)列過長可能會引起數(shù)據(jù)處理不及時,數(shù)據(jù)隊(duì)列過短可能會導(dǎo)致緩沖區(qū)占滿,在少量數(shù)據(jù)的情況下導(dǎo)致存儲區(qū)溢出。

進(jìn)一步地,本發(fā)明實(shí)施例的方法例如還包括:設(shè)置當(dāng)前目標(biāo)存儲計(jì)數(shù)器、當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器和當(dāng)前目標(biāo)接收計(jì)數(shù)器;在將一個或多個數(shù)據(jù)隊(duì)列存入一個或多個緩存區(qū)時,首先判斷當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向的緩存區(qū)的是否為空,并在當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向緩存區(qū)不為空時,將一個數(shù)據(jù)隊(duì)列存入緩存區(qū),并在存儲完成后將當(dāng)前目標(biāo)存儲計(jì)數(shù)器的值加1,并將當(dāng)前目標(biāo)存儲計(jì)數(shù)器的指針指向下一個緩存區(qū),按照上述存儲方式將另一個數(shù)據(jù)隊(duì)列存入下一個緩存區(qū),直至所有的數(shù)據(jù)隊(duì)列均被存入緩存區(qū)中,將當(dāng)前目標(biāo)存儲計(jì)數(shù)器的值清零;在發(fā)送一個或多個數(shù)據(jù)隊(duì)列時,首先判斷當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列是否為空,并在當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指的數(shù)據(jù)隊(duì)列不為空時,發(fā)送當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列,并在發(fā)送完成后將當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器的值加1,并將當(dāng)前發(fā)送目標(biāo)計(jì)數(shù)器的指針指向下一個數(shù)據(jù)隊(duì)列以進(jìn)行下一個數(shù)據(jù)隊(duì)的發(fā)送,直至所有的數(shù)據(jù)隊(duì)列都發(fā)送完成后將當(dāng)前發(fā)送目標(biāo)計(jì)數(shù)器的值清零;在接收一個或多個數(shù)據(jù)隊(duì)列中的地址的一個或多個數(shù)據(jù)時,首先判斷是否需要接收當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù),并在判定需要接收時,將當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù)按照存儲順序依次進(jìn)行接收,并在該數(shù)據(jù)隊(duì)列的地址中所有數(shù)據(jù)都接收完成后,將當(dāng)前目標(biāo)接收計(jì)數(shù)器的值加1,并將當(dāng)前目標(biāo)接收計(jì)數(shù)器的指針指向下一個數(shù)據(jù)隊(duì)列以對下一個數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù)進(jìn)行接收,直至所有數(shù)據(jù)隊(duì)列的地址中的數(shù)據(jù)均被接收完成后,將當(dāng)前目標(biāo)接收計(jì)數(shù)器的值清零。

具體地說,在具體實(shí)施例中,為了保證數(shù)據(jù)隊(duì)列按指定的順序發(fā)送和接收,在程序中需設(shè)置一些類似計(jì)數(shù)器的變量,例如稱之為計(jì)數(shù)器,那么本實(shí)施例中就包括當(dāng)前目標(biāo)存儲的計(jì)數(shù)器、當(dāng)前目標(biāo)發(fā)送的計(jì)數(shù)器和當(dāng)前目標(biāo)接收的計(jì)數(shù)器,這些計(jì)數(shù)器的值指向目標(biāo)操作的數(shù)據(jù)緩存區(qū)序號,而每一個序號都對應(yīng)著一個數(shù)據(jù)隊(duì)列。對于緩存區(qū)而言,發(fā)送的順序是按照數(shù)據(jù)隊(duì)列被存入緩存區(qū)的順序來執(zhí)行的,而數(shù)據(jù)隊(duì)列存入緩存區(qū)是按照連續(xù)的順序進(jìn)行的,所以發(fā)送接收在緩存區(qū)級別也是按照連續(xù)的順序進(jìn)行的。而在數(shù)據(jù)隊(duì)列的內(nèi)部,數(shù)據(jù)發(fā)送的順序也是連續(xù)的,按照從第一個數(shù)據(jù)到最后一個數(shù)據(jù)的順序進(jìn)行發(fā)送和接收,這樣所有數(shù)據(jù)的發(fā)送接收順序就全部確定了。因?yàn)閿?shù)據(jù)存儲、數(shù)據(jù)發(fā)送與數(shù)據(jù)接收是三個獨(dú)立的互不影響的過程,所以用三個單獨(dú)的計(jì)數(shù)器進(jìn)行操作。結(jié)合圖4所示,在數(shù)據(jù)存儲時,首先判斷當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向的存儲空間是否為空,只有為空的情況下才能寫入數(shù)據(jù),寫入完成后此計(jì)數(shù)器值加1,指向下一個數(shù)據(jù)隊(duì)列的存儲空間,如果存儲空間的最后一位也已經(jīng)被放入了數(shù)據(jù),則該計(jì)數(shù)器清零,指向緩存區(qū)的第一個存儲空間。在發(fā)送數(shù)據(jù)時,如果當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指的隊(duì)列非空時,則進(jìn)行發(fā)送,發(fā)送完成后該計(jì)數(shù)器加1,指向下一個數(shù)據(jù)隊(duì)列 的存儲空間,當(dāng)該計(jì)數(shù)器值達(dá)到最大時,表明數(shù)據(jù)發(fā)送完成,在數(shù)據(jù)發(fā)送完成后該計(jì)數(shù)器清零。在接收數(shù)據(jù)時,如果需要接收此數(shù)據(jù),會將數(shù)據(jù)存入當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列中,當(dāng)數(shù)據(jù)隊(duì)列內(nèi)的所有數(shù)據(jù)接收都完成時,會判斷是否調(diào)用返回函數(shù),同時該目標(biāo)接收計(jì)數(shù)器值加1,達(dá)到最大值時接收完成后該計(jì)數(shù)器清零。

需要說明的是,在本發(fā)明上述實(shí)施例描述的方案中,可能引起溢出的地方有三處:一是在緩存區(qū)的數(shù)據(jù)填充過程中,緩存區(qū)所能容納的數(shù)據(jù)隊(duì)列個數(shù)是固定的,當(dāng)實(shí)際的數(shù)據(jù)隊(duì)列個數(shù)超過此固定值時,數(shù)據(jù)將無法寫入,這需要編程人員優(yōu)化代碼,增加隊(duì)列長度,減少隊(duì)列的個數(shù);第二是在中斷使能之前,如果先使能發(fā)送中斷,可能會造成發(fā)送不斷執(zhí)行,接收在中斷未使能的情況下不會進(jìn)行,從而導(dǎo)致接收數(shù)據(jù)溢出或者被覆蓋,所以在中斷使能時,要先使能接收中斷,再使能發(fā)送中斷;第三是在正常的發(fā)送接收過程中,有可能會產(chǎn)生發(fā)送中斷不斷的響應(yīng),接收中斷無法執(zhí)行的問題,為防止出現(xiàn)這樣的情況,在發(fā)送中斷時,會無條件調(diào)用接收中斷一次,以避免接收中斷因不能及時響應(yīng)而造成的接收數(shù)據(jù)溢出或者被覆蓋。

進(jìn)一步地,當(dāng)調(diào)用spi的接口函數(shù)進(jìn)行數(shù)據(jù)存儲完成后,先使能接收中斷,再使能發(fā)送中斷。在程序執(zhí)行的過程中,如果當(dāng)前尚有數(shù)據(jù)未完成接收或者發(fā)送,則接收或者發(fā)送中斷就不會停止使能;而一旦目前中斷處于空閑狀態(tài),就會終止中斷使能,停止中斷響應(yīng),一直到下一次調(diào)用spi接口函數(shù)后再次使能。

其中,在一些示例中,在數(shù)據(jù)發(fā)送和數(shù)據(jù)接收的過程中,分別設(shè)定了空閑、開始處理和正在進(jìn)行這三種狀態(tài),spi通信處于不同的操作狀態(tài)下時,所進(jìn)行的任務(wù)不同。三種狀態(tài)的轉(zhuǎn)化關(guān)系是:空閑→開始處理→正在進(jìn)行→空閑。在首次進(jìn)行spi通信或者發(fā)送接收處理完成并關(guān)閉中斷使能之后再次發(fā)送接收之前,spi通信將處于空閑的狀態(tài),此時spi會關(guān)閉中斷使能,處于等待中斷使能的狀態(tài),如果此時調(diào)用spi接口函數(shù),中斷將會使能;當(dāng)spi的中斷被使能之后,由空閑狀態(tài)進(jìn)入開始處理階段,中斷被使能后,在中斷服務(wù)函數(shù)響應(yīng)時,會根據(jù)現(xiàn)在的狀態(tài)進(jìn)行一次賦值行為,主要是將目標(biāo)數(shù)據(jù)傳遞給發(fā)送或接收中斷的內(nèi)部變量,然后將狀態(tài)切換到正在進(jìn)行狀態(tài);在正在進(jìn)行狀態(tài)時,中斷服務(wù)子函數(shù)會不斷的進(jìn)行發(fā)送或者接收,直到存儲區(qū)內(nèi)的所有數(shù)據(jù)都被處理完成,然后將狀態(tài)切換為空閑,并關(guān)閉中斷使能。

本發(fā)明的實(shí)施例中雖然并無專門的策略去保證接收數(shù)據(jù)的正確,即并沒有采取措施專門去確認(rèn)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)是否真正對應(yīng),但是根據(jù)spi的通信特點(diǎn)可以看出,發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的數(shù)目是相同的,因此如果所有的發(fā)送數(shù)據(jù)和接收數(shù)據(jù)都經(jīng)過了處理,而且程序可以保證不會發(fā)生發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的溢出或者錯誤,那么接收數(shù)據(jù)就不會出現(xiàn)由本發(fā)明的實(shí)施例引起的錯誤。

進(jìn)一步地,在一個或多個數(shù)據(jù)接收完成后,該方法還包括:調(diào)用返回函數(shù)對接收到的一 個或多個數(shù)據(jù)進(jìn)行相應(yīng)處理。具體地說,返回函數(shù)的作用是為了在中斷方式的spi通信中進(jìn)行接收數(shù)據(jù)的響應(yīng)處理,當(dāng)數(shù)據(jù)接收完成后,可通過調(diào)用返回函數(shù)進(jìn)行數(shù)據(jù)處理。具體地說,當(dāng)數(shù)據(jù)接收完成后,當(dāng)需要對接收數(shù)據(jù)進(jìn)行處理時,可以通過在接收數(shù)據(jù)完成后調(diào)用返回函數(shù)來實(shí)現(xiàn)。調(diào)用返回函數(shù)置于接收數(shù)據(jù)完成之后,這樣可以保證數(shù)據(jù)的正確性。一般情況下,返回函數(shù)會被放置于一個隊(duì)列的最末一位數(shù)據(jù)上,隊(duì)列的其他成員數(shù)據(jù)上不添加返回函數(shù),這樣可以保證數(shù)據(jù)的準(zhǔn)確性和數(shù)據(jù)處理的及時性,在實(shí)際的工程應(yīng)用中可以根據(jù)需要靈活配置。

綜上,根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)通信方法,可以將數(shù)據(jù)構(gòu)成的數(shù)據(jù)隊(duì)列存儲至緩存區(qū),然后按數(shù)據(jù)隊(duì)列存儲的先后順序進(jìn)行發(fā)送,無需執(zhí)行發(fā)送后等待接收的動作,從而降低了系統(tǒng)占用,縮短了spi通信中的等待時間,減少了程序執(zhí)行時間,提升了系統(tǒng)執(zhí)行效率,而且隊(duì)列化通信和鏈表存儲的實(shí)現(xiàn)方式都具有較好的移植性和對其它通信方式來說非常實(shí)用的借鑒意義,且隨著單片機(jī)系統(tǒng)時鐘的提高,對于程序執(zhí)行效率的提升會更加可觀。

進(jìn)一步地,如圖6所示,本發(fā)明的實(shí)施例公開了一種數(shù)據(jù)通信系統(tǒng)100,包括:數(shù)據(jù)隊(duì)列生成模塊110、緩存模塊120、判斷模塊130、數(shù)據(jù)發(fā)送模塊140和數(shù)據(jù)接收模塊150。

其中,數(shù)據(jù)隊(duì)列生成模塊110用于獲取一個或多個數(shù)據(jù)的地址,并根據(jù)一個或多個數(shù)據(jù)的地址將一個或多個數(shù)據(jù)構(gòu)成一個或多個數(shù)據(jù)隊(duì)列。

其中,在本發(fā)明的一個實(shí)施例中,一個或多個數(shù)據(jù)例如以數(shù)據(jù)鏈表的形式構(gòu)成在一個或多個數(shù)據(jù)隊(duì)列。其中,一個或多個數(shù)據(jù)隊(duì)列的長度可調(diào)。

具體地說,在具體實(shí)施例中,依據(jù)spi通信的特點(diǎn),并結(jié)合程序設(shè)計(jì)的需要,本發(fā)明的實(shí)施例設(shè)計(jì)了spi數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),以結(jié)構(gòu)體的形式,此數(shù)據(jù)結(jié)構(gòu)包含spi數(shù)據(jù)的多個屬性,具體為發(fā)送數(shù)據(jù)的地址、接收數(shù)據(jù)的地址、鏈表所需下一個數(shù)據(jù)的地址和接收完成后需調(diào)用的返回函數(shù)的地址。發(fā)送、接收數(shù)據(jù)的地址是用來存儲發(fā)送和接收數(shù)據(jù),發(fā)送數(shù)據(jù)由主機(jī)提供,接收數(shù)據(jù)來自于從機(jī),需等待每次接收完成后將接收數(shù)據(jù)寫入此數(shù)據(jù)結(jié)構(gòu)中。下一個數(shù)據(jù)的地址,是為了將數(shù)據(jù)隊(duì)列內(nèi)的spi數(shù)據(jù)以鏈表的形式鏈接在一起,在spi通信中根據(jù)鏈表指針的前后順序進(jìn)行隊(duì)列化的發(fā)送接收操作。

緩存模塊120用于將一個或多個數(shù)據(jù)隊(duì)列按照先后順序依次存入緩存區(qū)。

判斷模塊130用于判斷是否滿足發(fā)送和接收條件。

數(shù)據(jù)發(fā)送模塊140用于在滿足數(shù)據(jù)發(fā)送和接收條件時,將緩存區(qū)中的一個或多個數(shù)據(jù)隊(duì)列按照先后順序依次進(jìn)行發(fā)送。

數(shù)據(jù)接收模塊150用于在一個或多個數(shù)據(jù)隊(duì)列發(fā)送完畢后,按照存儲順序依次接收一個或多個數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù),并按照存儲順序?qū)⒁粋€或多個數(shù)據(jù)傳遞至相應(yīng)數(shù)據(jù)單元中。

具體地說,本發(fā)明的主要目的即實(shí)現(xiàn)數(shù)據(jù)隊(duì)列的發(fā)送和接收。上述過程中所實(shí)現(xiàn)了隊(duì)列 化通信,取代現(xiàn)有方案中在程序執(zhí)行時每個數(shù)據(jù)需單獨(dú)的占用一個發(fā)送接收循環(huán)的機(jī)制。本發(fā)明的實(shí)施例設(shè)置了緩存區(qū),以對spi數(shù)據(jù)進(jìn)行緩沖存儲,按數(shù)據(jù)隊(duì)列的存儲順序進(jìn)行連續(xù)的發(fā)送接收。在數(shù)據(jù)隊(duì)列發(fā)送的機(jī)制建立之后,可以將大量的發(fā)送數(shù)據(jù)存儲在緩存區(qū)中,當(dāng)中斷發(fā)送的條件(即數(shù)據(jù)發(fā)送和接收條件)滿足時,按順序進(jìn)行發(fā)送。其中,數(shù)據(jù)隊(duì)列發(fā)送的含義是將數(shù)據(jù)鏈接成若干個數(shù)據(jù)隊(duì)列,然后按數(shù)據(jù)隊(duì)列在緩存區(qū)存儲的先后順序進(jìn)行發(fā)送。數(shù)據(jù)隊(duì)列的形成是通過數(shù)據(jù)結(jié)構(gòu)中的下一個數(shù)據(jù)地址來實(shí)現(xiàn)的,通過數(shù)據(jù)鏈表可以將內(nèi)存中放置在不同地址段的數(shù)據(jù)鏈接在一起。數(shù)據(jù)隊(duì)列接收的機(jī)制與發(fā)送是類似的,當(dāng)接收數(shù)據(jù)接收完成以后,會按照緩存區(qū)中的數(shù)據(jù)隊(duì)列的存儲順序進(jìn)行數(shù)據(jù)的傳遞,第一個接收數(shù)據(jù)放入第一個發(fā)送數(shù)據(jù)所在的數(shù)據(jù)單元中,以此類推。

其中,使用數(shù)據(jù)鏈表的方式可以很容易的實(shí)現(xiàn)大量數(shù)據(jù)的隊(duì)列化存儲,數(shù)據(jù)以數(shù)據(jù)隊(duì)列的形式被放置在固定個數(shù)的緩存區(qū)中,每個數(shù)據(jù)隊(duì)列中包含的數(shù)據(jù)可以是一個或者多個,個數(shù)沒有限制,編程人員可根據(jù)自己的需要進(jìn)行選擇。

其中,數(shù)據(jù)隊(duì)列的個數(shù)是取決于數(shù)據(jù)緩存區(qū)的長度。在本發(fā)明的一個實(shí)施例中,上述的一個或多個數(shù)據(jù)隊(duì)列的個數(shù)與緩存區(qū)的個數(shù)相同,一個或多個數(shù)據(jù)隊(duì)列一一對應(yīng)地存入一個或多個緩存區(qū)。其中,緩存區(qū)的個數(shù)應(yīng)該是固定的,即可以同時存放的數(shù)據(jù)隊(duì)列的個數(shù)是有上限的,其上限就是緩存區(qū)的個數(shù)。這樣的存儲方式理論上可以容納無限多個數(shù)據(jù),只要設(shè)計(jì)合理,可以保證對大量數(shù)據(jù)的臨時存儲。存儲數(shù)據(jù)時,僅需將隊(duì)列的第一個數(shù)據(jù)的地址存儲到緩存區(qū)的地址中,隊(duì)列中的其他數(shù)據(jù)就會通過地址鏈接的方式鏈接到一起,不需進(jìn)行其他的動作,例如圖5所示。其中,固定的緩存區(qū)例如是以數(shù)組的形式定義的,緩存區(qū)實(shí)際上是內(nèi)存中的一段連續(xù)的存儲空間。

進(jìn)一步地,數(shù)據(jù)隊(duì)列的長度可以自由選擇,但是需避免過長或者過短,數(shù)據(jù)隊(duì)列過長可能會引起數(shù)據(jù)處理不及時,數(shù)據(jù)隊(duì)列過短可能會導(dǎo)致緩沖區(qū)占滿,在少量數(shù)據(jù)的情況下導(dǎo)致存儲區(qū)溢出。

進(jìn)一步地,本發(fā)明實(shí)施例的數(shù)據(jù)通信系統(tǒng)100例如還包括:當(dāng)前目標(biāo)存儲計(jì)數(shù)器、當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器和當(dāng)前目標(biāo)接收計(jì)數(shù)器,其中,在將一個或多個數(shù)據(jù)隊(duì)列存入一個或多個緩存區(qū)時,首先判斷當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向的緩存區(qū)的是否為空,并在當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向緩存區(qū)不為空時,將一個數(shù)據(jù)隊(duì)列存入緩存區(qū),并在存儲完成后將當(dāng)前目標(biāo)存儲計(jì)數(shù)器的值加1,并將當(dāng)前目標(biāo)存儲計(jì)數(shù)器的指針指向下一個緩存區(qū),按照上述存儲方式將另一個數(shù)據(jù)隊(duì)列存入下一個緩存區(qū),直至所有的數(shù)據(jù)隊(duì)列均被存入緩存區(qū)中,將當(dāng)前目標(biāo)存儲計(jì)數(shù)器的值清零;在發(fā)送一個或多個數(shù)據(jù)隊(duì)列時,首先判斷當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列是否為空,并在當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指的數(shù)據(jù)隊(duì)列不為空時,發(fā)送當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列,并在發(fā)送完成后將當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器的值加1,并將當(dāng)前發(fā)送目標(biāo)計(jì)數(shù)器的指針指向下一個數(shù)據(jù)隊(duì)列以進(jìn)行下一個數(shù)據(jù)隊(duì)的發(fā)送,直至所有的數(shù)據(jù)隊(duì)列都發(fā) 送完成后將當(dāng)前發(fā)送目標(biāo)計(jì)數(shù)器的值清零;在接收一個或多個數(shù)據(jù)隊(duì)列中的地址的一個或多個數(shù)據(jù)時,首先判斷是否需要接收當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù),并在判定需要接收時,將當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù)按照存儲順序依次進(jìn)行接收,并在該數(shù)據(jù)隊(duì)列的地址中所有數(shù)據(jù)都接收完成后,將當(dāng)前目標(biāo)接收計(jì)數(shù)器的值加1,并將當(dāng)前目標(biāo)接收計(jì)數(shù)器的指針指向下一個數(shù)據(jù)隊(duì)列以對下一個數(shù)據(jù)隊(duì)列的地址中的一個或多個數(shù)據(jù)進(jìn)行接收,直至所有數(shù)據(jù)隊(duì)列的地址中的數(shù)據(jù)均被接收完成后,將當(dāng)前目標(biāo)接收計(jì)數(shù)器的值清零。

具體地說,在具體實(shí)施例中,為了保證數(shù)據(jù)隊(duì)列按指定的順序發(fā)送和接收,在程序中需設(shè)置一些類似計(jì)數(shù)器的變量,例如稱之為計(jì)數(shù)器,那么本實(shí)施例中就包括當(dāng)前目標(biāo)存儲的計(jì)數(shù)器、當(dāng)前目標(biāo)發(fā)送的計(jì)數(shù)器和當(dāng)前目標(biāo)接收的計(jì)數(shù)器,這些計(jì)數(shù)器的值指向目標(biāo)操作的數(shù)據(jù)緩存區(qū)序號,而每一個序號都對應(yīng)著一個數(shù)據(jù)隊(duì)列。對于緩存區(qū)而言,發(fā)送的順序是按照數(shù)據(jù)隊(duì)列被存入緩存區(qū)的順序來執(zhí)行的,而數(shù)據(jù)隊(duì)列存入緩存區(qū)是按照連續(xù)的順序進(jìn)行的,所以發(fā)送接收在緩存區(qū)級別也是按照連續(xù)的順序進(jìn)行的。而在數(shù)據(jù)隊(duì)列的內(nèi)部,數(shù)據(jù)發(fā)送的順序也是連續(xù)的,按照從第一個數(shù)據(jù)到最后一個數(shù)據(jù)的順序進(jìn)行發(fā)送和接收,這樣所有數(shù)據(jù)的發(fā)送接收順序就全部確定了。因?yàn)閿?shù)據(jù)存儲、數(shù)據(jù)發(fā)送與數(shù)據(jù)接收是三個獨(dú)立的互不影響的過程,所以用三個單獨(dú)的計(jì)數(shù)器進(jìn)行操作。結(jié)合圖4所示,在數(shù)據(jù)存儲時,首先判斷當(dāng)前目標(biāo)存儲計(jì)數(shù)器所指向的存儲空間是否為空,只有為空的情況下才能寫入數(shù)據(jù),寫入完成后此計(jì)數(shù)器值加1,指向下一個數(shù)據(jù)隊(duì)列的存儲空間,如果存儲空間的最后一位也已經(jīng)被放入了數(shù)據(jù),則該計(jì)數(shù)器清零,指向緩存區(qū)的第一個存儲空間。在發(fā)送數(shù)據(jù)時,如果當(dāng)前目標(biāo)發(fā)送計(jì)數(shù)器所指的隊(duì)列非空時,則進(jìn)行發(fā)送,發(fā)送完成后該計(jì)數(shù)器加1,指向下一個數(shù)據(jù)隊(duì)列的存儲空間,當(dāng)該計(jì)數(shù)器值達(dá)到最大時,表明數(shù)據(jù)發(fā)送完成,在數(shù)據(jù)發(fā)送完成后該計(jì)數(shù)器清零。在接收數(shù)據(jù)時,如果需要接收此數(shù)據(jù),會將數(shù)據(jù)存入當(dāng)前目標(biāo)接收計(jì)數(shù)器所指向的數(shù)據(jù)隊(duì)列中,當(dāng)數(shù)據(jù)隊(duì)列內(nèi)的所有數(shù)據(jù)接收都完成時,會判斷是否調(diào)用返回函數(shù),同時該目標(biāo)接收計(jì)數(shù)器值加1,達(dá)到最大值時接收完成后該計(jì)數(shù)器清零。

需要說明的是,在本發(fā)明上述實(shí)施例描述的方案中,可能引起溢出的地方有三處:一是在緩存區(qū)的數(shù)據(jù)填充過程中,緩存區(qū)所能容納的數(shù)據(jù)隊(duì)列個數(shù)是固定的,當(dāng)實(shí)際的數(shù)據(jù)隊(duì)列個數(shù)超過此固定值時,數(shù)據(jù)將無法寫入,這需要編程人員優(yōu)化代碼,增加隊(duì)列長度,減少隊(duì)列的個數(shù);第二是在中斷使能之前,如果先使能發(fā)送中斷,可能會造成發(fā)送不斷執(zhí)行,接收在中斷未使能的情況下不會進(jìn)行,從而導(dǎo)致接收數(shù)據(jù)溢出或者被覆蓋,所以在中斷使能時,要先使能接收中斷,再使能發(fā)送中斷;第三是在正常的發(fā)送接收過程中,有可能會產(chǎn)生發(fā)送中斷不斷的響應(yīng),接收中斷無法執(zhí)行的問題,為防止出現(xiàn)這樣的情況,在發(fā)送中斷時,會無條件調(diào)用接收中斷一次,以避免接收中斷因不能及時響應(yīng)而造成的接收數(shù)據(jù)溢出或者被覆蓋。

進(jìn)一步地,當(dāng)調(diào)用spi的接口函數(shù)進(jìn)行數(shù)據(jù)存儲完成后,先使能接收中斷,再使能發(fā)送中斷。在程序執(zhí)行的過程中,如果當(dāng)前尚有數(shù)據(jù)未完成接收或者發(fā)送,則接收或者發(fā)送中斷就不會停止使能;而一旦目前中斷處于空閑狀態(tài),就會終止中斷使能,停止中斷響應(yīng),一直到下一次調(diào)用spi接口函數(shù)后再次使能。

其中,在一些示例中,在數(shù)據(jù)發(fā)送和數(shù)據(jù)接收的過程中,分別設(shè)定了空閑、開始處理和正在進(jìn)行這三種狀態(tài),spi通信處于不同的操作狀態(tài)下時,所進(jìn)行的任務(wù)不同。三種狀態(tài)的轉(zhuǎn)化關(guān)系是:空閑→開始處理→正在進(jìn)行→空閑。在首次進(jìn)行spi通信或者發(fā)送接收處理完成并關(guān)閉中斷使能之后再次發(fā)送接收之前,spi通信將處于空閑的狀態(tài),此時spi會關(guān)閉中斷使能,處于等待中斷使能的狀態(tài),如果此時調(diào)用spi接口函數(shù),中斷將會使能;當(dāng)spi的中斷被使能之后,由空閑狀態(tài)進(jìn)入開始處理階段,中斷被使能后,在中斷服務(wù)函數(shù)響應(yīng)時,會根據(jù)現(xiàn)在的狀態(tài)進(jìn)行一次賦值行為,主要是將目標(biāo)數(shù)據(jù)傳遞給發(fā)送或接收中斷的內(nèi)部變量,然后將狀態(tài)切換到正在進(jìn)行狀態(tài);在正在進(jìn)行狀態(tài)時,中斷服務(wù)子函數(shù)會不斷的進(jìn)行發(fā)送或者接收,直到存儲區(qū)內(nèi)的所有數(shù)據(jù)都被處理完成,然后將狀態(tài)切換為空閑,并關(guān)閉中斷使能。

本發(fā)明的實(shí)施例中雖然并無專門的策略去保證接收數(shù)據(jù)的正確,即并沒有采取措施專門去確認(rèn)發(fā)送數(shù)據(jù)和接收數(shù)據(jù)是否真正對應(yīng),但是根據(jù)spi的通信特點(diǎn)可以看出,發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的數(shù)目是相同的,因此如果所有的發(fā)送數(shù)據(jù)和接收數(shù)據(jù)都經(jīng)過了處理,而且程序可以保證不會發(fā)生發(fā)送數(shù)據(jù)和接收數(shù)據(jù)的溢出或者錯誤,那么接收數(shù)據(jù)就不會出現(xiàn)由本發(fā)明的實(shí)施例引起的錯誤。

進(jìn)一步地,本發(fā)明實(shí)施例的數(shù)據(jù)通信系統(tǒng)100例如還包括調(diào)用模塊160(圖中未示出)。函數(shù)調(diào)用模塊160用于在一個或多個數(shù)據(jù)接收完成后,用返回函數(shù)對接收到的一個或多個數(shù)據(jù)進(jìn)行相應(yīng)處理。具體地說,返回函數(shù)的作用是為了在中斷方式的spi通信中進(jìn)行接收數(shù)據(jù)的響應(yīng)處理,當(dāng)數(shù)據(jù)接收完成后,可通過調(diào)用返回函數(shù)進(jìn)行數(shù)據(jù)處理。具體地說,當(dāng)數(shù)據(jù)接收完成后,當(dāng)需要對接收數(shù)據(jù)進(jìn)行處理時,可以通過在接收數(shù)據(jù)完成后調(diào)用返回函數(shù)來實(shí)現(xiàn)。調(diào)用返回函數(shù)置于接收數(shù)據(jù)完成之后,這樣可以保證數(shù)據(jù)的正確性。一般情況下,返回函數(shù)會被放置于一個隊(duì)列的最末一位數(shù)據(jù)上,隊(duì)列的其他成員數(shù)據(jù)上不添加返回函數(shù),這樣可以保證數(shù)據(jù)的準(zhǔn)確性和數(shù)據(jù)處理的及時性,在實(shí)際的工程應(yīng)用中可以根據(jù)需要靈活配置。

綜上,根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)通信系統(tǒng),可以將數(shù)據(jù)構(gòu)成的數(shù)據(jù)隊(duì)列存儲至緩存區(qū),然后按數(shù)據(jù)隊(duì)列存儲的先后順序進(jìn)行發(fā)送,無需執(zhí)行發(fā)送后等待接收的動作,從而降低了系統(tǒng)占用,縮短了spi通信中的等待時間,減少了程序執(zhí)行時間,提升了系統(tǒng)執(zhí)行效率,而且隊(duì)列化通信和鏈表存儲的實(shí)現(xiàn)方式都具有較好的移植性和對其它通信方式來說非常實(shí)用的借鑒意義,且隨著單片機(jī)系統(tǒng)時鐘的提高,對于程序執(zhí)行效率的提升會更加可觀。

以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原 則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。

當(dāng)前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點(diǎn)贊!
1
柳州市| 乌拉特前旗| 库伦旗| 顺义区| 波密县| 腾冲县| 平顶山市| 偏关县| 神池县| 长沙市| 杂多县| 西充县| 平阴县| 平顺县| 涞水县| 萨嘎县| 固阳县| 尤溪县| 沿河| 山东省| 章丘市| 石首市| 平塘县| 含山县| 隆安县| 五指山市| 伊宁县| 乃东县| 乐都县| 钦州市| 饶平县| 长丰县| 额敏县| 洛川县| 五大连池市| 京山县| 芒康县| 西和县| 江川县| 麻城市| 涪陵区|