加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

socket实现串口通信

(2010-08-27 13:06:27)
标签:

it

c

杂谈

分类: 嵌入式学习

代码的作用是通过串口测试工具向板子上的串口发送消息,串口上的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);
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有