![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 | |
Пользователь
Регистрация: 11.08.2011
Сообщений: 67
|
![]()
Здравствуйте. Заранее прошу прощение за длинное вступление с исходными данными, но дьявол, как известно кроется в деталях..( Есть устройство подключенное через COM-порт RS-232С, нужно посредством своей программы передать и получить ответ только для одной команды (вообще их там много, но смогу понять принцип и подтянуть другие уже самостоятельно).
Есть спецификация (ниже), из минусов: знаний- 0, всегда сторонился COM и иже с ним.. Также нет возможности опробовать код "в деле". Но показалось, что шаги довольно чётко расписаны в доках, - посему понадеялся на лучшее (в след.комментарии, то что наваял в Delphi). Вроде бы все норм., но есть сомнения.. Посмотрите пожалуйста профессиональным взлядом, все-ли правильно в коде (с точки зрения синтаксиса, т.е понятное дело, - все компилируется в Delphi 10.1), а то реально нет пока возможности затестить все это хозяйство в паре с купюрораздатчиком.. Прикрепил на всякий случай исходники и оригинальный PDF-файл спецификации, откуда почерпнул вводную информацию ниже по тексту Вводные данные Общ. схема взаимодействия Клиент-Сервера:
Характеристики: Метод передачи - полудуплексный режим (HDM). Когда диспенсер работает, сообщение с верхнего уровня (ПК) игнорируется. Основные передаваемые символы приведены ниже. Код:
Соблюдаются только RXD и TXD спецификация, определеные в RS-232C Оригинальный текст: In case of transmission, physical handshake is not used. Only RXD and TXD defined in RS-232C specification is observed. Основные тайминги (Минимум - Макс.): Код:
Протокол сообщений: Протокол сообщений немного варьируется в зависимости от команды запроса или ответа. Код:
Код:
Код:
Описание из документации (постарался привести к читабельному виду): Цитата:
Код:
Код:
Последний раз редактировалось Foxpronet; 17.09.2021 в 04:06. Причина: ЧелФактор |
|
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 11.08.2011
Сообщений: 67
|
![]()
/////////////////////////////////////
//Сам код //////////////// Код:
Код:
Код:
Код:
Последний раз редактировалось Foxpronet; 17.09.2021 в 04:08. |
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 11.08.2011
Сообщений: 67
|
![]() Код:
Код:
Код:
Код:
Код:
Последний раз редактировалось Foxpronet; 17.09.2021 в 04:09. |
![]() |
![]() |
![]() |
#4 | |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
![]()
Тут ошибка
BYTE StopBits; // 0,1,2 = 1, 1.5, 2 Цитата:
В дельфи есть хорошая справка. Во вторых не используйте маические числа есть же константы для всего. ONESTOPBIT, EVENPARITY bcc присваеваешь результату 0 и далее ксоришь все байты сообщения с результатом в цикле.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
|
![]() |
![]() |
![]() |
#5 |
Пользователь
Регистрация: 11.08.2011
Сообщений: 67
|
![]()
Понял по всем позициям, спасибо большое! Как думаете, тот ReadFile() в таймере,
не будет-ли приводить к зависанию (синхронный режим кажись), если да, то как можно это устранить (новый флаг какой в той же функции, или другую модель для чтения искать) |
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 11.08.2011
Сообщений: 67
|
![]()
И аргументы InQueue, OutQueue в 2048 для openCom() не аукнутся в моем случае (исх. из исходных критериев) ?
Код:
Код:
отд.флаг для DCB (в функции SetCommStatus), если не ошибаюсь Последний раз редактировалось Foxpronet; 17.09.2021 в 17:01. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 28.02.2009
Сообщений: 42
|
![]()
Для начала взять схему соединений и выяснить какой кабель нужен.
ибо In case of transmission, physical handshake is not used. Only RXD and TXD defined in RS-232C specification is observed. очень уж лаконично сказано. квбели 1 прямой - 9 проводов. 2 нульмодем 3 провода. 2 перемычки(4-6)(7-8) 3 нульмодем - 5 проводов. Сделать кабель. Одна переменная из уравнения X + Y + Z = Б...ь какого PSже оно не работает... удалена. теперь берем VirtualComport. ставим не машину и соеденяем два кома как необходимо по схеме. на один вешаем терминал или эмулятор своего прибора. на второй - свою программу. пишем, пробуем, курим RTFM - пока не заработает. подключаем прибор - начинаем танцы с бубном до получения необходимого результата. из советов. если не нужна банковская аттестация софта - забей на WINAPI. возьми готовый компонент типа BCPort или ComPort Library от Dejan Crnila. Сразу решаешь кучу вопросов. Если нужна - посмотришь как реализовано - вместо изобретения велосипеда. По хорошему таймер, прием, передачу посадить на разные потоки чтобы дург друга не задерживать. Ну вобщем както так. Если нужен софт скажи пришлю на почту. PS ошибки новичков: 50% - неправильный кабель, 10% - непонимание настроек порта. ну и не забывать - программа работает как написана, а не как думает программист. |
![]() |
![]() |
![]() |
#8 |
Пользователь
Регистрация: 28.02.2009
Сообщений: 42
|
![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
RCON отправка команды и получение ответа. | VarlonecM | Работа с сетью в Delphi | 0 | 15.03.2019 11:30 |
Отправка POST запроса и получение ответа | Chester751 | Общие вопросы по Java, Java SE, Kotlin | 2 | 19.07.2016 11:45 |
Получение ответа сервера | cyberdev | Работа с сетью в Delphi | 6 | 04.04.2016 15:57 |
Получение ответа сервера. | Semreg | Общие вопросы Delphi | 1 | 01.12.2013 22:37 |
О получение ответа AJAX | Rost93 | JavaScript, Ajax | 11 | 16.05.2012 07:25 |