專利名稱:一種基于融合通信終端藍牙串口實現(xiàn)的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種藍牙串口驅(qū)動實現(xiàn)的方法,屬于藍牙技術(shù)領(lǐng)域。
背景技術(shù):
目前藍牙的應用逐漸普遍,藍牙網(wǎng)關(guān)的產(chǎn)品也屢見不鮮。但就藍牙產(chǎn)品技術(shù)的公 開性,以及不同廠家對于藍牙網(wǎng)關(guān)的技術(shù)實現(xiàn)上來說,產(chǎn)品技術(shù)基本保密,實現(xiàn)的方案也各 有高低?;谒{牙網(wǎng)關(guān)的實現(xiàn),藍牙串口驅(qū)動是必備的。實現(xiàn)藍牙芯片與設(shè)備問的串口通 信,是藍牙網(wǎng)關(guān)開發(fā)的必備環(huán)節(jié),通過該串口驅(qū)動的數(shù)據(jù)通信,實現(xiàn)藍牙網(wǎng)關(guān)的狀態(tài)切換。 但在藍牙應用的大環(huán)境里,沒有統(tǒng)一的關(guān)于藍牙串口驅(qū)動技術(shù)的實現(xiàn)方案。
發(fā)明內(nèi)容
發(fā)明目的 本發(fā)明的目的是針對現(xiàn)有技術(shù)的空白,提出基于藍牙芯片的統(tǒng)一的藍牙串口驅(qū)動 技術(shù)的實現(xiàn)方案,對藍牙連接的操作標準控制接口。實現(xiàn)藍牙芯片與具有串口的設(shè)備(例 如電腦,ARM等)之間的串口通信,通過藍牙芯片與具有串口的設(shè)備(例如電腦,ARM等) 之間的串口的直接連接。
技術(shù)方案 該技術(shù)通過藍牙芯片提供的串口與其他設(shè)備相連,可向其他設(shè)備傳輸數(shù)據(jù)或者接 收從其他設(shè)備傳來的數(shù)據(jù)。藍牙芯片通過發(fā)送指定的數(shù)據(jù)通知其他設(shè)備(例如電腦,ARM 等)其消息映射的各個環(huán)節(jié),通過接收其他設(shè)備(例如電腦,ARM等)的數(shù)據(jù)指令,實現(xiàn)藍 牙不同功能(例如藍牙耳機,文件傳輸?shù)?之間的切換。 本方案的實現(xiàn),是基于Bluelab上的應用。藍牙相關(guān)的每一個數(shù)據(jù)流都會對應 于一個sink和一個source。藍牙將接收的外部數(shù)據(jù)放入source里,而要向外發(fā)送的數(shù) 據(jù)是放入sink里發(fā)送。藍牙串口驅(qū)動技術(shù)就是這樣的一個應用。藍牙串口對應的soure 禾口 sink分別是StreamUartSource 0禾口 StreamUartSink () 。 StreamUartSource ()是存 儲從外部設(shè)備(例如電腦,ARM等)傳來的數(shù)據(jù),而要發(fā)送出去的數(shù)據(jù)是需要先寫入到 StreamUartSink()中,然后發(fā)送出去。
—種基于融合通信終端藍牙串口實現(xiàn)的方法, [ooog]( — )接收數(shù)據(jù)的步驟為 藍牙通過串口接收數(shù)據(jù)分為兩次,第一次接收一個數(shù)據(jù),第二次將剩余的數(shù)據(jù)全 部接收; A、程序運行,判斷接收到數(shù)據(jù)的個數(shù),當個數(shù)為零則結(jié)束返回;當個數(shù)為1時,執(zhí) 行B步驟;當個數(shù)大于或等于為2時,執(zhí)行C D步驟; B、當接收到的數(shù)據(jù)個數(shù)為l,則對接收到的數(shù)據(jù)進行提取先將該接收到的數(shù)據(jù) 申請的指針所指向的內(nèi)存空間清空,接著將接收到的數(shù)據(jù)映射出來,并將其拷貝給已清空 的存放數(shù)據(jù)的指針,最后返回獲取一個數(shù)據(jù)的首地址;
3
C、對接收到的數(shù)據(jù)進行提取接收第一個數(shù)據(jù)時,先將該接收到的數(shù)據(jù)申請的指 針所指向的內(nèi)存空間清空,接著將接收到的數(shù)據(jù)映射出來,并將其拷貝給已清空的存放數(shù) 據(jù)的指針,同時指針加一; D、接收剩余數(shù)據(jù)時,將該剩余數(shù)據(jù)映射并拷貝給該指定的指針,清空該指針所指 向的內(nèi)存空間,最后返回獲取兩個或兩個以上數(shù)據(jù)的首地址;
返回均是接收到的數(shù)據(jù)的首地址;
(二)發(fā)送數(shù)據(jù)的步驟為E、程序運行后,使用StreamDisconnect()函數(shù)將串口的Source與Sink斷開;
F、將聲明的Sink型變量sink指向StreamUartSink(),并通過SinkClaim()函數(shù) 獲得偏移量; G、將指定的指針指向Sink,然后將需要發(fā)送的數(shù)據(jù)拷貝給偏移了 offset的指定 的指針;H、通過SinkFlush()函數(shù)更新StreamUartSink()的內(nèi)容;
J、發(fā)送數(shù)據(jù)成功,結(jié)束返回。
有益效果 本發(fā)明能流暢的實現(xiàn)其他微處理器與藍牙模塊的串口通信,藍牙設(shè)備通過其串口 與其他設(shè)備或處理器相連接,可以自由的收發(fā)數(shù)據(jù)。 同時,本發(fā)明支持應用程序?qū)崿F(xiàn)不同的藍牙應用框架,實現(xiàn)支持各種硬件和操作 系統(tǒng)的移植性強的應用程序,任何擴展多不會影響應用程序本身,填補了藍牙技術(shù)領(lǐng)域的空缺。
圖1是本發(fā)明中藍牙模塊與微處理器的簡單連接圖。
圖2是本發(fā)明中接收一個數(shù)據(jù)的流程圖。
圖3是本發(fā)明中接收兩個數(shù)據(jù)的流程圖。
圖4是本發(fā)明中接收兩個以上數(shù)據(jù)的流程圖。
圖5是本發(fā)明中發(fā)送數(shù)據(jù)的流程圖。
具體實施例方式
下面結(jié)合附圖對本發(fā)明的技術(shù)方案進行詳細說明 本方案的實現(xiàn),是基于Bluelab上的應用。藍牙相關(guān)的每一個數(shù)據(jù)流都會對應 于一個sink和一個source。藍牙將接收的外部數(shù)據(jù)放入source里,而要向外發(fā)送的數(shù) 據(jù)是放入sink里發(fā)送。藍牙串口驅(qū)動技術(shù)就是這樣的一個應用。藍牙串口對應的soure 禾口 sink分別是StreamUartSource 0禾口 StreamUartSink () 。 StreamUartSource ()是存 儲從外部設(shè)備(例如電腦,ARM等)傳來的數(shù)據(jù),而要發(fā)送出去的數(shù)據(jù)是需要先寫入到 StreamUartSink ()中,然后發(fā)送出去。 接收外部數(shù)據(jù)的實現(xiàn)細則如下藍牙通過串口接收數(shù)據(jù)分為兩次,第一次接收一 個,第二次將剩余的數(shù)據(jù)全部接收。針對該情況,該發(fā)明提供了接收外部數(shù)據(jù)的三個函數(shù), 分別為接收一個數(shù)據(jù)的函數(shù)char * Rev0neDateFrom0ut(void);接收兩個數(shù)據(jù)的函數(shù)char* RevTwoDateFromOut(void);和接收兩個以上的數(shù)據(jù)的函數(shù)char *RevMorethanTwoDateFrom0ut(void);返回均是接收到的數(shù)據(jù)的首地址。 發(fā)送數(shù)據(jù)則是通過void SendDataToArm(char *temp)函數(shù)實現(xiàn),將需要發(fā)送的數(shù)據(jù)temp通過該函數(shù)將其發(fā)送出去。
先聲明全局變量并申請一塊內(nèi)存空間int氺dest—imrt 5int* report—data—uart ;int Uartmalloc(int size)
dest—imrtif(NULL =
printf("return—l
(int *)malloc(size * sizeof(int))dest一uart)
7 Uartmalloc error\n〃 );
} 程序運行,通過SourceBoundary()函數(shù)來判斷StreamUartSource ()里接收到數(shù)據(jù)的個數(shù),是零則返回NULL,零則說明已經(jīng)接收到數(shù)據(jù),如果數(shù)據(jù)個數(shù)為一,則對接收到的數(shù)據(jù)進行提取。提取過程就是將該數(shù)據(jù)放入指定的存放數(shù)據(jù)的指針里。具體有,先將申請的指針所指向的內(nèi)存空間清空,此時用到memset()函數(shù),然后用SourceM即()函
memset(dest—uart,0, size * sizeof(int))report—data—uart = dest_uart 5return 0 5
接收一個數(shù)據(jù)
char氺RevOneDateFromOut(void)
uintl6 packet—size ;if ((packet—size =
if((packet—size =
0)
l)) memset(dest_uart,0,100 * sizeof(int))memcpy(dest_uart,
return ((char氺)clest—imrt);
return NULL ;
,packet_size)數(shù)將接收到的數(shù)據(jù)映射出來,并將其拷貝給存放數(shù)據(jù)的指針,接著用SourceDrop()將StreamUartSource ()清空,最后返回獲取一個數(shù)據(jù)的首地址。其流程圖見圖2所示。
接收兩個數(shù)據(jù)
<formula>formula see original document page 6</formula>
程序運行,通過SourceBoundary()函數(shù)來判斷StreamUartSource ()里接收到數(shù)據(jù)的個數(shù),是零則返回NULL,非零則說明已經(jīng)接收到數(shù)據(jù),則對接收到的數(shù)據(jù)進行提取。提取過程就是接收兩個數(shù)據(jù)的第一個數(shù)據(jù)時,通過判斷該數(shù)據(jù)個數(shù)是否為一,并且存放數(shù)據(jù)的指針是空(表示沒有存放過數(shù)據(jù))或者存放數(shù)據(jù)的指針里有兩個數(shù)據(jù)(表示將前一次的兩個數(shù)據(jù)接收完畢),則將存放數(shù)據(jù)的指針清空,并通過SourceMap ()函數(shù)將接收到的數(shù)據(jù)映射出來,并將其拷貝給已清空的存放數(shù)據(jù)的指針,同時指針加一。接收兩個數(shù)據(jù)的第二個數(shù)據(jù)時,通過判斷該數(shù)據(jù)個數(shù)是否為一,并且存放數(shù)據(jù)的指針里已經(jīng)存放有第一個數(shù)據(jù),則將該數(shù)據(jù)映射并拷貝給該指定的指針,接著用SourceDrop ()將StreamUartSource ()清空,最后返回獲取兩個數(shù)據(jù)的首地址。其流程圖見圖3所示。
接收兩個以上的數(shù)據(jù) char * RevMorethanTwoDateFromOut(void)
{ uintl6 packet—size ;0094]0095]0096]0097]0098]0099]0100]0101]0102]0103]0104]0105]0106]0107]0108]0109]0110]
if ((packet—size = SourceBo皿dary (StreamUartSource 0)) ! = 0)
if((packet—size
l))
memset (r印ort—data—uart, 0, 100 * sizeof(int));dest—imrt = r印ort—data—imrt 5
memcpy(dest—uart, SourceMap(StreamUartSource()) , packet—size)SourceDrop(StreamUartSource() , packet—size);dest—imrt = dest_imrt+packet_size ;
6ls6
memcpy(dest—uart, SourceMap(StreamUartSource()) , packet—size)SourceDrop(StreamUartSource() , packet—size);return ((char承)r印ort—data—imrt) s
O川]return亂L ;0112] }
0113] 程序運行,通過SourceBoundary()函數(shù)來判斷StreamUartSource ()里接收到數(shù)據(jù)的個數(shù),是零則返回NULL。非零則說明已經(jīng)接收到數(shù)據(jù),則對接收到的數(shù)據(jù)進行提取。提取過程就是接收第一個數(shù)據(jù)時,通過判斷該數(shù)據(jù)個數(shù)是否為一,是一則將存放數(shù)據(jù)的指針清空,并通過SourceMap ()函數(shù)將接收到的數(shù)據(jù)映射出來,并將其拷貝給已清空的存放數(shù)據(jù)的指針,同時指針加一。接收剩余數(shù)據(jù)時,通過判斷該數(shù)據(jù)個數(shù)不只一個,將剩下的接收到的數(shù)據(jù)映射并拷貝給該指定的指針,接著用SourceDrop ()將StreamUartSource ()清空,最后返回獲取兩個以上數(shù)據(jù)的首地址。其流程圖見圖4所示。
發(fā)送數(shù)據(jù)
void SendDataToArm(char襯emp)
rtSour
Sink sink juintl6 offset ;uint8氺dest ;const char氺stringuintl6 length = strlen(string);StreamDisco皿ect (StreamUartSource 0 , StreamSinkFromSource (StreamUa
temp
C6
StreamUartSink())
sink = StreamUartSink();PanicNull(sink);offset = SinkClaim(sink, length);if (offset == OxFFFF) Panic ();dest = SinkM鄰(sink);(void)PanicNull(dest);memcpy(dest+offset, string,length);PanicZero(SinkFlush(sink, length)) 5 }
發(fā)送數(shù)據(jù) 程序運行后,使用StreamDisconnect()函數(shù)將串口的Source與Sink斷開,接著將聲明的Sink型變量sink指向StreamUartSink (),并通過SinkClaim()函數(shù)獲得偏移量。將指定的指針指向Sink,然后將需要發(fā)送的數(shù)據(jù)拷貝給偏移了 offset的指定的指針,最后通過SinkFlush()函數(shù)更新StreamUartSink()的內(nèi)容,實現(xiàn)數(shù)據(jù)的發(fā)送。其流程圖見圖5所示。
權(quán)利要求
一種基于融合通信終端藍牙串口實現(xiàn)的方法,其特征在于(一)接收數(shù)據(jù)的步驟為藍牙通過串口接收數(shù)據(jù)分為兩次,第一次接收一個數(shù)據(jù),第二次將剩余的數(shù)據(jù)全部接收;A、程序運行,判斷接收到數(shù)據(jù)的個數(shù),當個數(shù)為零則結(jié)束返回;當個數(shù)為1時,執(zhí)行B步驟;當個數(shù)大于或等于為2時,執(zhí)行C~D步驟;B、當接收到的數(shù)據(jù)個數(shù)為1,則對接收到的數(shù)據(jù)進行提取先將該接收到的數(shù)據(jù)申請的指針所指向的內(nèi)存空間清空,接著將接收到的數(shù)據(jù)映射出來,并將其拷貝給已清空的存放數(shù)據(jù)的指針,最后返回獲取一個數(shù)據(jù)的首地址;C、對接收到的數(shù)據(jù)進行提取接收第一個數(shù)據(jù)時,先將該接收到的數(shù)據(jù)申請的指針所指向的內(nèi)存空間清空,接著將接收到的數(shù)據(jù)映射出來,并將其拷貝給已清空的存放數(shù)據(jù)的指針,同時指針加一;D、接收剩余數(shù)據(jù)時,將該剩余數(shù)據(jù)映射并拷貝給該指定的指針,清空該指針所指向的內(nèi)存空間,最后返回獲取兩個或兩個以上數(shù)據(jù)的首地址;返回均是接收到的數(shù)據(jù)的首地址;(二)發(fā)送數(shù)據(jù)的步驟為E、程序運行后,使用StreamDisconnect()函數(shù)將串口的Source與Sink斷開;F、將聲明的Sink型變量sink指向StreamUartSink(),并通過SinkClaim()函數(shù)獲得偏移量;G、將指定的指針指向Sink,然后將需要發(fā)送的數(shù)據(jù)拷貝給偏移了offset的指定的指針;H、通過SinkFlush()函數(shù)更新StreamUartSink()的內(nèi)容;J、發(fā)送數(shù)據(jù)成功,結(jié)束返回。
全文摘要
本發(fā)明提供一種基于融合通信終端藍牙串口實現(xiàn)的方法,接收數(shù)據(jù)的步驟為藍牙通過串口接收數(shù)據(jù)分為兩次,第一次接收一個數(shù)據(jù),第二次將剩余的數(shù)據(jù)全部接收;返回均是接收到的數(shù)據(jù)的首地址。發(fā)送數(shù)據(jù)則是通過void SendDataToArm(char*temp)函數(shù)實現(xiàn),將需要發(fā)送的數(shù)據(jù)temp通過該函數(shù)將其發(fā)送出去。本發(fā)明能流暢的實現(xiàn)其他微處理器與藍牙模塊的串口通信,藍牙設(shè)備通過其串口與其他設(shè)備或處理器相連接,可以自由的收發(fā)數(shù)據(jù),同時,本發(fā)明支持應用程序?qū)崿F(xiàn)不同的藍牙應用框架,實現(xiàn)支持各種硬件和操作系統(tǒng)的移植性強的應用程序,任何擴展多不會影響應用程序本身,填補了藍牙技術(shù)領(lǐng)域的空缺。
文檔編號H04B5/00GK101719774SQ200910263268
公開日2010年6月2日 申請日期2009年12月17日 優(yōu)先權(quán)日2009年12月17日
發(fā)明者任夢琪, 吳帆揚, 夏然輝, 孫慶慶, 孫龍, 張金璽, 洪松, 王開, 王毛, 葛俊, 裴文江 申請人:東南大學