Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Автоматика и аппаратура связи Дистанционное и непосредственное управление исполнительными механизмами, сотовая, а также радиосвязь.

 
Опции темы
Непрочитано 13.02.2010, 01:19  
MEFF2005
Частый гость
 
Регистрация: 23.01.2009
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
MEFF2005 на пути к лучшему
По умолчанию Общение компьютера с черным ящиком по COM-порту

Люди добрые, помогите!

Есть некое устройство и программа, которая общается с ним. Исходников и документации нет.
Общается по COM-порту - 3 провода (GND, RX, TX).
Хочется написать свою альтернативную программку. Сниффинг обмена вроде бы прояснил ситуацию, протокол вроде бы понятен, но с общением есть проблемы =(

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

Вот пример лога общения родной программы (использовал Eltima Serial Port Monitor 4, но пробовал и другие):

Код:
[12/02/2010 17:19:21] 9245  IRP_MJ_CREATE - Opens a COM port (COM1)
[12/02/2010 17:19:21] 9247  IOCTL_SERIAL_SET_QUEUE_SIZE
            InSize - 1024
            OutSize - 300
[12/02/2010 17:19:21] 9249  IOCTL_SERIAL_GET_BAUD_RATE
            BaudRate - 9600
[12/02/2010 17:19:21] 9251  IOCTL_SERIAL_GET_LINE_CONTROL
            StopBits - 0
            Parity - 0
            WordLength - 8
[12/02/2010 17:19:21] 9253  IOCTL_SERIAL_GET_CHARS
            EofChar - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar - 17
            XoffChar - 19
[12/02/2010 17:19:21] 9255  IOCTL_SERIAL_GET_HANDFLOW
            ControlHandShake - 0x1 (SERIAL_DTR_CONTROL)
            FlowReplace - 0x40 (SERIAL_RTS_CONTROL)
            XonLimit - 2048
            XoffLimit - 512

Зачем-то еще раз GET_BAUDRATE, GET_LINE_CONTROL, GET_CHARS, GET_HANDFLOW

[12/02/2010 17:19:21] 9265  IOCTL_SERIAL_SET_BAUD_RATE
            BaudRate - 9600
[12/02/2010 17:19:21] 9267  IOCTL_SERIAL_SET_RTS
[12/02/2010 17:19:21] 9269  IOCTL_SERIAL_SET_DTR
[12/02/2010 17:19:21] 9271  IOCTL_SERIAL_SET_LINE_CONTROL
            StopBits - 0
            Parity - 0
            WordLength - 8
[12/02/2010 17:19:21] 9273  IOCTL_SERIAL_SET_CHARS
            EofChar - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar - 17
            XoffChar - 19
[12/02/2010 17:19:21] 9275  IOCTL_SERIAL_SET_HANDFLOW
            ControlHandShake - 0x1 (SERIAL_DTR_CONTROL)
            FlowReplace - 0x40 (SERIAL_RTS_CONTROL)
            XonLimit - 2048
            XoffLimit - 512

Несколько десятков вот таких команд:

[12/02/2010 17:19:21] 9277  IOCTL_SERIAL_GET_COMMSTATUS
            Errors - 0
            HoldReasons - 0
            AmountInInQueue - 0
            AmountInOutQueue - 0
            EofReceived - 0
            WaitForImmediate - 0

Запрос программы железке:

[12/02/2010 17:19:23] 9347  IOCTL_SERIAL_SET_BREAK_ON - Sets the line control break signal active
[12/02/2010 17:19:23] 9349  IOCTL_SERIAL_SET_BREAK_OFF - Request sets the line control break signal inactive

[12/02/2010 17:19:23] 9351  IRP_MJ_WRITE
      00 ff ff 01 f0 a6 10 47                             .??.?│.G

Вот тут непонятно, почему Errors = 1 - глюк программы-сниффера?

[12/02/2010 17:19:23] 9353  IOCTL_SERIAL_GET_COMMSTATUS
            Errors - 1
            HoldReasons - 0
            AmountInInQueue - 0
            AmountInOutQueue - 0
            EofReceived - 0
            WaitForImmediate - 0
[12/02/2010 17:19:23] 9355  IOCTL_SERIAL_GET_COMMSTATUS
            Errors - 0
            HoldReasons - 0
            AmountInInQueue - 25
            AmountInOutQueue - 0
            EofReceived - 0
            WaitForImmediate - 0

Ну и сам ответ железки:

[12/02/2010 17:19:23] 9357  IRP_MJ_READ
      00 00 00 00 01 f0 a6 10 29 99 04 50 00 00 00 00     .....?│.)T.P....
      00 00 00 00 00 00 00 00 a3 99 04 50 00 00 00 00     ........?T.P....


