代码的作用是通过串口测试工具向板子上的串口发送消息,串口上的client程序读取消息,并通过socket连接到服务器,发送出来。而
server程序通过client的链接,接受串口的信息,并显示出来。
代码如下:
server.c
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdlib.h>
#include <string.h>
#include<fcntl.h>
#include<termios.h>
#include<sys/time.h>
////////////////////////////////////////////////////////
int main(int argc,char **argv)
{
int dev_fd,nread,device_fd,nbytes;
int server_sockfd,client_sockfd;
int server_len,client_len;
char buff[512];
struct sockaddr_in server_address;
struct sockaddr_in client_address;
server_sockfd=socket(AF_INET,SOCK_STREAM,0);
if(-1==server_sockfd)
{
printf("socket
error");
return
-1;
}
bzero( & server_address, sizeof
(server_address));
server_address.sin_family=AF_INET;
server_address.sin_addr.s_addr=INADDR_ANY;
server_address.sin_port=8000;
server_len=sizeof(server_address);
//绑定
if(-1==(bind(server_sockfd,(struct
sockaddr*)&server_address,server_len)))
{
perror("bind
error:");
return
-1;
}
//监听
if(-1==(listen(server_sockfd,5)))
{
printf("linsten
error\n");
return
-1;
}
printf("server waiting for connect\n");
while(1)
{
client_len=sizeof(client_address);
client_sockfd=accept(server_sockfd,(struct
sockaddr*)&client_address,(socklen_t*)&client_len);
if(write(client_sockfd,buff,strlen(buff)+1)==-1)
{
exit(1);
}
while(1)
{
if((nbytes=read(client_sockfd,buff,512))==-1)
{
perror("read:");
return
-1;
}
buff[nbytes]='\0';
printf("\nI
have received:%s\n",buff);
}
}
close(server_sockfd);
close(client_sockfd);
return 0;
}
client.c
//client.c是交叉编译的
使用的交叉编译工具链是2.95.3/arm-linux-gcc
//目标板上运行 客户端程序 读板子串口信息并通过socket发送到主机
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<stdlib.h>
#include <string.h>
#include<fcntl.h>
#include<termios.h>
#include<sys/time.h>
#define FALSE -1
#define TRUE 0
int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400,
B1200, B300,
B38400,
B19200, B9600, B4800, B2400, B1200, B300,};
int name_arr[] = {115200,38400,
19200, 9600,
4800, 2400,
1200, 300, 38400,
19200,
9600, 4800, 2400, 1200, 300,};
/////////////////////////////////////////////////////////////////////////
//设置波特率
void set_speed(int fd, int speed)
{
int i;
int
status;
struct
termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i <
sizeof(speed_arr) / sizeof(int); i++) {
if (speed ==
name_arr[i])
{
tcflush(fd,
TCIOFLUSH);
cfsetispeed(&Opt,
speed_arr[i]);
cfsetospeed(&Opt,
speed_arr[i]);
status =
tcsetattr(fd, TCSANOW,
&Opt);
if(status !=
0)
{
perror("tcsetattr
f1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
}
//////////////////////////////////////////////////////////////////
//设置串口的 数据位,停止位 校验位
int Set_Parity(int fd,int databits,int stopbits,int
parity)
{
struct termios options;
if ( tcgetattr(
fd,&options) !=
0) {
perror("SetupSerial
1");
return(FALSE);
}
options.c_cflag &= ~CSIZE;
switch (databits)
{
case 7:
options.c_cflag |= CS7;
break;
case
8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported
data size\n"); return (FALSE);
}
switch (parity)
{
case 'n':
case
'N':
options.c_cflag
&=
~PARENB;
options.c_iflag
&=
~INPCK;
break;
case
'o':
case
'O':
options.c_cflag |= (PARODD |
PARENB);
options.c_iflag |=
INPCK;
break;
case 'e':
case
'E':
options.c_cflag |=
PARENB;
options.c_cflag
&= ~PARODD;
options.c_iflag |=
INPCK;
break;
case 'S':
case 's':
options.c_cflag &= ~PARENB;
options.c_cflag
&= ~CSTOPB;break;
default:
fprintf(stderr,"Unsupported
parity\n");
return
(FALSE);
}
switch (stopbits)
{
case
1:
options.c_cflag
&= ~CSTOPB;
break;
case
2:
options.c_cflag |=
CSTOPB;
break;
default:
fprintf(stderr,"Unsupported
stop bits\n");
return (FALSE);
}
if (parity != 'n')
options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150;
options.c_cc[VMIN] = 0;
if (tcsetattr(fd,TCSANOW,&options) !=
0)
{
perror("SetupSerial
3");
return (FALSE);
}
return (TRUE);
}
//////////////////////////////////////////////////////////////
//主程序
int main(int argc,char *argv[])
{
int client_sockfd;
int len,nread;
int dev_fd;
struct sockaddr_in client_address;
int result;
int i,byte;
int nbytes;
char buff[1024];
char *dev="/dev/ttyS2";
dev_fd=open(dev,O_RDWR | O_NOCTTY);// 打开文件
进行读写
if(-1==dev_fd)
{
perror("open error:");
return -1;
}
set_speed(dev_fd,115200);//设置波特率为115200
if (Set_Parity(dev_fd,8,1,'N') ==
FALSE)
{
printf("Set Parity
Error\n");
exit (0);
}
if(-1==(client_sockfd=socket(AF_INET,SOCK_STREAM,0)))
{
perror("socket error:");
return -1;
}
client_address.sin_family=AF_INET;
client_address.sin_addr.s_addr=inet_addr("192.168.0.5");
client_address.sin_port=8000;
len=sizeof(client_address);
if(-1==(result=connect(client_sockfd,(struct
sockaddr*)&client_address,len)))
{
perror("connect error:");
return -1;
}
while(1)
{
// while((nread=read(dev_fd,buff,10))>0)
nread=read(dev_fd,buff,10);
buff[nread]='\0';
printf("\n%s",buff);
printf("\n%d\n",nread);
if(write(client_sockfd,buff,strlen(buff)+1)==-1)
{
exit(1);
}
}
close(dev_fd);
close(client_sockfd);
exit(0);
}
加载中,请稍候......