Потеря байт при работе с COM портом

VISA, TCP/IP, USB, CAN, GPIB и подобные протоколы
pashking
interested
interested
Сообщения: 4
Зарегистрирован: 13 июн 2013, 15:55
Версия LabVIEW: 2012
Контактная информация:

Потеря байт при работе с COM портом

Сообщение pashking »

Поиском пользовался но ответа так и не нашел.

Проблема в следующем. МК передает по 4 байта 10 раз в секунду в COM порт. По одному байту на измеряемый канал и один контрольный.
Я в цикле читаю по 4 байта и хочу их разделить и выводить на графики и индикаторы. Сделал простой ВП для проверки.

В итоге я вижу периодические потери байт!

Хотя при прослушивании порта HyperTerminal'ом никаких потерь нет.

В чем может быть проблема?
test.jpg
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5467
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 88 раз

Re: Потеря байт при работе с COM портом

Сообщение IvanLis »

pashking писал(а):В итоге я вижу периодические потери байт!
Хотя при прослушивании порта HyperTerminal'ом никаких потерь нет.
На какой скорости вы работаете с МК?
Реализуйте прием данных не по количеству байт, а по терминатору.
Это стабильнее работает, т.к. нет необходимости в синхронизации и идентификации каналов.
pashking
interested
interested
Сообщения: 4
Зарегистрирован: 13 июн 2013, 15:55
Версия LabVIEW: 2012
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение pashking »

Скорость 9600. А хотя бы на словах какой алгоритм будет при приеме данных по терминатору?
Да к тому же это ведь не решает саму проблему исчезновения некоторых байт...
И все равно интересно почему пропадают байты?
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5467
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 88 раз

Re: Потеря байт при работе с COM портом

Сообщение IvanLis »

pashking писал(а):Скорость 9600. А хотя бы на словах какой алгоритм будет при приеме данных по терминатору?
Да к тому же это ведь не решает саму проблему исчезновения некоторых байт...
И все равно интересно почему пропадают байты?
Что у Вас подразумевается под "контрольный" байт? Может это и есть терминатор....

Как раз эту проблему и решает.
Что значит потеря, просто вы его обработать не можете...
Вы принимаете 4 байта, например к1, к2, к3, п.
Все хорошо, если их очередность такой и есть.
Но может же быть и по другому, например п, к1, к2, к3 или к3, п, к1, к2. И эту очередность Вы не знаете.
Вы допустим считаете, что это информационный байт, а он проверочный. Зависит от того, что за байт используется, он может быть преобразован в данные или нет...

При использовании терминатора, окончание приема пакета осуществляется именно по терминатору.
Может быть получен битый пакет, но как правило первый. Потом данные принимаются нормально.

Настройка терминатора выполняется VISA, почитайте, там ничего сложного нет.
Главное, что бы он совпадал на передающей и приемной стороне.
pashking
interested
interested
Сообщения: 4
Зарегистрирован: 13 июн 2013, 15:55
Версия LabVIEW: 2012
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение pashking »

А ведь Вы правы!!! Отключил проверку терминатора и байты перестали исчезать!
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5467
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 88 раз

Re: Потеря байт при работе с COM портом

Сообщение IvanLis »

pashking писал(а):А ведь Вы правы!!! Отключил проверку терминатора и байты перестали исчезать!
Только Вам ее нужно наоборот включить :wink: .
А в настройках "количество байт" установить число побольше, например 16.
Тогда пакет будет приниматься именно по терминатору.
А сейчас у Вас данные принятые наверняка не соответствуют переданным, именно из-за отсутствия синхронизации.
Терминатор выступает именно как STOP символ, который говорит об окончании пакета, что и позволяет считать, что данные принимаются синхронно.
pashking
interested
interested
Сообщения: 4
Зарегистрирован: 13 июн 2013, 15:55
Версия LabVIEW: 2012
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение pashking »

Я передаю в HEX, а не в ASCII формате. И как теперь я понимаю с включенным терминатором он некоторые комбинации бай принимает за STOP.
Так что с терминатором у меня не очень то получится.
laryc
beginner
beginner
Сообщения: 19
Зарегистрирован: 02 июл 2013, 14:18
Версия LabVIEW: 2012
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение laryc »

так что ,господа,проблема не решена? У кого есть решения как избавиться от терминатора? Или нафига такой ЛабВью если он только как печатная машинка может работать. Я пока вижу одно решение принимать по одному байту и самому уже формировать массив с соответствующей синхронизацией.. но тогда уж лучше писать программу в БОрланде... никак не могу понять это что нам навязывают протокол обмена без всяких альтернатив?
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение dadreamer »

