嵌入式Linux系統串口和以太網編程_第1頁
嵌入式Linux系統串口和以太網編程_第2頁
嵌入式Linux系統串口和以太網編程_第3頁
嵌入式Linux系統串口和以太網編程_第4頁
嵌入式Linux系統串口和以太網編程_第5頁
已閱讀5頁,還剩10頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、中國地質大學(北京)實 驗 報 告 課程名稱:嵌入式系統 實驗名稱:嵌入式Linux系統串口和以太網編程 姓 名: 學 號: 班 級: 指導教師:曾 衛 華 評 分: 實驗時間: 2013.5 實驗題目:嵌入式Linux系統串口和以太網編程一、實驗目的1、 熟悉Linux環境2、 掌握嵌入式開發的基本流程,培養解決問題的能力3、 掌握Linux串口及以太網socket的應用程序開發4、 自學嵌入式Linux中多線程編程基礎二、實驗內容本次實驗通過編寫服務器(開發板)與客戶端(虛擬機ubuntu)上的應用程序,來實現服務器與客戶端之間信息的透明轉發,構成類似于聊天的功能。該功能實現包括兩個方面。

2、其一:服務器通過串口從終端(電腦鍵盤)上讀取(read)數據,再通過網絡(clifd)把讀取到的數據發送到客戶端,客戶端在接收到數據后在顯示器上打印出來;其二:客戶端把數據通過網絡發送到主機上,主機接收到數據后通過串口寫到電腦終端軟件(SecureCRT)進行顯示。實驗流程圖如下:圖一:總體框架圖三、基礎知識1、 掌握linux串口和以太網socket應用程序開發方法:串口配置:j打開串口,獲得串口的使用句柄fd àk獲取原先配置參數并進行保存àl設置波特率àm設置奇偶校驗位àn設置ào設置停止位àp設置最少接受字符和等待時間

3、4;q設置數據位、無流控等相關參數àr激活最新配置às結束時還原串口原先配置。網絡socket編程:服務器端:j創建一個socketàkbind(),給socket注冊服務器端口地址àllisten(),開始監聽已經綁定的端口,創建監聽隊列àmaccept(),返回一個新的socket,阻塞等待客戶端client的連接àn send(),recv()發送和接收數據àoclose(),關閉服務器。客戶端:j創建一個socketàkconnect(),建立與服務器的連接àlsend(),recv()發送和接收

4、數據àmoclose(),關閉客戶端。2、 掌握linux系統中線程的使用方法:在linux中創建新的線程可以使用兩種方式:pthread_create()函數和fork()函數。pthread_create()使用:int pthread_create(pthread_t *restrict thread,const pthread_attr_t *restrict attr,void *(*start_routine)(void*), void *restrict arg);參數:

5、thread輸出線程id,attr 線程屬性, 默認NULL,start_routine線程執行函數,arg線程執行參數 。函數成功時返回0, 否則返回錯誤碼。fork()函數的使用:一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程(child process)。fork函數被調用一次但返回兩次。兩次返回的唯一區別是子進程中返回0值而父進程中返回子進程ID。這樣,對于程序,只要判斷fork函數的返回值,就知道自己是處于父進程還是子進程中。四、實現過程1、 4.4.3交叉編譯工具的PATH已經生效,在任意目錄下能夠執行arm-linux-gc

6、c v2、 在開發板上進行內核以及根文件系統的移植,構建嵌入式linux系統3、 nfs網絡文件系統的配置:1打開nfs1175.exe2配置板子ip,使其和電腦ip在同一個網段 3掛載:在板子上運行 #mount -t nfs -o nolock 202.204.100.66:/f/aaa/LINUX/Share /mnt/nfs 4使用 cd /mnt/nfs/0522 進入nfs共享目錄下,ls 顯示共享目錄下的文件;4、 仔細閱讀提供的代碼server.c和client.c Target為服務器,Ubuntu為客戶端。修改和完善代碼,在原代碼的基礎上實現新的功能5、 交叉編譯serve

