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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: программирование драйвера устройств...  (Прочитано 5242 раз)
zoro86
Гость
« : Март 04, 2010, 09:13 »

Есть готовый драйвер для купюраприемника реализованный на С для Linux,
необходимо реализовать такойж на Qt, вообщем у меня есть интерфейс на Qt уже готовый,
необходимо именно с этого интерфейса долбить на прямую COM порт устройства,
и посылать туда элементарные команды, такие как (перезапустить устройства, активировать и т. д.),
проста проблема в том что к тому же таких драеверов может быть несколько, поэтому надо как то реализовать их динамически, понятно что через .dll но вот не знаю с чего начать и как???
Записан
nn1317
Гость
« Ответ #1 : Март 04, 2010, 10:28 »

>необходимо реализовать такойж на Qt
тебе на винду надо? если да, то кути к драйверам имеет отношения 0. и вообще драйвера в вин и линуксе имеют общим только название- драйвер)

>необходимо именно с этого интерфейса долбить на прямую COM порт устройства
какого еще интерфейса?

перечитай свой вопрос и напиши понятным языком.
Записан
kkk777kkk
Гость
« Ответ #2 : Март 04, 2010, 10:46 »

если с устройством общаешься через com, то что делает драйвер? и что должен делать "второй" драйвер?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Март 04, 2010, 11:04 »

Цитировать
если с устройством общаешься через com, то что делает драйвер? и что должен делать "второй" драйвер?
Может используются какие-то "хитрые" и "нестандартные" режимы работы UART ? Хитрый протокол (типа LIN Bus)?  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
tim474
Гость
t-
« Ответ #4 : Март 04, 2010, 17:40 »

Что из себя представляет твой готовый драйвер? Раз купюроприёмник является serial-устройством, то это, скорее всего, не модуль ядра. И причём здесь Qt? Просто надо научить Qt-шную программу работать через этот драйвер, или же переписать этот драйвер на Qt, чтобы он без изменений в исходном коде работал на всех ОС, на которых есть Qt?
Так что, советую выложить драйвер (если он не под NDA) и более чётко описать поставленную задачу.
Записан
zoro86
Гость
« Ответ #5 : Март 05, 2010, 15:11 »

вот часть исходного кода на с:
void cc_open()
Код:
{
struct termios tio;


fd = open(device_name, O_RDWR | O_NOCTTY);
//if (!fd)
//{
// printf("ERROR: Could not open CashCode device.");
//}


bzero(&tio, sizeof(tio));
/*
tio.c_iflag     = IGNPAR;
tio.c_oflag     = 0;
tio.c_lflag     = 0;
tio.c_cflag     = CRTSCTS | CS8 | CLOCAL | CREAD;
tio.c_cc[VTIME] = 0;
tio.c_cc[VMIN]  = 0;
*/

tio.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);
//tio.c_iflag  = IGNPAR;

tio.c_oflag &= ~OPOST;
//tio.c_oflag  = 0;

tio.c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
//tio.c_lflag  = 0;

//tio.c_cflag &= ~(CSIZE|PARENB);
//tio.c_cflag |= CS8;
//tio.c_cflag  = CRTSCTS | CS8 | CLOCAL | CREAD;

tio.c_cflag  = CS8 | CLOCAL | CREAD;


cfsetospeed(&tio, B9600);
cfsetispeed(&tio, B9600);

tcflush(fd,  TCIFLUSH);
tcsetattr(fd, TCSANOW, &tio);
}

тут идет открытия устройства...

тут у меня есть документация для данного устройства, мне необходимо проста накатать некий класс с набором команд и функций, вот перезагрузка устройства:

Код:
void cc_reset()
{
int sleep_time = 20000;
                                                               
usleep(sleep_time);
write(fd, CC_CMD_RESET, sizeof(CC_CMD_RESET));               
usleep(sleep_time);
read(fd, control_bytes, 3);
read(fd, read_buffer, control_bytes[2]-3);                       

usleep(sleep_time);
write(fd, CC_CMD_ACK, sizeof(CC_CMD_ACK));                       

usleep(sleep_time);
write(fd, CC_CMD_POLL, sizeof(CC_CMD_POLL));                   
usleep(sleep_time);
read(fd, control_bytes, 3);
read(fd, read_buffer, control_bytes[2]-3);
if ((unsigned char)read_buffer[0]==19){
printf("OK");
}
                       

usleep(sleep_time);
write(fd, CC_CMD_ACK, sizeof(CC_CMD_ACK));                       

usleep(sleep_time);
write(fd, CC_CMD_GET_BILL_TABLE, sizeof(CC_CMD_GET_BILL_TABLE)); 
usleep(sleep_time);
read(fd, control_bytes, 3);
read(fd, read_buffer, control_bytes[2]-3);                       

usleep(sleep_time);
write(fd, CC_CMD_ACK, sizeof(CC_CMD_ACK));                       

usleep(sleep_time);
write(fd, CC_CMD_GET_BILL_TABLE, sizeof(CC_CMD_GET_BILL_TABLE)); 
usleep(sleep_time);
read(fd, control_bytes, 3);
read(fd, read_buffer, control_bytes[2]-3);                     

usleep(sleep_time);
write(fd, CC_CMD_ACK, sizeof(CC_CMD_ACK));                 

usleep(sleep_time);
write(fd, CC_CMD_SET_SECURITY, sizeof(CC_CMD_SET_SECURITY));     
usleep(sleep_time);
read(fd, control_bytes, 3);
read(fd, read_buffer, control_bytes[2]-3);             

  usleep(sleep_time);
write(fd, CC_CMD_IDENTIFICATION, sizeof(CC_CMD_IDENTIFICATION)); 
usleep(sleep_time);
read(fd, control_bytes, 3);
read(fd, read_buffer, control_bytes[2]-3);                       

usleep(sleep_time);
write(fd, CC_CMD_ACK, sizeof(CC_CMD_ACK));                   
}

раньше сам интерфейс программы был написан на РНР а драйвер соответственно на с, теперь интерфейс переписал на QT но вот не знаю как написать и какие библеотеки использовать для создания что та вроде... приведенного выше, ...
вот пример poling-a то есть даешь команду на прием денег и читаешь ответ..
Код:
int cc_poll()
{
int sleep_time = 20000;

usleep(sleep_time);
write(fd, CC_CMD_POLL, sizeof(CC_CMD_POLL));                 
usleep(sleep_time);
read(fd, control_bytes, 3);
read(fd, read_buffer, control_bytes[2]-3);                       

if ( (unsigned char)read_buffer[0] == 0x81 )
{
switch ((unsigned char)read_buffer[1])
{
case 0x02: if (LOG_MODE) { save_log("10 rub.");   } return 10;   break;
case 0x03: if (LOG_MODE) { save_log("50 rub.");   } return 50;   break;
case 0x04: if (LOG_MODE) { save_log("100 rub.");  } return 100;  break;
case 0x05: if (LOG_MODE) { save_log("500 rub.");  } return 500;  break;
case 0x06: if (LOG_MODE) { save_log("1000 rub."); } return 1000; break;
case 0x07: if (LOG_MODE) { save_log("5000 rub."); } return 5000; break;
}
}
// Ошибка! Вернул купюру обратно.
if ( (unsigned char)read_buffer[0] == 0x1C )
{
return 1;
}
usleep(sleep_time);
write(fd, CC_CMD_ACK, sizeof(CC_CMD_ACK));                       
return 0;
}

такя вот задачка...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Март 05, 2010, 16:08 »

1. Это не драйвер а протокол обмена
2. Ничего сложного
3. Реализовано ужасно, особенно порадовали usleep Улыбающийся
4. Для Qt4 есть пока что две библиотеки (ИМХО) с помощью которых можно обращаться к последовательным портам : QSerialDevice или QextSerialPort.

ИТОГ:
1. берете какую нить из этих библиотек
2. сами создаете класс типа BillAcceptor (как вариант):
Код:
class BillAcceptor : public QObject
{
public:
....
    bool reset();
    int polling();
....
....

private:
....
}
и т.п. и реализуете все необходимые вам методы, применив готовую библиотеку для работы с портами.
« Последнее редактирование: Март 05, 2010, 16:12 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
ритт
Гость
« Ответ #7 : Март 06, 2010, 02:04 »

[off]
я поражаюсь - человек берёт заказ, не имея даже представления о том, чем драйвер отличается от протокола; затем не утруждает себя даже гуглением на тему, а сразу просит рассказать как это надо сделать - да ещё и чтобы было красиво и динамично...красиво "долбить на прямую COM порт"
[/off]
pft
Записан
zoro86
Гость
« Ответ #8 : Март 09, 2010, 06:34 »

Спасибо kuzulis очень ценная инфа для меня,... проста как новичек я начал с GUI а по апаратной части многово не знаю...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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