laryc, у вас такая же проблема как у топикстартера? А вот так пробовали?
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1338
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 44 раза
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение AndreyDmitriev »

laryc писал(а):так что ,господа,проблема не решена? У кого есть решения как избавиться от терминатора? Или нафига такой ЛабВью если он только как печатная машинка может работать. Я пока вижу одно решение принимать по одному байту и самому уже формировать массив с соответствующей синхронизацией.. но тогда уж лучше писать программу в БОрланде... никак не могу понять это что нам навязывают протокол обмена без всяких альтернатив?
Странный вопрос. В настройках последовательного порта (VISA Configure Serial Port) вы можете явно указать - требуется вам терминатор или нет (по умолчанию включено) и какой байт (0xA). Эта установка влияет на VISA Read - она будет читать либо до терминатора либо до таймаута. Как это дело использовать - зависит от протокола обмена с конкретным устройством. Если пакеты завершаются терминальным байтом, то эта опция удобна, так как разбор на пакеты будет самой VISA Read осуществляться. Если протокол не подразумевает терминального символа (ну, к примеру, устройство перед началом пакета передаёт его длину, а потом сам пакет), то, разумеется, эту опцию надо выключить и сначала получить длину пакета, подать эту длину на VISA Read и получить целый пакет. Если устройство передаёт данные как печатная машинка, то и принимать их надо побайтово. В этом смысле программа на LabVIEW от борландовской ничем не отличается - и там и там можно реализовать одинаковую логику.
bee
junior
junior
Сообщения: 51
Зарегистрирован: 12 июн 2013, 09:04
Версия LabVIEW: 2014
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение bee »

Добрый день. У меня аналогичные грабли, LV выхватывает из порта разное количество байт.
Данные передает МК, командами SendChar и SendString. Если символ из первой команды еще можно как-то идентифицировать через LV, то со строкой вообще ничего не понятно...
Пробовал программу предложенную dadreamer ощутимых сдвигов не заметил.

Я так понимаю МК должен вставлять какой-то символ-терминатор в конце строки, чтобы LV смогла считывать строки до терминатора.
Подскажите на пальцах как сформировать терминатор на передающей и принимающей стороне?

Например на МК выполняю команду:
FCD_RS2320_SendRS232String("Hello!", 5);
Пусть "!" будет терминатором, что мне подать на вход Visa configure serial port \ termination char ?
anda55
assistant
assistant
Сообщения: 149
Зарегистрирован: 19 янв 2012, 10:15
Версия LabVIEW: 2010-2012
Откуда: Киев
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение anda55 »

Работающая программа с модемом МС-35
Вложения
COM port.vi
(14.68 КБ) 220 скачиваний
bee
junior
junior
Сообщения: 51
Зарегистрирован: 12 июн 2013, 09:04
Версия LabVIEW: 2014
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение bee »

anda55, спасибо за ответ, не совсем, то что нужно.

Получать данные с СОМ-порта у меня получается, но не могу их интерпретировать (((
Предположим МК шлет один раз в порт символ "1" типа Char, LV его принимает в строку read buffer (hex display)
Далее я хочу передать символ на МК (пусть ту же самую "1") из LV write buffer (hex display) и получить очередную порцию данных, но не получаю. Возможно проблема в несовпадении кодировок...
Вложения
comRW.png
comRW.png (10.39 КБ) 8932 просмотра
RW_com.vi
(15.38 КБ) 187 скачиваний
anda55
assistant
assistant
Сообщения: 149
Зарегистрирован: 19 янв 2012, 10:15
Версия LabVIEW: 2010-2012
Откуда: Киев
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение anda55 »

Попробуй проверь какой код ты получаешь в МК
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 127 раз
Контактная информация:

Re: Потеря байт при работе с COM портом

Сообщение dadreamer »

bee

В диспетчере устройств Windows выставляете нужные вам параметры связи (скорость (бит/с), биты данных, чётность, стоповые биты, управление потоком). В принципе, можно оставить всё как есть, только скорость поднять повыше, например 115200 бит/с. В :labview: на входе инструмента VISA Configure Serial Port выставляете точно такие же параметры. И для контроллера нужно выставить те же самые параметры. Проверьте связь с МК сперва через терминал, если всё ОК, значит, что-то не так в :labview: . Хотя вроде в программе у вас все нормально.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Коммуникация с приборами»