Дальше пара IOCTL_SERIAL_GET_COMMSTATUS
IOCTL_SERIAL_SET_BREAK_ON
IOCTL_SERIAL_SET_BREAK_OFF
IRP_MJ_WRITE     00 ff ff 01 03 00 04 06    - запрос железке
IOCTL_SERIAL_GET_COMMSTATUS
IRP_MJ_READ  - ответ железки

ну и т.д.
В winapi я не силен, попробовал накропать небольшую программенку, на основе каких-то примеров.

Код:
#include ‹windows.h›
#include ‹stdio.h›

HANDLE hCom;


char *pcCommPort = "COM1";


void mem_read (char *buffer, WORD addr, unsigned char count)
{
    unsigned char command_mem_request [8] = {
        0, 0xFF, 0xFF, 1, 0xF0, 0xA6, 0x10, 0x47 };

    unsigned char buffer2 [30];

    // Зачем это - не знаю.
    // В логе фирменной программы была установка/снятие BREAK
    SetCommBreak (hCom);
    ClearCommBreak (hCom);    

    // Запрос железке
    WriteFile (hCom, @command_mem_request, 8, &dwBytes, NULL);    
    if (dwBytes != 8) printf ("Error!!!\n");

    // Хотим ответ
    // По факту ничего не получаем
    while (1)
    {
        ReadFile (hCom, &buffer2, 0x1, &dwBytes, NULL);
        printf ("%u bytes read!\n", dwBytes);        
    }
}


int main(int argc, char *argv[])
{
    unsigned char buffer, buffer_prev = 0xF0;
    COMMTIMEOUTS CommTimeouts;
    DCB dcb;

    hCom = CreateFile( pcCommPort,
        GENERIC_READ | GENERIC_WRITE,
        0, // must be opened with exclusive-access
        NULL, // no security attributes
        OPEN_EXISTING, // must use OPEN_EXISTING
        0, // not overlapped I/O
        NULL // hTemplate must be NULL for comm devices
        );

    if (hCom == INVALID_HANDLE_VALUE)
    {
        printf ("CreateFile failed with error %d.\n", GetLastError());
        return (1);
    }

    
    if (!SetupComm (hCom, 1024, 300); )
    {
        printf ("SetupComm with error %d.\n", GetLastError());
        return (1);
    }

    if (!GetCommState (hCom, &dcb))
    {
        printf ("GetCommState failed with error %d.\n", GetLastError());
        return (1);
    }
    
    dcb.BaudRate = CBR_9600;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;     
    
    if (!SetCommState(hCom, &dcb))
    {
        printf ("SetCommState failed with error %d.\n", GetLastError());
        return (1);
    }

    if (hCom != INVALID_HANDLE_VALUE && hCom != NULL)
        printf ("COM1 cofigured!\n");

    mem_read (NULL, 0xA6F0, 0x10);

    return (0);
}
Лог сниффера работы моей программки:

Код:
IRP_MJ_CREATE
IOCTL_SERIAL_SET_QUEUE_SIZE
            InSize - 1024
            OutSize - 300
