Форум программистов, компьютерный форум, киберфорум
Наши страницы
АСУ ТП, промэлектроника
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/10: Рейтинг темы: голосов - 10, средняя оценка - 4.50
romank26
8 / 8 / 1
Регистрация: 06.04.2011
Сообщений: 25
1

FLUKE 983. Реверсинг обмена по RS-232

26.03.2012, 09:31. Просмотров 1898. Ответов 9
Метки нет (Все метки)

добрый день. проблема в следующем. имеется прибор, подключенный через rs232 к компу. при запуске стандартной программы, идущей с прибором, через Portmonitor показываются данные "запроса - 00 0F FF 44", далее "ответ - 0F 00 07 00 06 19 52". проблема состоит в следующем, что через программу, написанную в билдере, после запроса 00 0F FF 44, приходит и ответ в виде 00 0F FF 44. порт и программа настроены по скорости четности и т.д. как сделать, чтобы запрос/ответ соответствовали тем, котоыре заложены в стандартном ПО на прибор? заранее спасибо.
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2012, 09:31
Ответы с готовыми решениями:

Как определить протокол обмена по интерфейсу RS-232?
Здравствуйте! Есть определенное устройство с блоком управления. К блоку управления через нуль...

Протокол обмена данными по RS-232 для Appa503
Уважаемые форумчане, ищу протокол обмена данными ( команду на считывание и правила расшифровки )...

Массив: вычислить количество и сумму чисел, кратных 25, в диапазоне от 983 до 1150
Всем доброго времени суток. Уважаемые программисты, подскажите пожалуйста, как вычислить через...

реверсинг
Реверсинг слышал это слово от друга, он кидал линки на англо-язычный сайт...

реверсинг exe
стазу извините естли запостил не туда.. вскрыл 7зипом... там архивы.. подскажите пожалуйста где...

9
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
26.03.2012, 09:41 2
...очевидно, что вы настроили COM-порт не в полном соответствии с оригинальным ПО: проверьте стоп-биты, буфер, ... (вполне возможно поможет документация к неназванному прибору)
...к тому же, не видно вашего кода.

p.s.: пробовали ли просто через гипертерминал общаться, какова реакция с ним?
0
romank26
8 / 8 / 1
Регистрация: 06.04.2011
Сообщений: 25
26.03.2012, 10:03  [ТС] 3
Цитата Сообщение от raxp Посмотреть сообщение
...очевидно, что вы настроили COM-порт не в полном соответствии с оригинальным ПО: проверьте стоп-биты, буфер, ... (вполне возможно поможет документация к неназванному прибору)
...к тому же, не видно вашего кода.

