Z-Stack中HalUARTWrite的使用以及osal_strlen()的使用

Z-Stack中串口的使用,涉及到一個字符串指針的問題。串口寫函數如下

uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len)

port 自不必說,HAL_UART_PORT_0或者_1,我想說的是字符串的長度。

首先,我們定義這樣一個字符串,如下所示

uint8 *txBuffer = "I am uartCallBack";
HalUARTWrite(HAL_UART_PORT_0,txBuffer,17);

這裏我們通過自己數得出字符串的長度。

第二種方法,通過osal_strlen()函數讀取字符串的長度。

uint8 *txBuffer = "I am uartCallBack";
HalUARTWrite(HAL_UART_PORT_0,txBuffer,osal_strlen(txBuffer));
osal_strlen()函數如下:
int osal_strlen( char *pString )
return (int)( strlen( pString ) );

可以看到osal_strlen()函數調用的就是c語言中的strlen()函數。通過調試,osal_strlen()計算出的結果就是17。那麼,

如果我們的字符串不是採用字符串指針,而是採用數組的方式,那麼還是採用osal_strlen()函數嗎?

爲什麼會有這個疑問?疑問的產生來自於,字符串是通常被認爲是常量,是保存在一段固定的內存中的,這段內存是
以'\0'爲結束符,這段內存通常只能通過一個指針來找到。字符數組其實和其他數組沒什麼區別,只是保存的數據
類型是字符類型(char),它沒有強制要求最後的元素是否是'\0'。那麼既然這樣,那麼osal_strlen()計算出的長度
是否包含'\0',
長度究竟爲多少呢?繼續分析:

uint8 ttxBuffer[] =  "I am Array";
HalUARTWrite(HAL_UART_PORT_0,ttxBuffer,osal_strlen(ttxBuffer));

如果是默認加個/0,那麼這個數組的長度就爲10+1。這個長度我們可以通過sizeof來驗證該數組所佔內存空間,

但是osal_strlen()計算出的大小就只爲10。這是因爲strlen()函數,計算長度的時候,是忽略掉/0的。結果就一目

瞭然了,使用osal_strlen的長度就可以實現HalUARTWrite的讀寫,而uart也不需要輸出末尾的\0。

但是有個讓我們模糊的地方就是TI的官方例子中,AF_DataRequest函數,發送一個字符數組,具體情況如下:

char theMessageData[] = "Hello World";
	
if ( AF_DataRequest( &MyApp_DstAddr, (endPointDesc_t *)&MyApp_epDesc,
				MyApp_CLUSTERID,
				(byte)osal_strlen( theMessageData ) + 1,
				(byte *)&theMessageData,
				&MyApp_TransID,
				AF_DISCV_ROUTE, AF_DEFAULT_RADIUS ) == afStatus_SUCCESS )

可以看到這裏它使用了osal_strlen( theMessageData)+1來計算長度,也就是說,它加入了默認的/0。

具體原因不明,與uart正好相反。根據樓主的經驗,字符數組和字符串都是不能直接使用osal_mem_free()

函數來釋放內存的,否則會導致出錯,而且IAR是不會告訴你是你釋放內存導致出錯的。只有在使用osal_mem_alloc()

函數分配的,纔可以使用free()函數來釋放內存。

根據樓主查找API文檔得知,此函數僅在內存已經通過調用osal_mem_alloc被分配纔有效。

附帶一句,如果需要連接字符串,可以使用sprintf()函數,此函數灰常強大。童鞋們可以自行查找。

另外對c語言中字符串和字符數組還是不明白的,可以詳細看看這篇文章,鏈接如下,寫的很詳細。

http://blog.chinaunix.net/uid-20937170-id-3274607.html





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章