7、r.c(# arm-linux-gcc -lpthread -o server server.c)6、 本地編譯client.c(# gcc -o client client.c -lpthread)7、 在板子上運行server可執行文件: #chmod 777 server,運行server: #./server 8、 在ubuntu上運行client程序:# ./client 202.204.100.67; 五、 實驗結果客戶端運行client與服務器端運行server建立通信服務器端:客戶端:按下$中斷通信服務器端:客戶端:六、心得體會在這一次的實驗中,我們先建立硬件實驗平臺,又建立主

8、機軟件開發環境,接著為實驗進行各項配置,最后完成了各個實驗中的多種功能。很重要的一點,前期的硬件、軟件準備必須完整無誤地實現,這是后續的實驗能順利進行的前提。本實驗中,已經給出了串口程序和socket編程的程序,需要我們自學多線程編程的知識并結合已經學過的串口和以太網編程來修改和完善代碼,在原代碼的基礎上實現新的功能。即便如此,還是不太簡單的。在這一次的實驗中,我深深地感受到基礎知識不扎實的嚴重后果:在實際的開發過程中會遇到各種各樣的問題(如線程的使用,程序代碼的容錯處理,莫名問題的解決等)。究其原因還是對知識的掌握不夠牢固,一知半解。所以,必須要詳細了解其實現過程和原理才能夠盡量避免開發過程

9、中錯誤的發生,提高開發進度。通過這一次的實驗對于嵌入式linux的開發過程有了一個總體的把握和認識,我深知目前所掌握的嵌入式linux知識還只是皮毛,必須還要進一步的深入才能夠有所提升。這也是我今后需要提高的方向。最后感謝曾衛華老師的悉心教導!附錄(程序源碼)客戶端代碼:#include <stdio.h> #include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <stdlib.h>

10、; #include <strings.h>#include <string.h>#define SERVER_PORT 20000 / define the defualt connect port id #define CLIENT_PORT (20001+rand()%65536) / define the defualt client port as a random port #define BUFFER_SIZE 256 #define LENGTH_OF_LISTEN_QUEUE 10 /length of listen queue in server #

11、define WELCOME_MESSAGE "welcome to connect the server." void usage(char* name) printf( "usage: %s IpAddrn " ,name); struct sockaddr_in servaddr,cliaddr;int servfd,clifd,length = 0; struct sockaddr_in servaddr,cliaddr; socklen_t socklen = sizeof (servaddr); char bufBUFFER_SIZE,buf

12、2BUFFER_SIZE; pthread_t tidp,tidp2;int pth;int runflag=0;void *Thread1(void *arg)while(runflag)memset(buf,0,BUFFER_SIZE);length = recv(clifd, buf,BUFFER_SIZE, 0); if(strstr(buf,"$")>0) runflag=0;printf("stop!n");break;if(length > 0) printf("from server: %s",buf);

13、void *Thread2(void *arg)printf("Please input your words to Server: - $ to stopn");while(runflag)memset(buf2,0,BUFFER_SIZE);scanf("%s",buf2);send(clifd,buf2,strlen(buf2), 0);if(strstr(buf2,"$")>0) runflag=0;printf("stop!n");break; int main(int argc, char* ar

14、gv) if(argc < 2 ) usage(argv0); exit( 1 ); if(clifd = socket(AF_INET,SOCK_STREAM,0) < 0 ) /tcpprintf( " create socket error!n " ); exit( 1 ); srand(time(NULL); / initialize random generator bzero( & cliaddr, sizeof (cliaddr); cliaddr.sin_family = AF_INET; cliaddr.sin_port = htons

15、(CLIENT_PORT); cliaddr.sin_addr.s_addr = htons(INADDR_ANY); if(bind(clifd,(struct sockaddr* )&cliaddr,sizeof(cliaddr) < 0 ) printf( "bind to port %d failure!n " ,CLIENT_PORT); exit( 1 ); /綁定的目的是讓其端口是隨機的,否則端口是自增1 /一般情況下client端不用綁定bzero(&servaddr, sizeof(servaddr); servaddr.sin_fa

16、mily = AF_INET; inet_aton(argv1, &servaddr.sin_addr); servaddr.sin_port = htons(SERVER_PORT); if(connect(clifd,( struct sockaddr *)&servaddr, socklen) < 0) printf( "can't connect to %s!n", argv1); exit(1); runflag=1;pth=pthread_create(&tidp,NULL,Thread1,NULL);if(pth!=0)

17、printf("error!");return -1;pth=pthread_create(&tidp2,NULL,Thread2,NULL);if(pth!=0) printf("error!");return -1;pthread_detach(tidp);pthread_detach(tidp2); while(runflag) ;close(clifd);return 0; 服務器端代碼:#include <stdio.h>#include <sys/types.h>#include <sys/socket.

18、h> #include <unistd.h> #include <netinet/in.h> #include <arpa/inet.h>#include <stdlib.h> #include <time.h> #include <string.h>#include <strings.h> #include <sys/ioctl.h>#include <fcntl.h>#include <termios.h>#include <stdlib.h>#incl

19、ude <errno.h>#include <time.h>#include <sys/time.h>#include <linux/rtc.h> #include <pthread.h> #define COM0 0#define BLOCK_MODE 1#define NONBLK_MODE 0#define COM0 0#define BLOCK_MODE 1#define NONBLK_MODE 0#define SERVER_PORT 20000 /define the defualt connect port id #de

20、fine LENGTH_OF_LISTEN_QUEUE 10 /length of listen queue in server #define QUEUE 20 /length of listen queue in server #define BUFFER_SIZE 256#define WELCOME_MESSAGE "welcome to connect the server." static struct termios g_newtio,g_oldtio;static int speed_arr = B115200, B57600, B38400, B19200

21、, B9600, B4800, B2400, B1200, B300, B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300, ;static int name_arr = 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300, 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300, ;/* 函數名稱: / 函數名稱* 功能描述: / 函數功能、性能等的描述* 輸入參數: / 輸入參數說明,包括每個

22、參數的作用、取值說明及參數間關系* 輸出參數: / 對輸出參數的說明。* 返 回 值: -1:Failed * 其它說明: / 其它說明* 修改日期 版本號 修改人 修改內容* -* 2007/10/10 V1.0 XXXX XXXX*/int Init_COM(int Comm,int Baudrate,int Parity,int Stopbit,int Flagblock)int ret,i;char dev_buf16;if(Comm > 3)printf("Com%d not existn",Comm);return -1;memset(dev_buf,0x

23、00,sizeof(dev_buf);sprintf(dev_buf,"/dev/ttyS%d",Comm); if(Flagblock) ret = open(dev_buf, O_RDWR | O_NOCTTY ); / 以默認阻塞方式打開; else ret = open(dev_buf, O_RDWR | O_NOCTTY | O_NONBLOCK); /以非阻塞方式打開; if(ret < 0) printf("Open ttyS%d failedn",Comm); return -1; if( tcgetattr(ret, &g

24、_oldtio) < 0 ) printf("Get Com Parameter Error.n"); return -1; for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i+) if(Baudrate = name_arri) cfsetispeed(&g_newtio,speed_arri); cfsetospeed(&g_newtio,speed_arri); break; if(i>=sizeof(speed_arr) / sizeof(int) printf("Unsu

25、pported Speed!n"); return -1; switch (Parity) / 設置奇偶校驗位數 case 'n':case 'N': g_newtio.c_cflag &= PARODD; /very important; zwh g_newtio.c_cflag &= PARENB; /* Clear parity enable */ break; case 'o': case 'O': g_newtio.c_cflag |= PARENB; /* Enable parity */ g

26、_newtio.c_cflag |= PARODD; /* 設置為奇效驗*/ break; case 'e': case 'E': g_newtio.c_cflag |= PARENB; /* Enable parity */ g_newtio.c_cflag &= PARODD; /* 轉換為偶效驗*/ break; default: printf("Unsupported Parityn"); return -1; /*stop bit */switch(Stopbit)case 1:g_newtio.c_cflag &=

27、 CSTOPB;break;case 2:g_newtio.c_cflag |= CSTOPB;break;default:printf("Unsupported Stopbit!n");return -1;g_newtio.c_iflag = 0; /輸入無校驗g_newtio.c_oflag = 0; /輸出不處理g_newtio.c_lflag = 0; /RAW模式g_newtio.c_ccVTIME = 1; /* unit: 1/10 second. */ g_newtio.c_ccVMIN = 1; /* minimal characters for read

28、ing */ g_newtio.c_iflag &= INPCK; /* Disable parity checking */ g_newtio.c_cflag &= CRTSCTS; /NO flow controlg_newtio.c_cflag &= CSIZE;g_newtio.c_cflag |= CS8; /databit=8g_newtio.c_cflag |= CLOCAL; /本地連接g_newtio.c_cflag |= CREAD; /允許接收數據if( tcsetattr(ret, TCSANOW, &g_newtio) != 0 )/*

29、success*/printf("Set Com Parameter Error!n");return -1;tcflush (ret, TCIOFLUSH); /清空輸入輸出隊列return ret;void RestoreComConfiguration(int fd,struct termios *ptios)if( tcsetattr(fd, TCSANOW, ptios) != 0 )/*success*/printf("Restore Com Parameter Error!n");int fd;char buf1024,buf21024;i

30、nt servfd,clifd; struct sockaddr_in servaddr,cliaddr;int runflag=0;void *Thread1(void *arg)printf("Please input your words to Client: - $ to stopn");while(runflag)memset(buf,0,BUFFER_SIZE);read(fd,buf,1024);send(clifd,buf,strlen(buf), 0);if(strstr(buf,"$")>0) runflag=0;printf(

31、"stop!n");break;void *Thread2(void *arg)int length=0;while(runflag)char stdstr1024="from client:"memset(buf2,0,BUFFER_SIZE);length = recv(clifd, buf2,1024, 0); if(length > 0) strcat(stdstr,buf2);strcat(stdstr,"n");if(strstr(buf2,"$")>0) runflag=0;printf("stop!n");break;write(fd,stdstr,strlen(stdstr);void socket_init(void)if(servfd = socket(AF_INET,SOCK_STREAM, 0 ) < 0) printf("create socket error!n"); exit(1); bzero(&servaddr, sizeof(servaddr);

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論