IOCTL_SERIAL_GET_BAUD_RATE
            BaudRate - 9600
IOCTL_SERIAL_GET_LINE_CONTROL
            StopBits - 0
            Parity - 0
            WordLength - 8
IOCTL_SERIAL_GET_CHARS
            EofChar - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar - 17
            XoffChar - 19
IOCTL_SERIAL_GET_HANDFLOW
            ControlHandShake - 0x1 (SERIAL_DTR_CONTROL)
            FlowReplace - 0x40 (SERIAL_RTS_CONTROL)
            XonLimit - 2048
            XoffLimit - 512

Зачем-то еще раз GET_BAUDRATE, GET_LINE_CONTROL, GET_CHARS, GET_HANDFLOW

IOCTL_SERIAL_SET_BAUD_RATE
            BaudRate - 9600
IOCTL_SERIAL_SET_RTS
IOCTL_SERIAL_SET_DTR
IOCTL_SERIAL_SET_LINE_CONTROL
            StopBits - 0
            Parity - 0
            WordLength - 8
IOCTL_SERIAL_SET_CHARS
            EofChar - 0
            ErrorChar - 0
            BreakChar - 0
            EventChar - 0
            XonChar - 17
            XoffChar - 19
IOCTL_SERIAL_SET_HANDFLOW
            ControlHandShake - 0x1 (SERIAL_DTR_CONTROL)
            FlowReplace - 0x40 (SERIAL_RTS_CONTROL)
            XonLimit - 2048
            XoffLimit - 512

Даем запрос устройству.

IOCTL_SERIAL_SET_BREAK_ON
IOCTL_SERIAL_SET_BREAK_OFF
IRP_MJ_WRITE 00 ff ff 01 f0 a6 10 47

И вместо ответа вот такая ерунда в цикле:

14101  IRP_MJ_READ - STATUS_TIMEOUT

Есть у кого-нибудь мысли, что я делаю не так?

P.S. Прошу прощения за большой объем сообщения =)
P.P.S. Прошу сильно не пинать, если создал тему не в том месте.
Реклама:
MEFF2005 вне форума  
Непрочитано 13.02.2010, 01:21  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: общение компьютера с черным ящиком по COM-порту

MEFF2005, Саму программу засвети , или в личку...
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 13.02.2010, 01:24  
MEFF2005
Частый гость
 
Регистрация: 23.01.2009
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
MEFF2005 на пути к лучшему
По умолчанию Re: общение компьютера с черным ящиком по COM-порту

Сообщение от dosikus Посмотреть сообщение
MEFF2005, Саму программу засвети , или в личку...
К сожалению не могу.

Прога - специфическая, для мониторинга оборудования.
Она защищена HardLock донглом.

Как распаковать exe-шник от донгловского упаковщика не знаю =(


Может, намекнете в какую сторону покопать можно?
MEFF2005 вне форума  
Непрочитано 13.02.2010, 01:34  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: общение компьютера с черным ящиком по COM-порту

Сообщение от MEFF2005 Посмотреть сообщение
Может, намекнете в какую сторону покопать можно?
http://cracklab.ru/f/
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 13.02.2010, 01:40  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию Re: общение компьютера с черным ящиком по COM-порту

Кстати , мониторит порт хорошо это :
http://www.compt.ru/ru/index.php
__________________
Осторожно , злой кот
dosikus вне форума  
Непрочитано 13.02.2010, 01:57  
MEFF2005
Частый гость
 
Регистрация: 23.01.2009
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
MEFF2005 на пути к лучшему
По умолчанию Re: общение компьютера с черным ящиком по COM-порту

Сообщение от dosikus Посмотреть сообщение
http://cracklab.ru/f/
Возможно, потом займусь этим. Но пока надеюсь легко отделаться =)
MEFF2005 вне форума  
Непрочитано 13.02.2010, 02:02  
MEFF2005
Частый гость
 
