The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Работа с ком портом"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Работа с ком портом" 
Сообщение от STEEL123 emailИскать по авторуВ закладки(ok) on 30-Окт-05, 21:42  (MSK)
Приветствую!
Покажите пожалуйста примерчик работы с ком-портом.
Необходимо постоянно слушать его, на конце стоит сканер штрихкодов, который при считывании, посылает код на ком-порт. Также необходима запись в ком-порт.
Я знаю, что такая же работа как с файлом. Ну покажите пример плиз.
  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

https://www.opennet.ru/search.shtml

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Работа с ком портом" 
Сообщение от STEEL123 emailИскать по авторуВ закладки(ok) on 31-Окт-05, 18:09  (MSK)
Мужики, спасибо за отзывчивость, я не пойму как постоянно слушать ком порт, цикл нада бы, а какое условие?


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Работа с ком портом" 
Сообщение от chip emailИскать по авторуВ закладки(ok) on 31-Окт-05, 18:48  (MSK)
>Мужики, спасибо за отзывчивость, я не пойму как постоянно слушать ком порт,
>цикл нада бы, а какое условие?

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Работа с ком портом" 
Сообщение от STEEL123 emailИскать по авторуВ закладки(ok) on 01-Ноя-05, 18:14  (MSK)
Вот собственно, работает с одним портом, но, хотелось бы работать одновременно с несколькими, а если быть точнее, то на одной машине у меня будет до 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


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Работа с ком портом" 
Сообщение от ACCA Искать по авторуВ закладки(ok) on 03-Ноя-05, 01:19  (MSK)
Если не ошибаюсь, уже три раза упомянули 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;

...
}

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру