linux串口异步通信开发源代码

类别:编程语言 点击:0 评论:0 推荐:



//gcc -o querySerial querySerial.c


#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>

/* These are the hash definitions */
#define USERBAUD1200 '1'+'2'
#define USERBAUD2400 '2'+'4'
#define USERBAUD9600 '9'+'6'
#define USERBAUD1920 '1'+'9'
#define USERBAUD3840 '3'+'8'
#define DEV "/dev/ttyS0"
struct termios tio;

/* write the users command out the serial port */
int send_cmd(int ftty,char * str)
{
  int result;
  result = write(ftty,str,strlen(str));/*argv[4], strlen(argv[4]));*/
  if (result < 0)
  {
   
    printf("Write command:%s to VC312 failed\n",str);
    close(ftty);
    exit(1);
  }
}
int init_dev(struct termios *oldtio)
{
        int fd,status;
        unsigned char cmd[17];
        struct termios newtio;       
       
       
        //open carmo device
        fd = open(DEV, O_RDWR| O_NOCTTY|O_NDELAY);
        if (fd ==-1)
        {
                perror("open"DEV);
                return -1;
        }
        else    //set to block;
                fcntl(fd, F_SETFL, 0);

        printf("open carmo ok\n");

        tcgetattr(fd,oldtio); //save current serial port settings
      
        bzero(&newtio, sizeof(newtio)); // clear struct for new port settings
        //configure the serial port;
        cfsetispeed(&newtio,B115200);
        cfsetospeed(&newtio,B115200);
        newtio.c_cflag |=CLOCAL|CREAD;
        /*8N1*/
        newtio.c_cflag &= ~CSIZE; /* Mask the character size bits */
        newtio.c_cflag |= CS8;    /* Select 8 data bits */
        newtio.c_cflag &= ~PARENB;
        newtio.c_cflag &= ~CSTOPB;
        newtio.c_cflag &= ~CRTSCTS;//disable hardware flow control;
        newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*raw input*/
        newtio.c_oflag  &= ~OPOST;   /*raw output*/
        tcflush(fd,TCIFLUSH);//clear input buffer
        newtio.c_cc[VTIME] = 100; /* inter-character timer unused */
        newtio.c_cc[VMIN] = 0; /* blocking read until 0 character arrives */
        tcsetattr(fd,TCSANOW,&newtio);
/*
        ioctl(fd,TIOCMGET,&status);
        printf("the serial status is 0x%x\n",status);
        status |=TIOCM_RTS;
        ioctl(fd,TIOCMSET,&status);
        status=0;
        ioctl(fd,TIOCMGET,&status);
        printf("the serial status now is 0x%x\n",status);
*/
      
        return fd;
}
int read_frame(int ftty,int streamfd)
{
  int   n,max_fd,len,count=0;
  fd_set  input;
  struct  timeval timeout;
  char    buffer[640*500*3];
  char *  ptr = buffer;

  FD_ZERO(&input);
  FD_SET(ftty, &input);
  max_fd = ftty+1;
  /* Do the select */
while(1)
  {
   
  /* Initialize the timeout structure */
  timeout.tv_sec  = 1;
  timeout.tv_usec = 0; 
  n = select(max_fd,&input, NULL,NULL,&timeout);
  if (n<0)
    perror("select failed");
  else if (n == 0){
      puts("TIMEOUT");
      break;
      }
  else
    {     
      ioctl(ftty, FIONREAD, &len);
      if(!len){
 fprintf(stderr, "Communication closed by server\n");
 return -1;
      }

      len = read(ftty,ptr,len);   
      //ptr[len] = 0;  
      //printf("Readed %d data:%s\n",len,ptr);     
      write(streamfd,ptr,len);     
      ptr += len;
      count += len;            
    } 
   }
   buffer[count] = 0;
   printf("Readed %d data:%s\n",count,buffer);
   return 1;
 
}
int main(int argc, char *argv[])
{
  int fd,count;
  char buffer[255];
  char cmd[30];
  char filename[255];
  int socket;
  struct termios oldtio;
 // cmd[0]=0xff;cmd[1]=0xe1;cmd[2]=0x52;cmd[3]=0x52;cmd[4]=0x80;cmd[5]=0x80;cmd[6]=0;
 // if(send_cmd(fd,cmd)<1) exit(0); 
 // usleep(400*1000);
 
  fd = init_dev(&oldtio);
  if (fd<0) exit(-1);
  cmd[0]=0xff;cmd[1]=0xe1;cmd[2]=0x58;cmd[3]=0x58;cmd[4]=0x66;cmd[5]=0x66;cmd[6]=0;
  if(send_cmd(fd,cmd)<1) exit(0);
 
  sprintf(filename,"1.jpg");  //"/tmp/get%d.jpg",i);
  socket=open(filename,O_CREAT|O_RDWR);
  read_frame(fd,socket);               
  close(socket);
  tcsetattr(fd,TCSANOW,&oldtio);  
 
}

本文地址:http://com.8s8s.com/it/it22976.htm