Приветствую!
Покажите пожалуйста примерчик работы с ком-портом.
Необходимо постоянно слушать его, на конце стоит сканер штрихкодов, который при считывании, посылает код на ком-порт. Также необходима запись в ком-порт.
Я знаю, что такая же работа как с файлом. Ну покажите пример плиз.
>Приветствую!
>Покажите пожалуйста примерчик работы с ком-портом.
>Необходимо постоянно слушать его, на конце стоит сканер штрихкодов, который при считывании,
>посылает код на ком-порт. Также необходима запись в ком-порт.
>Я знаю, что такая же работа как с файлом. Ну покажите пример
>плиз.Файлы соответствующих устройств:
/dev/cuaa0
/dev/cuaa1Ну, а как на С с файлами работать, я думаю, узнать не тяжело
Используй для чтения:
select (man даст пример использования)
readпорт как правило /dev/ttyS0 и т.д.
Также нужно знать настройки параметров порта на сканере, хотя он должен программироваться на любый параметры.
>Приветствую!
>Покажите пожалуйста примерчик работы с ком-портом.
>Необходимо постоянно слушать его, на конце стоит сканер штрихкодов, который при считывании,
>посылает код на ком-порт. Также необходима запись в ком-порт.
>Я знаю, что такая же работа как с файлом. Ну покажите пример
>плиз.http://www.opennet.me/search.shtml
man 4 termios
man 2 open
man 2 read
man 2 write
Мужики, спасибо за отзывчивость, я не пойму как постоянно слушать ком порт, цикл нада бы, а какое условие?
>Мужики, спасибо за отзывчивость, я не пойму как постоянно слушать ком порт,
>цикл нада бы, а какое условие?open'ом получаешь дескриптор коммуникационного устройства, далее в цикле вызываешь select(). Соотвественно:
man 2 select
Вот собственно, работает с одним портом, но, хотелось бы работать одновременно с несколькими, а если быть точнее, то на одной машине у меня будет до 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
Если не ошибаюсь, уже три раза упомянули man 2 select. Это ключевой момент, ты его всё время упускаешь.Предположим, что тебе нужно N COM-портов (N < sizeof(fd_set) - 3).
...
fd_set io_ports;
fd_set tmp;
struct timeval tv;
int retval;
int ports[N];
int buffers[N][BARCODE_LEN];
int buffer_counters[N];FD_ZERO(&io_ports);
for (i=0; i< N; i++) {
fd = open_and_tune_COM_port(); // открыл и настроил, вернул fd или -1
ports[i] = fd;if (fd > 0) {
buffer_counters[i] = 0;
FD_SET(fd, &io_ports);
}
}memcpy(&tmp, &io_ports, sizeof(fs_set));
tv.tv_sec = TIME_OUT;
tv.tv_usec = 0;while (STOP==FALSE) {
retval=select(1,&io_ports, NULL, NULL, &tv));
if (retval == -1) perror("select()");
else if (retval) {
for (i=0; i< N; i++) {
if (ports[i] > 0 && FD_ISSET(ports[i], &io_ports)) {
/* пришёл очередной байт в порт i. Положи в буфер. Обработай
если пришло уже 15 */
}
}
} else puts("Я не умер, просто ничего нету\n");memcpy(&tmp, &io_ports, sizeof(fs_set));
tv.tv_sec = 1;
tv.tv_usec = 0;...
}