嵌入式系統實驗二_第1頁
嵌入式系統實驗二_第2頁
嵌入式系統實驗二_第3頁
嵌入式系統實驗二_第4頁
嵌入式系統實驗二_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、 實驗二 嵌入式系統程序設計實驗之linux串口和網絡編程 一、實驗目的: 1、強化本學期所學的相關的內容。 2、掌握串口相關設置。 3、強化基于TCP網絡傳輸的三次握手。 4、自學Linux線程的使用。二、實驗內容: 本試驗基于server和client的透明傳輸來實現類似于QQ的聊天功能。三、實驗過程: 1、linux開發環境的建立 2、嵌入式linux系統的搭建 1>BootLoader的移植 2>linux系統的裁剪與移植 Linux內核裁剪 ./make_image生成自己的uImage2638上電驗證:3>根文件系統的移植修改hostname為:whmtt./mk

2、cramfsdisk_new 生成rootfs_new.cramfs大小從老師給的40000到37b00(因為有的沒有用到,大小變小了):上電驗證: 3、客服端編程client.c 相關代碼:#include <stdio.h> #include <sys/socket.h> #include <unistd.h> #include <sys/types.h> #include <netinet/in.h> #include <stdlib.h> #include <strings.h>#include <

3、;string.h>#define SERVER_PORT 20000 /設置服務端口#define CLIENT_PORT (20001+rand()%65536) /設置客戶端端口(隨機) #define BUFFER_SIZE 256 #define LENGTH_OF_LISTEN_QUEUE 10 /可竊聽隊列長為10#define WELCOME_MESSAGE "welcome to connect the server." void usage(char* name) printf( "usage: %s IpAddrn " ,na

4、me); struct sockaddr_in servaddr,cliaddr;int servfd,clifd,length=0;struct sockaddr_in servaddr,cliaddr;socklen_t socklen=sizeof(servaddr);char bufBUFFER_SIZE,buf2BUFFER_SIZE;pthread_t tidp,tidp2;int pth;int runflag=0;void *Thread1(void *arg) /*等待runflag為1,當為1時清空buf,同時接收來自server的數據并輸出。但當沒有清空,則break.*

5、/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);void *Thread2(void *arg) /*等待發送數據給Server*/printf("Please input your words to Server:

6、-$ 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* argv) if(argc < 2 ) usage(argv0); exit( 1 ); if(clifd = socket(AF_INET,SOCK

7、_STREAM,0) < 0 ) /用tcp定義socketprintf( " 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(CLIENT_PORT); cliaddr.sin_addr.s_addr = htons(INADDR_ANY); if(bind

8、(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_family = AF_INET; inet_aton(argv1, &servaddr.sin_addr); servaddr.

9、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)printf("error!");return -1;pth=pthread_create(&tidp2,N

10、ULL,Thread2,NULL);if(pth!=0)printf("error!");return -1;pthread_detach(tidp);pthread_detach(tidp2);while(runflag);close(clifd);return 0; 4、服務端server.c編寫 相關代碼:#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h&g

11、t;#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>#include <errno.h>#include <sys/time.h>#include <linu

12、x/rtc.h>#include <pthread.h>#define COM0 0#define BLOCK_MODE 1#define NONBLK_MODE 0#define SERVER_PORT 20000#define LENGTH_OF_LISTEN_QUEUE 10#define QUEUE 20#define BUFFER_SIZE 256#define WELCOME_MESSAGE "welcome to connect the server."static struct termios g_newtio,g_oldtio;stati

13、c int speed_arr = B115200, B57600, B38400, B19200, 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, ;int Init

14、_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,0x00,sizeof(dev_buf);sprintf(dev_buf,"/dev/ttyS%d",Comm); if(Flagblock) ret = open(dev_buf, O_RDWR | O_NOCTTY );/以默認阻塞方

15、式打開 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_oldtio) < 0 )/保存原先的端口 printf("Get Com Parameter Error.n"); return -1; for ( i= 0; i < sizeof(speed_arr) / sizeof(i

16、nt); i+) if(Baudrate = name_arri) cfsetispeed(&g_newtio,speed_arri);/*設置輸入輸出波特率*/ cfsetospeed(&g_newtio,speed_arri); break; if(i>=sizeof(speed_arr) / sizeof(int) printf("Unsupported Speed!n"); return -1; switch (Parity) case 'n':case 'N': g_newtio.c_cflag &=

17、PARODD; g_newtio.c_cflag &= PARENB; break; case 'o': case 'O': g_newtio.c_cflag |= PARENB; g_newtio.c_cflag |= PARODD; /奇校驗 break; case 'e': case 'E': g_newtio.c_cflag |= PARENB; /偶校驗 g_newtio.c_cflag &= PARODD; break; default: printf("Unsupported Parityn

18、"); return -1; switch(Stopbit) /設置停止校驗位是為2,否為1.case 1:g_newtio.c_cflag &= 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; g_newtio.c_ccVTIME = 1; /最大等待時間為1*100m

19、s g_newtio.c_ccVMIN = 1; /最小讀數為1 g_newtio.c_iflag &= INPCK; g_newtio.c_cflag &= CRTSCTS; g_newtio.c_cflag &= CSIZE;/設置數據位g_newtio.c_cflag |= CS8; / g_newtio.c_cflag |= CLOCAL; g_newtio.c_cflag |= CREAD; if( tcsetattr(ret, TCSANOW, &g_newtio) != 0 )/激活設置printf("Set Com Parameter

20、Error!n");return -1;tcflush (ret, TCIOFLUSH); /刷新輸入輸出緩存return ret;/以上為套接字的相關定義/一下類似與client一樣設置數據接收和發送。void RestoreComConfiguration(int fd,struct termios *ptios)if( tcsetattr(fd, TCSANOW, ptios) != 0 )printf("Restore Com Parameter Error!n");int fd;char buf1024,buf21024;int servfd,clifd

21、;struct sockaddr_in servaddr,cliaddr;int runflag=0;void *Thread1(void *arg)printf("Please input your words to Server:-$ 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("stop!n");

22、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

23、;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);servaddr.sin_family=AF_INET;servaddr.sin_port=htons(SERVER_PORT);servaddr.sin_addr.s_addr=htons(INADDR_ANY);if(bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr)<0)printf("bind to port %d failure!n",SERVER_PORT);e

溫馨提示

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

最新文檔

評論

0/150

提交評論