先上代碼吧:
/*-------------------------------------------------------------- 日期:2012/1/1 功能:串口接收轉發到網絡 --------------------------------------------------------------*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "rs232.h" #include <errno.h> #include <sys/wait.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <unistd.h> #include <signal.h> #define PORT 3000 //#define PACKET_SIZE 8192 #define PACKET_SIZE 6 static int count=0; static unsigned int second; static unsigned int sum; void display() { printf("\n"); printf("Transfer complete !\n"); printf("Total size:%d !\n",sum); printf("Speed:%d Mbps\n",8*sum/second/0x100000); exit(0); } /*----------------------------------------- client 192.168.2.111 –t 1 –p 1 argv[0] = client argv[1] = 172.16.22.155 argv[2] = –t argv[3] = 1 argv[4] = -p argv[5] = 1 ------------------------------------------*/ void Tcp() { int argc_data; char *argv_data[6]; int sockfd; int recv_bytes; //unsigned int buf[PACKET_SIZE]; unsigned int *Tcp_buf; struct hostent *he; struct sockaddr_in srvaddr; unsigned int uiip; unsigned int nsecond,packet_size; sum=0; argc_data = 6; argv_data[0] = "client"; argv_data[1] = "172.16.22.155"; argv_data[2] = "-t"; argv_data[3] = "1"; argv_data[4] = "-p"; argv_data[5] = "1"; if(argc_data< 4 ){ perror("Usage: client <hostIP> -t time -p PACKET_SIZE\n"); exit(2); } packet_size=PACKET_SIZE; second=atoi(argv_data[3]); if(argc_data==6) packet_size=atoi(argv_data[5]); printf("packet_size=%d\n",packet_size); Tcp_buf = malloc(packet_size); he=gethostbyname(argv_data[1]); sockfd=socket(AF_INET,SOCK_STREAM,0); bzero(&srvaddr,sizeof(srvaddr)); srvaddr.sin_family=AF_INET; srvaddr.sin_port=htons(PORT); srvaddr.sin_addr=*((struct in_addr *)he->h_addr); //aiptoi(argv[1],&uiip); //srvaddr.sin_addr.s_addr=uiip; if(connect(sockfd, (struct sockaddr *) &srvaddr, sizeof(struct sockaddr))== -1){ perror("Connect error!\n"); exit(1); } // nsecond = htonl(second); nsecond = 0x01020304; if(write(sockfd,&nsecond,sizeof(nsecond))== -1){ perror("Error when send second!\n"); exit(1); } printf("Data Transfering!\n"); /* while (1){ if((recv_bytes=read(sockfd,buf,packet_size))<=0){ printf("Connection closed!\n"); break; } sum+=recv_bytes; } */ while(1) { write(sockfd, &nsecond, sizeof(nsecond)); sleep(5); } close(sockfd); free(Tcp_buf); display(); //return 0; } main(int argc, char *argv[]) { int ret,portno,nWritten,nRead; char buf[5] = "hell"; /*網口實現部分*/ int argc_data; char *argv_data[6]; int sockfd; int recv_bytes; //unsigned int buf[PACKET_SIZE]; unsigned int *Tcp_buf; struct hostent *he; struct sockaddr_in srvaddr; unsigned int uiip; unsigned int nsecond,packet_size; sum=0; argc_data = 6; argv_data[0] = "client"; argv_data[1] = "172.16.22.155"; argv_data[2] = "-t"; argv_data[3] = "1"; argv_data[4] = "-p"; argv_data[5] = "1"; portno=0; if(argc_data< 4 ){ perror("Usage: client <hostIP> -t time -p PACKET_SIZE\n"); exit(2); } packet_size=PACKET_SIZE; second=atoi(argv_data[3]); if(argc_data==6) packet_size=atoi(argv_data[5]); printf("packet_size=%d\n",packet_size); Tcp_buf = malloc(packet_size); he=gethostbyname(argv_data[1]); sockfd=socket(AF_INET,SOCK_STREAM,0); bzero(&srvaddr,sizeof(srvaddr)); srvaddr.sin_family=AF_INET; srvaddr.sin_port=htons(PORT); srvaddr.sin_addr=*((struct in_addr *)he->h_addr); //aiptoi(argv[1],&uiip); //srvaddr.sin_addr.s_addr=uiip; if(connect(sockfd, (struct sockaddr *) &srvaddr, sizeof(struct sockaddr))== -1){ perror("Connect error!\n"); exit(1); } // nsecond = htonl(second); /* nsecond = 0x01020304; if(write(sockfd,&nsecond,sizeof(nsecond))== -1){ perror("Error when send second!\n"); exit(1); } printf("Data Transfering!\n"); */ /* while (1){ if((recv_bytes=read(sockfd,buf,packet_size))<=0){ printf("Connection closed!\n"); break; } sum+=recv_bytes; } */ /*while(1) { write(sockfd, &nsecond, sizeof(nsecond)); sleep(5); } close(sockfd); free(Tcp_buf); display(); */ //return 0; /*--------------------------------------------------------------------*/ while(1) { ret=OpenCom(portno,"/dev/ttyS1",115200); if(ret==-1) { perror("The /dev/ttyS1 open error."); exit(1); } /* while(1) { nWritten=ComWrt(portno,"abc",3); } */ printf("\n/dev/ttyS1 has send %d chars!\n",nWritten); printf("\nRecieving data!***\n"); fflush(stdout); //buf[5] = "hell"; while(1) { /*nRead=ComRd(0,buf,256,3000); if(nRead>0) { printf("*****OK\n"); nWritten = ComWrt(portno, buf, sizeof(buf)); }*/ printf("******start***********\n"); printf("*****ComRd*****\n"); //ComRd(0, buf, 256, 3000); nRead = ComRd(0, buf, 256, 3000); if(nRead > 0) { printf("The Rddata is: %s\n",buf); /*---串口部分-----*/ ComWrt(portno, buf, sizeof(buf)); printf("The ComWrt data is: %s\n",buf); /*網口部分*/ //nsecond = 0x01020304; if(write(sockfd,buf,sizeof(buf))== -1) { perror("Error when send second!\n"); exit(1); } //printf("Data Transfering!\n"); write(sockfd, buf, sizeof(buf)); printf("send to sockfd :%s\n",buf); sleep(1); printf("*****************end*****************\n"); } /* else printf("Timeout\n"); */ } if((ret=CloseCom(portno)==-1)) { perror("Close com"); exit(1); } printf("\n\n"); } printf("Exit now.\n"); /*網口部分*/ close(sockfd); //free(Tcp_buf); display(); /*----------------------------------*/ return; }
上面就是全部的主程序代碼了
還有一個是RS232串口部分的代碼:
/* ** File: rs232.c ** ** Description: ** Provides an RS-232 interface that is very similar to the CVI provided ** interface library */ #include <stdio.h> #include <assert.h> #include "rs232.h" #include <sys/time.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <termios.h> #define DEBUG struct PortInfo ports[MAX_PORTS]; /* ** Function: OpenCom ** ** Description: ** Opens a serial port with default parameters ** ** Arguments: ** portNo - handle used for further access ** deviceName - the name of the device to open ** ** Returns: ** -1 on failure */ int OpenCom(int portNo, const char deviceName[],long baudRate) { return OpenComConfig(portNo, deviceName, baudRate, 1, 8, 1, 0, 0); } /* */ long GetBaudRate(long baudRate) { long BaudR; switch(baudRate) { case 115200: BaudR=B115200; break; case 57600: BaudR=B57600; break; case 19200: BaudR=B19200; break; case 9600: BaudR=B9600; break; default: BaudR=B0; } return BaudR; } /* ** Function: OpenComConfig ** ** Description: ** Opens a serial port with the specified parameters ** ** Arguments: ** portNo - handle used for further access ** deviceName - the name of the device to open ** baudRate - rate to open (57600 for example) ** parity - 0 for no parity ** dataBits - 7 or 8 ** stopBits - 1 or 2 ** iqSize - ignored ** oqSize - ignored ** ** Returns: ** -1 on failure ** ** Limitations: ** parity, stopBits, iqSize, and oqSize are ignored */ int OpenComConfig(int port, const char deviceName[], long baudRate, int parity, int dataBits, int stopBits, int iqSize, int oqSize) { struct termios newtio; long BaudR; ports[port].busy = 1; strcpy(ports[port].name,deviceName); if ((ports[port].handle = open(deviceName, O_RDWR, 0666)) == -1) { perror("open"); // assert(0); } /* set the port to raw I/O */ newtio.c_cflag = CS8 | CLOCAL | CREAD ; newtio.c_iflag = IGNPAR; // newtio.c_oflag = 0; // newtio.c_lflag = 0; newtio.c_oflag = ~OPOST; newtio.c_lflag = ~(ICANON | ECHO | ECHOE | ISIG); newtio.c_cc[VINTR] = 0; newtio.c_cc[VQUIT] = 0; newtio.c_cc[VERASE] = 0; newtio.c_cc[VKILL] = 0; newtio.c_cc[VEOF] = 4; newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 1; newtio.c_cc[VSWTC] = 0; newtio.c_cc[VSTART] = 0; newtio.c_cc[VSTOP] = 0; newtio.c_cc[VSUSP] = 0; newtio.c_cc[VEOL] = 0; newtio.c_cc[VREPRINT] = 0; newtio.c_cc[VDISCARD] = 0; newtio.c_cc[VWERASE] = 0; newtio.c_cc[VLNEXT] = 0; newtio.c_cc[VEOL2] = 0; cfsetospeed(&newtio, GetBaudRate(baudRate)); cfsetispeed(&newtio, GetBaudRate(baudRate)); tcsetattr(ports[port].handle, TCSANOW, &newtio); return 0; } /* ** Function: CloseCom ** ** Description: ** Closes a previously opened port ** ** Arguments: ** The port handle to close ** ** Returns: ** -1 on failure */ int CloseCom(int portNo) { if (ports[portNo].busy) { close(ports[portNo].handle); ports[portNo].busy = 0; return 0; } else { return -1; } } /* ** Function: ComRd ** ** Description: ** Reads the specified number of bytes from the port. ** Returns when these bytes have been read, or timeout occurs. ** ** Arguments: ** portNo - the handle ** buf - where to store the data ** maxCnt - the maximum number of bytes to read ** ** Returns: ** The actual number of bytes read */ int ComRd(int portNo, char buf[], int maxCnt,int Timeout) { int actualRead = 0; fd_set rfds; struct timeval tv; int retval; if (!ports[portNo].busy) { assert(0); } /* camp on the port until data appears or 5 seconds have passed */ FD_ZERO(&rfds); FD_SET(ports[portNo].handle, &rfds); tv.tv_sec = Timeout/1000; tv.tv_usec = (Timeout%1000)*1000; retval = select(16, &rfds, NULL, NULL, &tv); if (retval) { actualRead = read(ports[portNo].handle, buf, maxCnt); } #ifdef DEBUG if(actualRead>0) { unsigned int i; for (i = 0; i < actualRead; ++i) { if ((buf[i] > 0x20) && (buf[i] < 0x7f)) { // printf("<'%c'", buf[i]); printf("%c",buf[i]); } else { // printf("<%02X", buf[i]); printf("%02X",buf[i]); } } printf("\n"); } fflush(stdout); #endif /* DEBUG */ return actualRead; } /* ** Function: ComWrt ** ** Description: ** Writes out the specified bytes to the port ** ** Arguments: ** portNo - the handle of the port ** buf - the bytes to write ** maxCnt - how many to write ** ** Returns: ** The actual number of bytes written */ int ComWrt(int portNo, const char *buf, int maxCnt) { int written; if (!ports[portNo].busy) { assert(0); } #ifdef DEBUG { int i; for (i = 0; i < maxCnt; ++i) { if ((buf[i] > 0x20) && (buf[i] < 0x7f)) { // printf(">'%c'", buf[i]); printf("%c",buf[i]); } else { // printf(">%02X", buf[i]); printf("%02X",buf[i]); } } printf("\n"); } fflush(stdout); #endif /* DEBUG */ written = write(ports[portNo].handle, buf, maxCnt); return written; }
然后再看頭文件:
#ifndef _RS232_H_ #define _RS232_H_ /* the maximum number of ports we are willing to open */ #define MAX_PORTS 4 /*this array hold information about each port we have opened */ struct PortInfo{ int busy; char name[32]; int handle; }; int OpenCom(int portNo,const char deviceName[],long baudRate); int CloseCom(int portNo); int ComRd(int portNo,char buf[],int maxCnt,int Timeout); int ComWrt(int portNo,const char * buf,int maxCnt); //long GetBaudRate(long baudRate); //int OpenComConfig(int port, // const char deviceName[], // long baudRate, // int parity, // int dataBits, // int stopBits, // int iqSize, // int oqSize); #endif
再看效果圖: