URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4790
[ Назад ]

Исходное сообщение
"Работа с ком портом"

Отправлено STEEL123 , 30-Окт-05 21:42 
Приветствую!
Покажите пожалуйста примерчик работы с ком-портом.
Необходимо постоянно слушать его, на конце стоит сканер штрихкодов, который при считывании, посылает код на ком-порт. Также необходима запись в ком-порт.
Я знаю, что такая же работа как с файлом. Ну покажите пример плиз.

Содержание

Сообщения в этом обсуждении
"Работа с ком портом"
Отправлено sandy , 31-Окт-05 17:23 
>Приветствую!
>Покажите пожалуйста примерчик работы с ком-портом.
>Необходимо постоянно слушать его, на конце стоит сканер штрихкодов, который при считывании,
>посылает код на ком-порт. Также необходима запись в ком-порт.
>Я знаю, что такая же работа как с файлом. Ну покажите пример
>плиз.

Файлы соответствующих устройств:
/dev/cuaa0
/dev/cuaa1

Ну, а как на С с файлами работать, я думаю, узнать не тяжело


"Работа с ком портом"
Отправлено Hordi , 31-Окт-05 17:30 
Используй для чтения:
select (man даст пример использования)
read

порт как правило /dev/ttyS0 и т.д.

Также нужно знать настройки параметров порта на сканере, хотя он должен программироваться на любый параметры.


"Работа с ком портом"
Отправлено chip , 31-Окт-05 18:02 
>Приветствую!
>Покажите пожалуйста примерчик работы с ком-портом.
>Необходимо постоянно слушать его, на конце стоит сканер штрихкодов, который при считывании,
>посылает код на ком-порт. Также необходима запись в ком-порт.
>Я знаю, что такая же работа как с файлом. Ну покажите пример
>плиз.

http://www.opennet.me/search.shtml

man 4 termios
man 2 open
man 2 read
man 2 write


"Работа с ком портом"
Отправлено STEEL123 , 31-Окт-05 18:09 
Мужики, спасибо за отзывчивость, я не пойму как постоянно слушать ком порт, цикл нада бы, а какое условие?



"Работа с ком портом"
Отправлено chip , 31-Окт-05 18:48 
>Мужики, спасибо за отзывчивость, я не пойму как постоянно слушать ком порт,
>цикл нада бы, а какое условие?

open'ом получаешь дескриптор коммуникационного устройства, далее в цикле вызываешь select(). Соотвественно:
man 2 select


"Работа с ком портом"
Отправлено STEEL123 , 01-Ноя-05 18:14 
Вот собственно, работает с одним портом, но, хотелось бы работать одновременно с несколькими, а если быть точнее, то на одной машине у меня будет до 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



"Работа с ком портом"
Отправлено ACCA , 03-Ноя-05 01:19 
Если не ошибаюсь, уже три раза упомянули 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;

...
}