国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Linux UART接口調試技巧

2019-11-06 08:20:22
字體:
來源:轉載
供稿:網友

在嵌入式項目中,UART接口的使用頻率很高,多種模塊(2G通信模組、藍牙模塊,等等)都會通過UART接口與主控MCU相連。本文將梳理UART接口調試流程,為調試工作提供參考,解決調試過程中可能遇到的問題,快速完成UART接口調試,實現模塊功能。

配置驅動選項

首先查看原理圖確認串口號,比如UART1,同時查看該串口引腳是否有復用功能,比如用作SD卡接口。如果有復用,需要在內核配置中取消復用功能的選項。然后選中串口功能,大致的路徑為

Device Drivers > Character devices > Serial drivers

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

$ make menuconfig

這里寫圖片描述

產生UART設備節點

編譯運行內核,如果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<stdio.h>#include<stdlib.h>#include<string.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<termios.h>#include<string.h>int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop){ struct termios newtio,oldtio; if( tcgetattr( fd,&oldtio) != 0) { perror("tcgetattr error"); return -1; } bzero( &newtio, sizeof( newtio ) ); newtio.c_cflag |= CLOCAL | CREAD; newtio.c_cflag &= ~CSIZE; switch( nBits ) { case 7: newtio.c_cflag |= CS7; break; case 8: newtio.c_cflag |= CS8; break; } switch( nEvent ) { case 'O': newtio.c_cflag |= PARENB; newtio.c_cflag |= PARODD; newtio.c_iflag |= (INPCK | ISTRip); break; case 'E': newtio.c_iflag |= (INPCK | ISTRIP); newtio.c_cflag |= PARENB; newtio.c_cflag &= ~PARODD; break; case 'N': newtio.c_cflag &= ~PARENB; break; } switch( nSpeed ) { case 2400: cfsetispeed(&newtio, B2400); cfsetospeed(&newtio, B2400); break; case 4800: cfsetispeed(&newtio, B4800); cfsetospeed(&newtio, B4800); break; case 9600: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break; case 115200: cfsetispeed(&newtio, B115200); cfsetospeed(&newtio, B115200); break; case 460800: cfsetispeed(&newtio, B460800); cfsetospeed(&newtio, B460800); break; default: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break; } if( nStop == 1){ newtio.c_cflag &= ~CSTOPB; }else if ( nStop == 2 ){ newtio.c_cflag |= CSTOPB; } newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 0; tcflush(fd,TCIFLUSH); if((tcsetattr(fd,TCSANOW,&newtio))!=0) { perror("set error"); return -1; } return 0;}int main(int argc,char *argv[]){ int fd,ret_set,ret_read,ret; char buf_read[100]; char tty[20]="/dev/"; if(4 == argc) { strcat(tty,argv[1]); fd = open(tty, O_RDWR); if(fd == -1) { printf("Open %s failed! Exit!/n",tty); exit(1); } printf("open %s successfully!/n",tty); ret_set = set_opt(fd, atoi(argv[2]), 8, 'N', 1); if (ret_set == -1) { printf("Set %s failed! Exit!/n",tty); exit(1); } printf("Set %s successfully!/n",tty); printf("Baud rate: %s/n",argv[2]); printf("Data: %s/n",argv[3]); while (1) { memset(buf_read, 0, sizeof(buf_read)); ret = write(fd, argv[3], 100); if( ret > 0){ printf("Write data: %s/n",argv[3]); }else{ printf("Write data failed! Exit!/n"); exit(1); } ret_read = read(fd, buf_read, 100); if(ret_read > 0){ printf("Read data: %s/n/n", buf_read); } sleep(3); } close(fd); }else{ printf("Usage: uart [tty node] [baud rate] [data]/n"); printf(" Sample: uart ttyHSL1 115200 test/n"); } return 0;}

測試程序github地址:https://github.com/IOT-er/uart

交叉編譯得到執行文件uart:

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

運行uart進行回環測試: 這里寫圖片描述 可以看到UART1成功收到了發送的 hello字符。

管腳信號測試

軟件回環測試通過之后,將UART1的RX、TX管腳短接,關閉軟件回環,使用uart程序進行自收發測試。 關閉軟件回環:

$ echo 0 > loopback.1

此時有可能出現的問題是TX管腳無信號輸出,確認硬件線路無誤后最可能的原因是TX管腳被其他功能占用。 如果管腳信號測試通過,則串口功能基本調試成功。此方法的優點是無需上位機串口助手的配合,在串口模塊到位之前提前完成接口調試工作。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 项城市| 耒阳市| 克拉玛依市| 东海县| 汽车| 东城区| 腾冲县| 怀远县| 明光市| 茂名市| 松阳县| 从江县| 苏尼特右旗| 公安县| 静乐县| 基隆市| 济阳县| 双辽市| 通榆县| 湟中县| 静安区| 新龙县| 将乐县| 临城县| 浠水县| 健康| 阿荣旗| 定南县| 水城县| 田林县| 浪卡子县| 黄梅县| 巨鹿县| 普陀区| 多伦县| 依兰县| 米泉市| 蓬安县| 镇沅| 望都县| 和顺县|