- 论坛徽章:
- 0
|
[i=s] 本帖最后由 fantansy 于 2010-06-11 23:31 编辑 [/i]
程序具体思路是这样的:板子上有4个串口,1个调试串口+3个232串口。
我的具体想法是将3个串口中的数据读出来,然后通过网口发送到服务器端。板子是作为客户端的。
代码如下:
client端(板子上):
#define SER_ADDR "192.168.2.32"//定义服务器IP
#define MYPORT 3492
#define BUFSIZE 512
#define BUFSIZE1 1024
#define MAX_FD(fd1,fd2,fd3) fd1>=fd2?(fd1>=fd3?fd1:fd3):(fd2>=fd3?fd2:fd3)
void setTermios(struct termios * pNewtio, unsigned short uBaudRate)
{
bzero(pNewtio, sizeof(struct termios)); /* clear struct for new port settings */
//8N1
pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;
pNewtio->c_iflag = IGNPAR;
pNewtio->c_oflag = 0;
pNewtio->c_lflag = 0; //non ICANON
/*
initialize all control characters
default values can be found in /usr/include/termios.h, and
are given in the comments, but we don't need them here
*/
pNewtio->c_cc[VINTR] = 0; /* Ctrl-c */
pNewtio->c_cc[VQUIT] = 0; /* Ctrl-\ */
pNewtio->c_cc[VERASE] = 0; /* del */
pNewtio->c_cc[VKILL] = 0; /* @ */
pNewtio->c_cc[VEOF] = 4; /* Ctrl-d */
pNewtio->c_cc[VTIME] = 5; /* inter-character timer, timeout VTIME*0.1 */
pNewtio->c_cc[VMIN] = 0; /* blocking read until VMIN character arrives */
pNewtio->c_cc[VSWTC] = 0; /* '\0' */
pNewtio->c_cc[VSTART] = 0; /* Ctrl-q */
pNewtio->c_cc[VSTOP] = 0; /* Ctrl-s */
pNewtio->c_cc[VSUSP] = 0; /* Ctrl-z */
pNewtio->c_cc[VEOL] = 0; /* '\0' */
pNewtio->c_cc[VREPRINT] = 0; /* Ctrl-r */
pNewtio->c_cc[VDISCARD] = 0; /* Ctrl-u */
pNewtio->c_cc[VWERASE] = 0; /* Ctrl-w */
pNewtio->c_cc[VLNEXT] = 0; /* Ctrl-v */
pNewtio->c_cc[VEOL2] = 0; /* '\0' */
}
//以上为设置串口的函数。
int main(int argc ,char *argv[])
{
int fd1;
int fd2;
int fd3;
int client_socket;
struct sockaddr_in server_addr;
int nCount;
char buf1[BUFSIZE1];
char buf2[BUFSIZE];
char buf3[BUFSIZE];
struct termios oldtio,newtio;
struct timeval tv;
fd_set rfds,watchset;
if(fd1=open("/dev/ttyS1",O_RDWR | O_NOCTTY)<0){
perror("open");
exit(-1);
}
if(fd2=open("/dev/ttyS2",O_RDWR | O_NOCTTY)<0){
perror("open");
exit(-1);
}
if(fd3=open("/dev/ttyS3",O_RDWR | O_NOCTTY)<0){
perror("open");
exit(-1);
} //分别打开串口S1,S2,S3
tcgetattr(fd1,&oldtio);
setTermios(&newtio,B115200);//设置串口1的波特率
tcflush(fd1, TCIFLUSH);
tcsetattr(fd1,TCSANOW,&newtio);
tcgetattr(fd2,&oldtio);
setTermios(&newtio,B115200);
tcflush(fd2, TCIFLUSH);
tcsetattr(fd2,TCSANOW,&newtio);
tcgetattr(fd3,&oldtio);
setTermios(&newtio,B115200);
tcflush(fd3, TCIFLUSH);
tcsetattr(fd3,TCSANOW,&newtio);
FD_ZERO(&rfds);
FD_ZERO(&watchset);
FD_SET(fd1,&watchset);
FD_SET(fd2,&watchset);
FD_SET(fd3,&watchset);
client_socket = socket(AF_INET,SOCK_STREAM,0);//建立套接字。
if(client_socket < 0){
perror("socket");
exit(-1);
}
printf("socket success!!:%d\n",client_socket);
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MYPORT);
server_addr.sin_addr.s_addr = inet_addr(SER_ADDR);
if(connect(client_socket,(struct sockaddr*)&server_addr,sizeof(server_addr))<0){
perror("connect");
exit(-1);
}
while (1)
{
tv.tv_sec=20;
tv.tv_usec=0;
rfds = watchset;
if(select(MAX_FD(fd1,fd2,fd3)+1,&rfds,NULL,NULL,&tv)>0)
{
if(FD_ISSET(fd1,&rfds))
{
nCount=read(fd1, buf1, 512);
printf("readlength=%d\n\r",nCount);
buf1[nCount]='\0';
printf("%s\n\r",buf1);
}
if(FD_ISSET(fd2,&rfds))
{
nCount=read(fd2, buf2, 512);
printf("readlength=%d\n\r",nCount);
buf2[nCount]='\0';
printf("%s\n\r",buf2);
}
if(FD_ISSET(fd3,&rfds))
{
nCount=read(fd3, buf3, 512);
printf("readlength=%d\n\r",nCount);
printf("%s\n\r",buf3);
}
//}
strcpy(buf1,buf2);
strcpy(buf1,buf3);
}
if(!fork())
{
if(write(client_socket,buf1,BUFSIZE)<0){
perror("write");
exit(-1);
}
close(client_socket);
waitpid(-1,NULL,WNOHANG);
}
}
tcsetattr(fd1,TCSANOW,&oldtio);
tcsetattr(fd2,TCSANOW,&oldtio);
tcsetattr(fd3,TCSANOW,&oldtio);
return 0;
}
服务器端:server
#define MYPORT 3492
#define LOGFILE "/var/log/data_backup"
int main(int argc ,char *argv[])
{
int listen_socket , data_socket;
FILE *log_fp;
char *log_file = LOGFILE;
struct sockaddr_in server_addr;
char buf[BUFSIZE];
int buf_rd_len,buf_wr_len;
/*open log_file*/
if((log_fp = fopen(LOGFILE,"a+")) == NULL){ //以追加方式打开文件,目的是保存接收到的数据
perror("open ");
exit(-1);
}
if((listen_socket = socket(AF_INET,SOCK_STREAM,0))<0){
perror("socket");
exit(-1);
}
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(MYPORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
if((bind(listen_socket,(struct sockaddr *)&server_addr,sizeof(server_addr)))<0){
perror("bind");
exit(-1);
}
if(listen(listen_socket,5)<0){
perror("listen");
exit(-1);
}
while(1)
{
if((data_socket = accept(listen_socket,NULL,0))<0){
perror("accept");
exit(-1);
}
printf("server: got connection from %s ", inet_ntoa(server_addr.sin_addr));
if((buf_rd_len = read(data_socket,buf,BUFSIZE))<0){
perror("read");
continue;
}
if((buf_wr_len = fputs(buf,log_fp)) == EOF){
perror("fputs");
continue;
}
close(data_socket);
}
return(0);
}
但是程序执行后,无反应,好像进入死循环一样。本人菜鸟,还望高人指点! |
|