網上和論壇裡面很多帖子都把精力集中到分析協議棧的串列埠工作機制上,比如分析dma工作原理,中斷工作原理,然後分析輸入和輸出buffer的處理等內容,學習者跟著協議棧的
串列埠底層一直到頂層轉圈、轉圈、再轉圈,矇圈了。
實際上,從應用角度講,我們根本就沒有必要去深入的追究zstack中串列埠的工作機制,
也沒有必要去搞清楚到底是怎麼dma和interrupt的,我們只要呼叫幾個簡單函式就可以正
常使用串列埠了。其實協議棧已經把使用串列埠的條件準備好了,我們何必再糾結硬體底層實現
呢?應用者應該把協議棧看作乙個平台,平台之上的應用才是我們的目標。下面我就講一下
如何利用協議棧現有平台來實現自己的串列埠應用。這裡我所提及的現有平台即是zstack自帶
的mt包,其實zstack中的這個mt包功能相當強大,通過ti提供的ztool工具可以用串
口的方式同整個協議棧進行互動,在我們編寫zigbee應用程式的過程中,很多不知道該如何
呼叫的函式都能在mt中找到參考!這個不多說了,有興趣的同學可以去專門研究一下mt
包。二、使用方法
在mt包中,已經有了串列埠初始化即串列埠資料處理函式可用,關鍵的幾個函式出現在
mt_uart.c檔案中。我們拿出來幾個關鍵函式說明一下(我撿重要語句注釋):
第乙個函式
void mt_uartinit ()
第二個函式
void mt_uartregistertaskid( byte taskid )
第三個函式
void mt_uartprocessztooldata ( uint8 port, uint8 event )
osal_msg_deallocate ( (uint8 *)pmsg );
}我們往上看看這個message是什麼?mt_uartprocessztooldata函式開始不遠的地方有以下程
序段:if (pmsg)
從這裡看到,這個函式建立了乙個訊息頭,用cmd_serial_msg做為訊息,那麼
osal_msg_send給任務的那個訊息將會以cmd_serial_msg出現。。。。。。。
好了,以上三個函式看完,我們試著使用一下:
{************x
************x
(這個函式的最後,其實放在這個函式的**都行)
mt_uartinit(); //added by kennan
}void mt_uartregistertaskid( byte taskid )
好了,這樣,我們順利地把串列埠發來的資料用mt_uartprocessztooldata來處理,並且把處理
{ if ( events & sys_event_msg )
break;
default:
break;}}
說明:因為ztool發過來的資料是有格式的,所以如果你用串列埠助手來測試,那麼發的數
據要按照格式來,如果你不想按那個格式,你可以自己去修改mt_uartprocessztooldata裡面
的相關程式。這種方法對於想要通過pc來控制zigbee的應用場合非常實用,因為你pc發過
來的一般也會有命令和資料,如果不用mt的格式,你自己也要規範乙個格式,既然mt已
經有了,我們就借用就好。
的情況,其機制也是類似的,只不過沒有規定格式,你更自由,這裡我就不多說了。
再有,如果你真的在測試的時候不知道那麼一長串資料的xor 結果是多少,也可以去
mt_uartprocessztooldata函式中,找到:
//if ((mt_uartcalcfcs ((uint8*)&pmsg->msg[0], mt_rpc_frame_hdr_sz +
len_token) == fsc_token))
else
//把我標紅的幾個位置注釋掉,就不會校驗了,你也不用算xor結果了,不過發資料的時候
這個位置還是要的,你隨便填個0好了。
在C 中使用SerialPort類實現串列埠通訊
下面主要介紹該類的主要屬性 表1 和方法 表.2 檢視。使用system.io.ports讀取com口資料 表1 serialport類的常用屬性 名 稱 說 明 basestream 獲取 serialport 物件的基礎 stream 物件 baudrate 獲取或設定序列波特率 breakst...
ros中使用serial包實現串列埠通訊
一 ubuntu下的串列埠助手cutecom 1.安裝cutecom並開啟 sudo apt get install cutecom sudo cutecomdmesg grep ttys 二 使用ros提供的serial包實現串列埠通訊sudo apt get install ros kineti...
STM32中使用printf列印串列埠資料
該方法適用於 stm32 實現了使用 printf 等標準c 流函式輸出資料的辦法,極大的減少了輸出串列埠資料時所需要做的資料處理。在 c庫中,printf 等輸出流函式都是通過 fputc 這個函式實現的,所以我們通過重對映的方式,修改這個函式的定義使它輸出在 stm32 的暫存器中,便可以實現使...