p.s.: пробовали ли просто через гипертерминал общаться, какова реакция с ним?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
void COMOpen()
{
 String portname;        //имя порта
 DCB dcb;                //структура для общей инициализации порта DCB
 COMMTIMEOUTS timeouts;  //структура для установки таймаутов
 
 portname = Form1->ComboBox1->Text; //получить имя выбранного порта
 
 
 COMport = CreateFile(portname.c_str(),GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
 //здесь:
 
 if(COMport == INVALID_HANDLE_VALUE)            //если ошибка открытия порта
  {
   Form1->SpeedButton1->Down = false;           //отжать кнопку
   Form1->StatusBar1->Panels->Items[0]->Text = "Не удалось открыть порт";
   return;
  }
 
 //инициализация порта
 dcb.DCBlength = sizeof(DCB);
 
 //считать структуру DCB из порта
 if(!GetCommState(COMport, &dcb))
  {
   COMClose();
   Form1->StatusBar1->Panels->Items[0]->Text  = "Не удалось считать DCB";
   return;
  }
 
 //инициализация структуры DCB
 dcb.BaudRate = StrToInt(Form1->ComboBox2->Text);       //задаём скорость передачи 115200 бод
 dcb.fBinary = TRUE;                                    //включаем двоичный режим обмена
 dcb.fOutxCtsFlow = FALSE;                              //выключаем режим слежения за сигналом CTS
 dcb.fOutxDsrFlow = FALSE;                              //выключаем режим слежения за сигналом DSR
 dcb.fDtrControl = DTR_CONTROL_DISABLE;                 //отключаем использование линии DTR
 dcb.fDsrSensitivity = FALSE;                           //отключаем восприимчивость драйвера к состоянию линии DSR
 dcb.fNull = FALSE;                                     //разрешить приём нулевых байтов
 dcb.fRtsControl = RTS_CONTROL_DISABLE;                 //отключаем использование линии RTS
 dcb.fAbortOnError = FALSE;                             //отключаем остановку всех операций чтения/записи при ошибке
 dcb.ByteSize = 8;                                      //задаём 8 бит в байте
 dcb.Parity = 0;                                        //отключаем проверку чётности
 dcb.StopBits = 0;                                      //задаём один стоп-бит
 
 //загрузить структуру DCB в порт
 if(!SetCommState(COMport, &dcb))   //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
  {
   COMClose();
   Form1->StatusBar1->Panels->Items[0]->Text  = "Не удалось установить DCB";
   return;
  }
 
 //установить таймауты
 timeouts.ReadIntervalTimeout = 0;      //таймаут между двумя символами
 timeouts.ReadTotalTimeoutMultiplier = 0;   //общий таймаут операции чтения
 timeouts.ReadTotalTimeoutConstant = 0;         //константа для общего таймаута операции чтения
 timeouts.WriteTotalTimeoutMultiplier = 0;      //общий таймаут операции записи
 timeouts.WriteTotalTimeoutConstant = 0;        //константа для общего таймаута операции записи
 
 //записать структуру таймаутов в порт
 if(!SetCommTimeouts(COMport, &timeouts))   //если не удалось - закрыть порт и вывести сообщение об ошибке в строке состояния
  {
   COMClose();
   Form1->StatusBar1->Panels->Items[0]->Text  = "Не удалось установить тайм-ауты";
   return;
  }
 
 //установить размеры очередей приёма и передачи
 SetupComm(COMport,2000,2000);
 
 //создать или открыть существующий файл для записи принимаемых данных
 handle = open("test.txt", O_CREAT | O_APPEND | O_BINARY | O_WRONLY, S_IREAD | S_IWRITE);
 
 if(handle==-1)     //если произошла ошибка открытия файла
  {
   Form1->StatusBar1->Panels->Items[1]->Text = "Ошибка открытия файла";  //вывести сообщение об этом в командной строке
   Form1->Label6->Hide();                                               //спрятать надпись с именем файла
   Form1->CheckBox3->Checked = false;                                   //сбросить и отключить галочку
   Form1->CheckBox3->Enabled = false;
  }
 else { Form1->StatusBar1->Panels->Items[0]->Text = "Файл открыт успешно"; } //иначе вывести в строке состояния сообщение об успешном открытии файла
 
 PurgeComm(COMport, PURGE_RXCLEAR); //очистить принимающий буфер порта
 
 reader = CreateThread(NULL, 0, ReadThread, NULL, 0, NULL);         //поток чтения, который сразу начнёт выполняться предпоследний параметр = 0
 writer = CreateThread(NULL, 0, WriteThread, NULL, CREATE_SUSPENDED, NULL); //с поток записи в остановленном состоянии предпоследний параметр = CREATE_SUSPENDED
 
}
документации на прибор есть, но в ней указано только как им пользоваться. прибор FLUKE 983
через гипертерминал не пробовал. сейчас попробую.
0
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
26.03.2012, 12:04 4
...набросал тут у себя небольшой тестовый запросчик-монитор, потестируйте запросы (ради интереса, будет ловить что или нет).

p.s.: что с гипертерминалом?
1
Вложения
Тип файла: zip test fluke 983.zip (244.7 Кб, 50 просмотров)
romank26
8 / 8 / 1
Регистрация: 06.04.2011
Сообщений: 25
26.03.2012, 12:35  [ТС] 5
Цитата Сообщение от raxp Посмотреть сообщение
...набросал тут у себя небольшой тестовый запросчик-монитор, потестируйте запросы (ради интереса, будет ловить что или нет).

p.s.: что с гипертерминалом?
через твой опросчик все замечательно работает, и остальные запросы принимаются и посылаются корректно. как я понял, он у тебя на паскале написан? можешь рассказать подробнее, что я не так делаю? могу выложить исходник проги.
0
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
26.03.2012, 12:54 6
...да, выкладывайте полный код. Не скажу, что проверю по NET, но общий алгоритм увидеть можно будет.

p.s.: есть подозрение, что вы обработчике потока замкнули на себя (кода не вижу) и считываете эхо свое же.
0
romank26
8 / 8 / 1
Регистрация: 06.04.2011
Сообщений: 25
26.03.2012, 13:30  [ТС] 7
Цитата Сообщение от raxp Посмотреть сообщение
...да, выкладывайте полный код. Не скажу, что проверю по NET, но общий алгоритм увидеть можно будет.

p.s.: есть подозрение, что вы обработчике потока замкнули на себя (кода не вижу) и считываете эхо свое же.
быть может вы правы по поводу замкнутости потоков. еще есть подозрение на программную заглушку temp, но пока не разобрался
0
Вложения
Тип файла: rar флюк.rar (685.6 Кб, 47 просмотров)
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
26.03.2012, 13:47 8
1- на первый взгляд ничего криминального не увидел, кроме вот этой операции заполнения буфера (для последующей отсылки через WriteFile()):
C++
1
strcpy(bufwr,Form1->Edit1->Text.c_str());      //занести в программный передающий буфер строку из Edit1
хотите сказать, что шлете прямым текстом '00 0F FF 44' с контрола? Как минимум пробелы убрать нужно (пробел тоже символ) и преобразовать текстовое отображение HEX кода в байт (массив байтов, пакет)
тырк
вот вы выделили память на передающий буфер:
C++
1
memset(bufwr,0,BUFSIZE);
с размером буфера на 255 байт, в том время как сам запрос у вас содержит 4 байта. Т.е.

bufwr[0] = 0x00;
bufwr[1] = 0x0f;
bufwr[2] = 0xff;
bufwr[3] = 0x44;

смысл ясен?
, как максимум для самоконтроля - выведите визуально последовательность байт в пакете, что передаете.

2- какое количество принятых байтов у вас получается после отправки запроса (в ответе от FLUKE)? Хотя вот с первым сначала разобраться нужно.

3- еще попробуйте в структуре DCB задавать только скорость и стоп-бит, все остальные параметры не трогать.
0
romank26
8 / 8 / 1
Регистрация: 06.04.2011
Сообщений: 25
27.03.2012, 10:55  [ТС] 9
1. хм, да, получается что шлю прямым текстом данные. не правильно? надо как-то преобразовать? как это сделать, где об этом почитать? по поводу 255байт и 4байтов не совсем понял смысл.
2. кол-во байтов, принятых от прибора, всегда по разному. все зависит от запроса.
3. в структуре пробовал оставлять только то, что вы описали. без изменений. какие параметры порта вы указывали в своей программе?
0
raxp
10200 / 6582 / 493
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
27.03.2012, 11:39 10
1. хм, да, получается что шлю прямым текстом данные. не правильно? надо как-то преобразовать?
разумеется нет, о чем написано выше ...да, надо преобразовывать ...формат пакета показан выше в "тырке"

как это сделать, где об этом почитать?
у вас байты записаны HEX-ом, но в строковом представлении и отделены символом пробела, который тоже байт ...для парсинга я мог использовать дельфийские pos(), posex() (аналог в си вроде strcmp ...меня поправят, если что), но воспользовался удобным классом tstringlist (см. рабочий проект запросчика выше), после того как выделил из общей строки запрос, преобразовал наборчик в тип integer и сформировал массив байт - пакет, который и отправляется через WriteFile().

p.s.: все эти нюансы касаются визуальной разработки с использованием контрола, ведь вы можете сразу сформировать пакет, а не набирать его вручную.

по поводу 255байт и 4байтов не совсем понял смысл.
а смысл гнать мега-длинный запрос? Формат запроса вы сами видите в логгере, хотите его сымитировать и в то же время делаете буфер такого размера.

2. кол-во байтов, принятых от прибора, всегда по разному. все зависит от запроса.
3. в структуре пробовал оставлять только то, что вы описали. без изменений. какие параметры порта вы указывали в своей программе?
эти пункты актуальны, только после выполнения первого.
0
27.03.2012, 11:39
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.03.2012, 11:39

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

Реверсинг прошивки PIC12F629
Добрый вечер. Решил собрать миниробота на PIC12F629. Соответственно встал вопрос о прошивке. В...

Перехват функций, реверсинг
Всем доброго времени суток, есть программа(exe), в которой есть пользовательская(не WinAPI)...

Реверсинг платы на STM32F103RB
Получил на изучение данную плату, на ней установлен процессор ARM STM32F103RBT6 на этом информация...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.