Russian Qt Forum
Ноябрь 25, 2024, 02:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 ... 4 5 [6]   Вниз
  Печать  
Автор Тема: ComPort+Монетоприемник  (Прочитано 53874 раз)
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #75 : Ноябрь 27, 2007, 03:14 »

Это по ходу должен быть рабочий исходник на ивент:

Код:
#include 
#include
#include
#include
#include
#include

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX-совместимый код */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

void signal_handler_IO (int status);   /* объявление обработчика сигнала */
int wait_flag=TRUE;                    /* TRUE до получения сигнала */

main()
{
  int fd,c, res;
  struct termios oldtio,newtio;
  struct sigaction saio;           /* объявление структуры под сигнал */
  char buf[255];

  /* открываем устройство для неблокирущего чтения (немедленный возврат из read) */
  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
  if (fd <0) {perror(MODEMDEVICE); exit(-1); }

  /* устанавливаем обработчик сигнала перед переводом
     устройства в асинхронный режим */
  saio.sa_handler = signal_handler_IO;

  /* в моем случае эту строку пришлось закомментировать - прим. перев.) */
  saio.sa_mask = 0;

  saio.sa_flags = 0;
  saio.sa_restorer = NULL;
  sigaction(SIGIO,&saio,NULL);

  /* позволяем процессу получать SIGIO */
  fcntl(fd, F_SETOWN, getpid());

  /* делаем файловый дескриптор асинхронным (в мануале говорится, что
     только O_APPEND и O_NONBLOCK будут работать с F_SETFL...) */
  fcntl(fd, F_SETFL, FASYNC);

  tcgetattr(fd,&oldtio); /* сохраняем текущие настройки порта */

  /* выставляем новые настройки порта для работы в каноническом режиме */
  newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
  newtio.c_iflag = IGNPAR | ICRNL;
  newtio.c_oflag = 0;
  newtio.c_lflag = ICANON;
  newtio.c_cc[VMIN]=1;
  newtio.c_cc[VTIME]=0;
  tcflush(fd, TCIFLUSH);
  tcsetattr(fd,TCSANOW,&newtio);

  /* зацикливаемся в процессе ожидания ввода, также можно делать здесь
     что-нибудь полезное */
  while (STOP==FALSE) {
    printf(".\n");
    usleep(100000);
    /* после получения SIGIO wait_flag = FALSE, данные доступны и их
       можно прочитать */
    if (wait_flag==FALSE) {
      res = read(fd,buf,255);
      buf[res]=0;
      printf(":%s:%d\n", buf, res);
      if (res==1) STOP=TRUE; /* выходим из цикла если получен только CR */
      wait_flag = TRUE;      /* ожидаем новых данных */
    }
  }
  /* восстанавливаем исходные настройки порта */
  tcsetattr(fd,TCSANOW,&oldtio);
}

/***************************************************************************
* обработчик сигнала, устанавливает wait_flag в FALSE чтобы информировать  *
* вышеприведенный цикл о получении символов                                *
***************************************************************************/

void signal_handler_IO (int status)
{
  printf("получен сигнал SIGIO.\n");
  wait_flag = FALSE;
}

но сдесь нет ни одного указаного #include ...
что там должно быть ?
Записан
der
Гость
« Ответ #76 : Ноябрь 27, 2007, 06:33 »

Это интересно.. но я в асемблере не очень.. как это использовать ?  можно, кусок кода в пример?

Ассемблер тут ни при чём - я же сказал, два системных вызова: inb и outb.
Вот здесь есть пример подачи на порт прямоулольных импульсов: http://rt.wiki.kernel.org/index.php/Squarewave-example
Код включает переключение планировщика и приоритеты - это нужно выкинуть.
Соответственно, при помощи оставшегося кода и данной мной ссылки несложно сочинить что-нибудь своё с участием COM или LPT за недельку неупорного труда.

Как в сдесь разобратся ? Обясните пожалуйста как оно работает.

Прочитайте статью, на которую я давал ссылку ранее. Там содержится описание портов(не путать с com-портом), через которые можно работать с COM/LPT. Если работать так, не нужно ничего открывать или настраивать.
Вам нужно только отдельным потоком в цикле читать(вызов inb) содержимое порта 3FEh, в котором написано, что, допустим, линия DSR изменила состояние и сейчас высокая. Этим Ваша работа с COM и ограничивается, т.е. одной строчкой + строчками анализа. Если Ваш цикл имеет достаточно хорошую частоту, то Вы сможете опрашивать порт, скажем, раз в 15 мсек и делать выводы, что длительность импульса была не менее 30 мсек.
Код:
unsigned char state;
while(1){
   state = inb(0x3FE);
   if(state & 1)
      printf("Linia DSR blya izmenilas\n");
}
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #77 : Ноябрь 27, 2007, 18:51 »

der, Большое спасибо, думаю этот код будет реально работать.

У меня в обрез мало времени, потому моя задачя временно решилась
образом припаивания 5вольтового светодиода к монетоприемнику,
и он при срабатывание замыкает правую кнопку мышы.
а ее ивент уже обработать просто.

Всем БОЛЬШОЕ Спасибо за обговаривание темы.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #78 : Декабрь 01, 2007, 14:51 »

