//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);
}