Вот собственно, работает с одним портом, но, хотелось бы работать одновременно с несколькими, а если быть точнее, то на одной машине у меня будет до 15-20 ком-портов.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B9600
#define SCANNER "/dev/cuaa0" /* FreeBSD */
/* #define SCANNER "/dev/ttyS0" */
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
#define BARCODE_LEN 15
#define TIME_OUT 0
volatile int STOP=FALSE;
main()
{
int fd, fc,c, res;
struct termios oldtio,newtio;
char buf[BARCODE_LEN];
fd = open(SCANNER, O_RDWR | O_NOCTTY );
if (fd <0) {perror(SCANNER); exit(-1); }
tcgetattr(fd,&oldtio); /* save current port settings */
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
/* set input mode */
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = TIME_OUT; /* timeout */
newtio.c_cc[VMIN] = BARCODE_LEN; /* blocking read until 15 chars received */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
for(;;) { /* loop for input */
res = read(fd,buf,BARCODE_LEN); /* returns after 15 chars have been input */
buf[res]=0; /* so we can printf... */
printf("%s", buf);
}
tcsetattr(fd,TCSANOW,&oldtio);
}
Теперь, как реализовать работу с несколькими портами? В одном цикле опрашивать по очереди? Либо же запускать сразу несколько циклов? Как второе реализуется, пока не знаю, вот что пытаюсь реализовать, дык не совсем успешно,
<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>
#define BAUDRATE B9600
#define SCANNER "/dev/cuaa0" /* FreeBSD */
/* #define SCANNER "/dev/ttyS0" */
#define _POSIX_SOURCE 1 /* POSIX compliant source */
#define FALSE 0
#define TRUE 1
#define BARCODE_LEN 15
#define TIME_OUT 0
volatile int STOP=FALSE;
main()
{
int fd, fc,c, res;
int com_2, com_2_res;
struct termios oldtio,newtio;
char buf[BARCODE_LEN];
char buf1[BARCODE_LEN];
fd = open(SCANNER, O_RDWR | O_NOCTTY );
com_2 = open("/dev/cuaa1", O_RDWR | O_NOCTTY );
if (fd <0) {perror(SCANNER); exit(-1); }
tcgetattr(fd,&oldtio); /* save current port settings */
tcgetattr(com_2,&oldtio); /* save current port settings */
bzero(&newtio, sizeof(newtio));
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
/* set input mode (non-canonical, no echo,...) */
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = TIME_OUT; /* timeout */
newtio.c_cc[VMIN] = BARCODE_LEN; /* blocking read until 15 chars received */
tcflush(fd, TCIFLUSH);
tcflush(com_2, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
tcsetattr(com_2,TCSANOW,&newtio);
while (STOP==FALSE) { /* loop for input */
res = read(fd,buf,BARCODE_LEN); /* returns after 15 chars have been input */
buf[res]=0; /* so we can printf... */
printf("%s", buf);
com_2_res = read(com_2,buf1,BARCODE_LEN); /* returns after 15 chars have been input */
printf("%s", buf1);
if (buf[0]=='z') STOP=TRUE;
}
tcsetattr(fd,TCSANOW,&oldtio);
tcsetattr(com_2,TCSANOW,&oldtio);
}
Работает не так как нада. Со второго порта сразу получить инфу не могу хоть и таймаут стоит 0.1мс, слушается первый ком, как только получаю строку, сразу же перестаёт слушаться и начинает слушаться второй порт.. который выводит мне первую строку+ту что сканирую сейчас..
Вообщем полная каша, может кто поставит на верный путь7