Linux UART介面除錯技巧

2021-07-27 17:25:31 字數 2973 閱讀 2942

在嵌入式專案中,uart介面的使用頻率很高,多種模組(2g通訊模組、藍芽模組,等等)都會通過uart介面與主控mcu相連。本文將梳理uart介面除錯流程,為除錯工作提供參考,解決除錯過程中可能遇到的問題,快速完成uart介面除錯,實現模組功能。

首先檢視原理圖確認串口號,比如uart1,同時檢視該串列埠引腳是否有復用功能,比如用作sd卡介面。如果有復用,需要在核心配置中取消復用功能的選項。然後選中串列埠功能,大致的路徑為

device drivers > character devices > serial drivers

不同廠家提供的bsp有細微差別,具體路徑視情況而定。在核心根目錄輸入make menuconfig開啟核心配置介面,選中uart1。以nuc970 為例,配置如下:

編譯執行核心,如果uart1驅動載入成功會在/dev目錄下產生相應uart裝置節點。以高通mdm9x07為例:

系統啟動之後在/dev下有兩個ttyhsl裝置節點:ttyhsl0、ttyhsl1。

$ cat /proc/tty/driver/msm_serial_hsl

輸入該命令可以顯示裝置節點詳細資訊,其中通過位址(0x078b3000)與data sheet對比即可確認uart1對應的裝置節點為/dev/ttyhsl1。

同時通過who命令可檢視當前終端tty資訊。

$ who

root ttyhsl0 00:00 jan 6 00:02:00

發現/dev/ttyhsl0為除錯串列埠。

如果uart裝置節點未產生,可在其相應驅動程式xx_probe函式中新增列印,檢視xx_probe函式是否被呼叫,進一步查詢原因。

如果成功產生了uart裝置節點,可通過軟體回環測試確認uart驅動程式功能是否正常。測試步驟:

進入loopback檔案所在目錄:

$ cd /sys/kernel/debug/msm_serial_hsl

將loopback.1值設定為1,開啟uart1回環測試。

$ echo 1 > loopback.1

回環測試程式**:

#include

#include

#include

#include

#include

#include

#include

#include

#include

int set_opt(int fd,int nspeed, int nbits, char nevent, int nstop)

bzero( &newtio, sizeof( newtio ) );

newtio.c_cflag |= clocal | cread;

newtio.c_cflag &= ~csize;

switch( nbits )

switch( nevent )

switch( nspeed )

if( nstop == 1)else

if ( nstop == 2 )

newtio.c_cc[vtime] = 0;

newtio.c_cc[vmin] = 0;

tcflush(fd,tciflush);

if((tcsetattr(fd,tcsanow,&newtio))!=0)

return0;}

int main(int argc,char *argv)

printf("open %s successfully!\n",tty);

ret_set = set_opt(fd, atoi(argv[2]), 8, 'n', 1);

if (ret_set == -1)

printf("set %s successfully!\n",tty);

printf("baud rate: %s\n",argv[2]);

printf("data: %s\n",argv[3]);

while (1)

else

ret_read = read(fd, buf_read, 100);

if(ret_read > 0)

sleep(3);

}close(fd);

}else

return

0;}

交叉編譯得到執行檔案uart:

$ arm-linux-gcc -g uart.c -o uart

執行uart進行回環測試:

可以看到uart1成功收到了傳送的 hello字元。

軟體回環測試通過之後,將uart1的rx、tx管腳短接,關閉軟體回環,使用uart程式進行自收發測試。

關閉軟體回環:

$ echo 0 > loopback.1

此時有可能出現的問題是tx管腳無訊號輸出,確認硬體線路無誤後最可能的原因是tx管腳被其他功能占用。

如果管腳訊號測試通過,則串列埠功能基本除錯成功。此方法的優點是無需上位機串列埠助手的配合,在串列埠模組到位之前提前完成介面除錯工作。

GDB除錯技巧,除錯命令

除錯時檢視依賴dsopidof tvm rpc server cat proc maps子程序除錯 1.vscode setupcommands output cpu simu dev bin ld library path ignorefailures false exec catch throw...

GDB除錯技巧

在公司工作了一段時間,發現 b s結構的 除錯很麻煩,經常用的手段是通過 printf 打一串訊息來進行跟蹤,然後估計問題出在 通過逐步新增 printf 語句,獲得越來越多的資訊最終確定問題的根源。我感覺這樣比較麻煩,如果能把 gdb的單步除錯功能用上就好了。工作之餘,做了一定的嘗試,希望對跟我一...

xcode除錯技巧

有時程式崩潰根本不知錯誤發生在什麼地方。比如程式出現exec bad access的時候,雖然大部分情況使用設定nszombieenabled環境變數可以幫助你找到問題的所在,但少數情況下,即使設定了nszombieenabled環境變數,還是不知道程式崩潰在什麼地方。那麼就需要使用下列 進行幫助了...