PDA

Просмотр полной версии : СПК107 и TCP/IP



Verbi
11.09.2020, 09:43
Добрый день, коллеги.
Имеется прибор работающий по строковому протоколу. Интерфейс связи Ethernet. (TCP)
Прибору посылается запрос. В ответ он отправляет две строки:
-Первую с подтверждением команды запроса.
-Вторую с данными.
В утилите Hercules в ответ приходят обе строки. При опросе прибора СПК он видит только первую строку.
Пробовали читать буфер- там тоже только одна строка.
Для связи используем библиотеку OwenComminication. Пробовали CAA Net Base Services.
В чём может быть проблема?
Проект во вложении.

Евгений Кислов
11.09.2020, 09:55
Добрый день.

Ваше устройство отправляет в ответ на один TCP-запрос два отдельных ответа? (отдельными пакетами?)

Verbi
11.09.2020, 11:09
Евгений во вложении скриншот лога из Wireshark, при опросе Hercules-ом. Порт устройства 30001. Мой порт 50211.

Евгений Кислов
11.09.2020, 12:01
Мне, честно говоря, этот скриншот лога ничего не говорит.
Ваш проект с Геркулесом у меня работает именно так, как я ожидаю:
https://dropmefiles.com/RGFcX

Verbi
11.09.2020, 12:32
Евгений, прошу прощения не полностью "причесал" код.
Запрос и ответ в текстовом файле во вложении.

Евгений Кислов
11.09.2020, 12:45
Посмотрите, пожалуйста, мое видео и прокомментируйте - на нем все работает так, как должно у вас?

Александр Назаренко
11.09.2020, 14:03
Посмотрите, пожалуйста, мое видео и прокомментируйте - на нем все работает так, как должно у вас?

Добрый день. Проблема в том что сервер на запрос отправляет один ответ в виде двух строк. Каждая строка заканчивается управляющими символами ASCII CR и LF (возврат каретки и перевод на строку). Блок NBS.TCP_Read принимает только первую строку. Вторая строка теряется.
Например: если в блокноте написать две произвольные строки, скопировать их и вставить в поле Send Геркулеса, то в Send-е останется только первая строка.

Verbi
11.09.2020, 14:16
Евгений, на видео всё работает так как должно. Выше мой коллега описал суть проблемы по нашему мнению.

Евгений Кислов
11.09.2020, 14:32
Добрый день. Проблема в том что сервер на запрос отправляет один ответ в виде двух строк. Каждая строка заканчивается управляющими символами ASCII CR и LF (возврат каретки и перевод на строку). Блок NBS.TCP_Read принимает только первую строку. Вторая строка теряется.
Например: если в блокноте написать две произвольные строки, скопировать их и вставить в поле Send Геркулеса, то в Send-е останется только первая строка.

А после символов переноса строки случаем нет терминирующего нуля (0x00)?

Я по вашему описанию пока не могу повторить проблему (на скриншоте - один ответ с переносами строк):

51016

А вот если в ответе есть нуль-терминатор - то произойдет именно то, что описываете вы (и это логично - по стандарту этот код используется для определения конца строки):

51017

Александр Назаренко
11.09.2020, 15:04
Как тогда получить остальные данные? Вся полезная информация находится как раз во второй строке.:confused:

Евгений Кислов
11.09.2020, 16:29
Как тогда получить остальные данные? Вся полезная информация находится как раз во второй строке.:confused:

Использовать не STRING, а ARRAY [0..x] OF BYTE (в принципе, STRING и является таким массивом - но так будет нагляднее).
Дальше парсить массив, вырезая из него нужные строки.