от тут еще
http://www.ii-system.com/soft/devzone/devzone.htm

есть компонент

ну и про ком-девайсы кое-что есть
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #79 : Декабрь 01, 2007, 21:20 »

от тут еще
http://www.ii-system.com/soft/devzone/devzone.htm

есть компонент

ну и про ком-девайсы кое-что есть

Спасибо, это пригодится
Записан
Yesbody
Гость
« Ответ #80 : Март 06, 2008, 12:02 »

Это по ходу должен быть рабочий исходник на ивент:

Код:
#include 
#include
#include
#include
#include
#include

#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX-совместимый код */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

void signal_handler_IO (int status);   /* объявление обработчика сигнала */
int wait_flag=TRUE;                    /* TRUE до получения сигнала */

main()
{
  int fd,c, res;
  struct termios oldtio,newtio;
  struct sigaction saio;           /* объявление структуры под сигнал */
  char buf[255];

  /* открываем устройство для неблокирущего чтения (немедленный возврат из read) */
  fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
  if (fd <0) {perror(MODEMDEVICE); exit(-1); }

  /* устанавливаем обработчик сигнала перед переводом
     устройства в асинхронный режим */
  saio.sa_handler = signal_handler_IO;

  /* в моем случае эту строку пришлось закомментировать - прим. перев.) */
  saio.sa_mask = 0;

  saio.sa_flags = 0;
  saio.sa_restorer = NULL;
  sigaction(SIGIO,&saio,NULL);

  /* позволяем процессу получать SIGIO */
  fcntl(fd, F_SETOWN, getpid());

  /* делаем файловый дескриптор асинхронным (в мануале говорится, что
     только O_APPEND и O_NONBLOCK будут работать с F_SETFL...) */
  fcntl(fd, F_SETFL, FASYNC);

  tcgetattr(fd,&oldtio); /* сохраняем текущие настройки порта */

  /* выставляем новые настройки порта для работы в каноническом режиме */
  newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
  newtio.c_iflag = IGNPAR | ICRNL;
  newtio.c_oflag = 0;
  newtio.c_lflag = ICANON;
  newtio.c_cc[VMIN]=1;
  newtio.c_cc[VTIME]=0;
  tcflush(fd, TCIFLUSH);
  tcsetattr(fd,TCSANOW,&newtio);

  /* зацикливаемся в процессе ожидания ввода, также можно делать здесь
     что-нибудь полезное */
  while (STOP==FALSE) {
    printf(".\n");
    usleep(100000);
    /* после получения SIGIO wait_flag = FALSE, данные доступны и их
       можно прочитать */
    if (wait_flag==FALSE) {
      res = read(fd,buf,255);
      buf[res]=0;
      printf(":%s:%d\n", buf, res);
      if (res==1) STOP=TRUE; /* выходим из цикла если получен только CR */
      wait_flag = TRUE;      /* ожидаем новых данных */
    }
  }
  /* восстанавливаем исходные настройки порта */
  tcsetattr(fd,TCSANOW,&oldtio);
}

/***************************************************************************
* обработчик сигнала, устанавливает wait_flag в FALSE чтобы информировать  *
* вышеприведенный цикл о получении символов                                *
***************************************************************************/

void signal_handler_IO (int status)
{
  printf("получен сигнал SIGIO.\n");
  wait_flag = FALSE;
}

но сдесь нет ни одного указаного #include ...
что там должно быть ?

Все файлы в #include указаны в < и > - воспринимаются браузером как теги, поэтому имена файлов и не видно - надо смотреть исходный текст страницы, они там есть!
И не за чем их искать по просторам инета.

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>


#define BAUDRATE B38400

#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* POSIX-совместимый код */
#define FALSE 0
#define TRUE 1
« Последнее редактирование: Март 06, 2008, 12:07 от Yesbody » Записан
C.H.
Гость
« Ответ #81 : Март 07, 2008, 17:16 »

Монетоприемник на клавишу мышки - эт опросто суппер! Достено БАША Улыбающийся

а по теме добавлю от себя:
имел возможнотсь просношаться с таким девайсом.
И поймать сигнал ВКЛ, еще не значит что это кинули монету. т.к. это может быть помеха.
воизбежании помех девайс выдает сигнал о монете и держит его "некоторое" время.
в дкументации и на самом девайсе написанно какое время он его держит, даже есть переключатели.

так вот вам надо поймать сигнал и посчитаь какое время он был установлен, если совпадает с установленным, то
это МОНЕТА, иначе - ПОМЕХА
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #82 : Март 08, 2008, 20:23 »

Компорт использовать.. лажово. Мышка щелкает на ура без глюков.
Но скоро прийдется конектить купюроприемник в компорт. Кто пробовал ? Как юзать ?
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #83 : Март 08, 2008, 20:31 »

Yesbody, спасибо, я и не заметил..
Записан
Вячеслав
Гость
« Ответ #84 : Март 08, 2008, 20:37 »

Гы Подмигивающий Я-же тебе говорил - осваивай однокристалки - такие задачи решаються как два байта пререслать Подмигивающий
Записан
Страниц: 1 ... 4 5 [6]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.108 секунд. Запросов: 23.