Регистрация: 23.01.2009
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
MEFF2005 на пути к лучшему
По умолчанию Re: общение компьютера с черным ящиком по COM-порту

Сообщение от dosikus Посмотреть сообщение
Кстати , мониторит порт хорошо это :
http://www.compt.ru/ru/index.php
Прога неплохая, но она мониторит только передаваемые/принимаемые байты, а программы типа Eltima Serial Port Monitor - еще и команды, для работы с портом.

Вы меня наверное не совсем поняли =) Я протокол общения фирменной проги и железки уже изучил более-менее. У меня железка не хочет отвечать на команды из терминалок и моей самописной программки.

Т.е. я знаю, что нужно передавать, что мне должны ответить, но оно не передается Тут или порт как-то инициализировать по-хитрому надо, или....
MEFF2005 вне форума  
Непрочитано 13.02.2010, 02:56  
dosikus
Гуру портала
 
Аватар для dosikus
 
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
dosikus на пути к лучшему
По умолчанию

Сообщение от MEFF2005 Посмотреть сообщение
Вы меня наверное не совсем поняли =) Я протокол общения фирменной проги и железки уже изучил более-менее. У меня железка не хочет отвечать на команды из терминалок и моей самописной программки.
---------------------------------------------------------------
Цитата:
Главным отличием программы от аналогов является наличие встроенного интерпретатора подмножества языка C для создания скриптов, призванных автоматизировать рутинные операции над отправляемыми и принимаемыми данными. Например, вычисление CRC, управление настройками порта и т.п. Язык позволяет использовать конструкции if, else, for, do и while, поддерживает пользовательские функции.
Я к чему про com port toolkit ?
Не плохо было им посмотреть лог - как ты говоришь обмен по 3м проводам : на ... тебе команды нужны ?
Смотри что шлет порт , может быть Eltima пропускает что то или врет...
__________________
Осторожно , злой кот

Последний раз редактировалось dosikus; 13.02.2010 в 03:15.
dosikus вне форума  
Непрочитано 13.02.2010, 04:17  
MEFF2005
Частый гость
 
Регистрация: 23.01.2009
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
MEFF2005 на пути к лучшему
По умолчанию Re: Общение компьютера с черным ящиком по COM-порту

Сообщение от dosikus Посмотреть сообщение
---------------------------------------------------------------


Я к чему про com port toolkit ?
Не плохо было им посмотреть лог - как ты говоришь обмен по 3м проводам : на ... тебе команды нужны ?
Смотри что шлет порт , может быть Eltima пропускает что то или врет...
Я знаю эту прогу - начинал анализ с нее, удобная она. Нужные байтики отследил, потом попытался их давать вручную в терминалке - и облом. Перепробовал кучу терминалок.
Только с wTerm получалось дать одну команду и получить ответ. Но только одну. Дальше нужно железку выключать/включать.

При этом родная прога эту команду по кругу гоняет (и получает ответ) без проблем.
MEFF2005 вне форума  
Непрочитано 13.02.2010, 05:44  
MEFF2005
Частый гость
 
Регистрация: 23.01.2009
Сообщений: 28
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
MEFF2005 на пути к лучшему
По умолчанию Re: Общение компьютера с черным ящиком по COM-порту

Тут выяснился вопрос. Если устройство выключить/включить, то работает.
Но только на один раз.
Например, нужно послать команды (и получить ответ после каждой)
00 FF FF 01 F0 A6 10 47
00 FF FF 01 03 00 04 06
00 FF FF 01 F0 F0 0A 0B

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


Самое интересное, что фирменная прога отлично пашет даже когда железка якобы зависла (не отвечала на самописную программку).
Кстати, фирменная прога отсылает эти же команды в этой же последовательности.

Т.е. как по мне, дело не в железке...
MEFF2005 вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 13:35.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot