Потеря байт при работе с COM портом
-
- interested
- Сообщения: 4
- Зарегистрирован: 13 июн 2013, 15:55
- Версия LabVIEW: 2012
- Контактная информация:
Потеря байт при работе с COM портом
Поиском пользовался но ответа так и не нашел.
Проблема в следующем. МК передает по 4 байта 10 раз в секунду в COM порт. По одному байту на измеряемый канал и один контрольный.
Я в цикле читаю по 4 байта и хочу их разделить и выводить на графики и индикаторы. Сделал простой ВП для проверки.
В итоге я вижу периодические потери байт!
Хотя при прослушивании порта HyperTerminal'ом никаких потерь нет.
В чем может быть проблема?
Проблема в следующем. МК передает по 4 байта 10 раз в секунду в COM порт. По одному байту на измеряемый канал и один контрольный.
Я в цикле читаю по 4 байта и хочу их разделить и выводить на графики и индикаторы. Сделал простой ВП для проверки.
В итоге я вижу периодические потери байт!
Хотя при прослушивании порта HyperTerminal'ом никаких потерь нет.
В чем может быть проблема?
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Потеря байт при работе с COM портом
На какой скорости вы работаете с МК?pashking писал(а):В итоге я вижу периодические потери байт!
Хотя при прослушивании порта HyperTerminal'ом никаких потерь нет.
Реализуйте прием данных не по количеству байт, а по терминатору.
Это стабильнее работает, т.к. нет необходимости в синхронизации и идентификации каналов.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- interested
- Сообщения: 4
- Зарегистрирован: 13 июн 2013, 15:55
- Версия LabVIEW: 2012
- Контактная информация:
Re: Потеря байт при работе с COM портом
Скорость 9600. А хотя бы на словах какой алгоритм будет при приеме данных по терминатору?
Да к тому же это ведь не решает саму проблему исчезновения некоторых байт...
И все равно интересно почему пропадают байты?
Да к тому же это ведь не решает саму проблему исчезновения некоторых байт...
И все равно интересно почему пропадают байты?
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Потеря байт при работе с COM портом
Что у Вас подразумевается под "контрольный" байт? Может это и есть терминатор....pashking писал(а):Скорость 9600. А хотя бы на словах какой алгоритм будет при приеме данных по терминатору?
Да к тому же это ведь не решает саму проблему исчезновения некоторых байт...
И все равно интересно почему пропадают байты?
Как раз эту проблему и решает.
Что значит потеря, просто вы его обработать не можете...
Вы принимаете 4 байта, например к1, к2, к3, п.
Все хорошо, если их очередность такой и есть.
Но может же быть и по другому, например п, к1, к2, к3 или к3, п, к1, к2. И эту очередность Вы не знаете.
Вы допустим считаете, что это информационный байт, а он проверочный. Зависит от того, что за байт используется, он может быть преобразован в данные или нет...
При использовании терминатора, окончание приема пакета осуществляется именно по терминатору.
Может быть получен битый пакет, но как правило первый. Потом данные принимаются нормально.
Настройка терминатора выполняется VISA, почитайте, там ничего сложного нет.
Главное, что бы он совпадал на передающей и приемной стороне.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- interested
- Сообщения: 4
- Зарегистрирован: 13 июн 2013, 15:55
- Версия LabVIEW: 2012
- Контактная информация:
Re: Потеря байт при работе с COM портом
А ведь Вы правы!!! Отключил проверку терминатора и байты перестали исчезать!
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Потеря байт при работе с COM портом
Только Вам ее нужно наоборот включить .pashking писал(а):А ведь Вы правы!!! Отключил проверку терминатора и байты перестали исчезать!
А в настройках "количество байт" установить число побольше, например 16.
Тогда пакет будет приниматься именно по терминатору.
А сейчас у Вас данные принятые наверняка не соответствуют переданным, именно из-за отсутствия синхронизации.
Терминатор выступает именно как STOP символ, который говорит об окончании пакета, что и позволяет считать, что данные принимаются синхронно.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- interested
- Сообщения: 4
- Зарегистрирован: 13 июн 2013, 15:55
- Версия LabVIEW: 2012
- Контактная информация:
Re: Потеря байт при работе с COM портом
Я передаю в HEX, а не в ASCII формате. И как теперь я понимаю с включенным терминатором он некоторые комбинации бай принимает за STOP.
Так что с терминатором у меня не очень то получится.
Так что с терминатором у меня не очень то получится.
-
- beginner
- Сообщения: 19
- Зарегистрирован: 02 июл 2013, 14:18
- Версия LabVIEW: 2012
- Контактная информация:
Re: Потеря байт при работе с COM портом
так что ,господа,проблема не решена? У кого есть решения как избавиться от терминатора? Или нафига такой ЛабВью если он только как печатная машинка может работать. Я пока вижу одно решение принимать по одному байту и самому уже формировать массив с соответствующей синхронизацией.. но тогда уж лучше писать программу в БОрланде... никак не могу понять это что нам навязывают протокол обмена без всяких альтернатив?
-
- VIP
- Сообщения: 1338
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: Потеря байт при работе с COM портом
Странный вопрос. В настройках последовательного порта (VISA Configure Serial Port) вы можете явно указать - требуется вам терминатор или нет (по умолчанию включено) и какой байт (0xA). Эта установка влияет на VISA Read - она будет читать либо до терминатора либо до таймаута. Как это дело использовать - зависит от протокола обмена с конкретным устройством. Если пакеты завершаются терминальным байтом, то эта опция удобна, так как разбор на пакеты будет самой VISA Read осуществляться. Если протокол не подразумевает терминального символа (ну, к примеру, устройство перед началом пакета передаёт его длину, а потом сам пакет), то, разумеется, эту опцию надо выключить и сначала получить длину пакета, подать эту длину на VISA Read и получить целый пакет. Если устройство передаёт данные как печатная машинка, то и принимать их надо побайтово. В этом смысле программа на LabVIEW от борландовской ничем не отличается - и там и там можно реализовать одинаковую логику.laryc писал(а):так что ,господа,проблема не решена? У кого есть решения как избавиться от терминатора? Или нафига такой ЛабВью если он только как печатная машинка может работать. Я пока вижу одно решение принимать по одному байту и самому уже формировать массив с соответствующей синхронизацией.. но тогда уж лучше писать программу в БОрланде... никак не могу понять это что нам навязывают протокол обмена без всяких альтернатив?
-
- junior
- Сообщения: 51
- Зарегистрирован: 12 июн 2013, 09:04
- Версия LabVIEW: 2014
- Контактная информация:
Re: Потеря байт при работе с COM портом
Добрый день. У меня аналогичные грабли, LV выхватывает из порта разное количество байт.
Данные передает МК, командами SendChar и SendString. Если символ из первой команды еще можно как-то идентифицировать через LV, то со строкой вообще ничего не понятно...
Пробовал программу предложенную dadreamer ощутимых сдвигов не заметил.
Я так понимаю МК должен вставлять какой-то символ-терминатор в конце строки, чтобы LV смогла считывать строки до терминатора.
Подскажите на пальцах как сформировать терминатор на передающей и принимающей стороне?
Например на МК выполняю команду:
FCD_RS2320_SendRS232String("Hello!", 5);
Пусть "!" будет терминатором, что мне подать на вход Visa configure serial port \ termination char ?
Данные передает МК, командами SendChar и SendString. Если символ из первой команды еще можно как-то идентифицировать через LV, то со строкой вообще ничего не понятно...
Пробовал программу предложенную dadreamer ощутимых сдвигов не заметил.
Я так понимаю МК должен вставлять какой-то символ-терминатор в конце строки, чтобы LV смогла считывать строки до терминатора.
Подскажите на пальцах как сформировать терминатор на передающей и принимающей стороне?
Например на МК выполняю команду:
FCD_RS2320_SendRS232String("Hello!", 5);
Пусть "!" будет терминатором, что мне подать на вход Visa configure serial port \ termination char ?
-
- assistant
- Сообщения: 149
- Зарегистрирован: 19 янв 2012, 10:15
- Версия LabVIEW: 2010-2012
- Откуда: Киев
- Контактная информация:
Re: Потеря байт при работе с COM портом
Работающая программа с модемом МС-35
- Вложения
-
- COM port.vi
- (14.68 КБ) 220 скачиваний
-
- junior
- Сообщения: 51
- Зарегистрирован: 12 июн 2013, 09:04
- Версия LabVIEW: 2014
- Контактная информация:
Re: Потеря байт при работе с COM портом
anda55, спасибо за ответ, не совсем, то что нужно.
Получать данные с СОМ-порта у меня получается, но не могу их интерпретировать (((
Предположим МК шлет один раз в порт символ "1" типа Char, LV его принимает в строку read buffer (hex display)
Далее я хочу передать символ на МК (пусть ту же самую "1") из LV write buffer (hex display) и получить очередную порцию данных, но не получаю. Возможно проблема в несовпадении кодировок...
Получать данные с СОМ-порта у меня получается, но не могу их интерпретировать (((
Предположим МК шлет один раз в порт символ "1" типа Char, LV его принимает в строку read buffer (hex display)
Далее я хочу передать символ на МК (пусть ту же самую "1") из LV write buffer (hex display) и получить очередную порцию данных, но не получаю. Возможно проблема в несовпадении кодировок...
- Вложения
-
- comRW.png (10.39 КБ) 8932 просмотра
-
- RW_com.vi
- (15.38 КБ) 187 скачиваний
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Потеря байт при работе с COM портом
bee
В диспетчере устройств Windows выставляете нужные вам параметры связи (скорость (бит/с), биты данных, чётность, стоповые биты, управление потоком). В принципе, можно оставить всё как есть, только скорость поднять повыше, например 115200 бит/с. В на входе инструмента VISA Configure Serial Port выставляете точно такие же параметры. И для контроллера нужно выставить те же самые параметры. Проверьте связь с МК сперва через терминал, если всё ОК, значит, что-то не так в . Хотя вроде в программе у вас все нормально.
В диспетчере устройств Windows выставляете нужные вам параметры связи (скорость (бит/с), биты данных, чётность, стоповые биты, управление потоком). В принципе, можно оставить всё как есть, только скорость поднять повыше, например 115200 бит/с. В на входе инструмента VISA Configure Serial Port выставляете точно такие же параметры. И для контроллера нужно выставить те же самые параметры. Проверьте связь с МК сперва через терминал, если всё ОК, значит, что-то не так в . Хотя вроде в программе у вас все нормально.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 23 Ответы
- 4628 Просмотры
-
Последнее сообщение maxim_MA
-
- 6 Ответы
- 1647 Просмотры
-
Последнее сообщение ladik
-
- 38 Ответы
- 13307 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 2 Ответы
- 271 Просмотры
-
Последнее сообщение Optoelectronics
-
- 4 Ответы
- 1670 Просмотры
-
Последнее сообщение Borjomy_1