Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум Picbasic.ru » Программирование на ПК » Программирование на Basic » VB 2010: COM порт (Проблема при приеме информации с COM порт)
VB 2010: COM порт
DAlexV Дата: Вт, 10.06.2014, 21:07  |                                                                                                                Сообщение # 16
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата MiXaS ()
Оказалось, что до значения 128($80) все работает как часы, а вот выше 128 и выше приходят вопросы, что делать???? Тут явно visual basic троит, дальше то русские символы должны быть, если учесть ascii. Товарищи знатоки, подскажите в чем соль?!
Солит тут кодировка. А именно кодовая страница (по дефолту UniCode стоит). Решается либо изменением страницы в свойствах пректа или строчкой типа mySerialPort.Encoding = Encoding.GetEncoding(28591). Насчет 100% правильности не уверен, но вот еще в помощь:
http://msdn.microsoft.com/ru-ru....ippet-2
http://www.avrfreaks.net/index.p....=106722 (последний пост)
http://blogs.msdn.com/b/bclteam/archive/2006/05/26/608377.aspx

Успехов wink
MiXaS Дата: Ср, 11.06.2014, 15:52  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Спасибо! И откуда Вы все знаете, Алексей?? Я вчера полдня искал на майкрософте подобное, но без результата, пришлось здесь задать вопрос и на cyber. Там вообще глухарь, никто не знает что ли?! Или не хотят отвечать. Я там с таким вопросом был не один, но тому чуваку тоже не дали дельного совета.
Я подозревал что с кодировкой беда, но не знал как исправить, благодаря Вашим ссылкам, нашел метод для устранения проблемы, только у меня заработала кодировка Windows-1251.

SerialPort1.Encoding = System.Text.Encoding.GetEncoding("Windows-1251") Вот эта срока при инициализации порта очень помогла.
Спасибо!!!

Добавлено (11.06.2014, 15:52)
---------------------------------------------

Цитата MiXaS ()
Когда основной код не большой, скажем просто вывести на LCD 2 строки(смотрю что прилетело в порт), то тут происходит самое интересное. То данные не все прилетают, то часть теряется, то не могу отправить в порт обратно (Hserout или TXREG = ни то ни то не работает), пока не поставлю задержку в 15-100 мс сек в основном коде.


Частично решил и эту проблему:

В 18f2550 есть такая фишка! Стоит кварц на 20 МГц, и настройки такие:

PLLDIV = 5
FOSC = HSPLL_HS

но Xtal = 48

В итоге (непонимаю как) компилятор настраивается и работает на 48МГц. Эту фишку я заметил еще при работе с аппаратным USB, когда плагин сгенерил мне код для связи PIC и Visual Basic.

мало того, мне же пришлось и EUSART настроить на 48МГц, настроил и работает прелесно! Даже на скорости 115200 бод.
anatol Дата: Чт, 12.06.2014, 19:58  |                                                                                                                Сообщение # 18
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

Цитата MiXaS ()
но Xtal = 48
Но это не физический кварц (с PLL естественно), а только число для расчета таймингов в компиляторе.
EUSART и USB физические устройства. Наверно отсюда и непонятки возникают?
MiXaS Дата: Вс, 09.11.2014, 02:07  |                                                                                                                Сообщение # 19
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

anatol, я бы с Вами согласился, если бы не одно НО. Настройки еусарт я брал с рачетом, что физический кварц 48МГц, и скорость ему задал 115200. прием и передача данных без ошибок. на 20 мегагерцовом кварце максимум получалось получить и принять без ошибок38400, с ошибками работала скорость 54800.

Добавлено (09.11.2014, 02:07)
---------------------------------------------
Господа! Еще вопрос назрел. Как правильно принят данные с компорта?

Я делал это 2-мя способами и все-равно не нравится.

Первый способ: посылаю запрос (modbus), затем жду

Application.DoEvents()
Threading.Thread.Sleep(30)

После читаю что пришло.

Потом решил использовать событие по приему данных

SerialPort1.ReceivedBytesThreshold = 12 указываю кол-во байт для появления события SerialPort1_DataReceived

Оба способа работают, но иногда сбоят. Приходится делать много повторов с запросами. Кто как принимает данные с компа? Спасибо!

AndrF Дата: Чт, 22.01.2015, 11:09  |                                                                                                                Сообщение # 20
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Кварц обычно у меня стоит на 16. Обмен с компом всегда идет без проблем на 115200.

Но, как я понимаю, проблемы у людей совсем не в кварце - данные порта просто идут пачками. Грубо говоря c одной стороны посылается, к примеру, 32 байта, А на другой стороне, опять же к примеру, за раз может считаться 20, а потом еще 12... Вот это и надо, собственно, обрабатывать. А то посылают 32 байта и хотят их же за раз получить, а оно не выходит...
anatol Дата: Вс, 25.01.2015, 10:12  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

AndrF, Com port, в операционных системах выше Милениума физически недоступен, а соответственно и передача идет кусками. В соответствии с распределением времени заданном операционкой. Для нас - по случайному закону. Для правильной работы выставляются флаги ожидания (дополнительные пины порта). Линий у порта (в урезанном варианте) = 9.
MiXaS, в даташите на контроллер есть глава (может есть и эррата) посвященная асихронному порту. В ней есть таблицы ошибок при разных скоростях и кварцах.
Коротко - без ошибок будет передано сообщение с кварцем частотой равной скорости передачи на двойку в степени. (20 000 000:4) : 115 200 = 43,403. На 2 в степени не похоже.
ЯНДЕКС Дата: 25.01.2015
MiXaS Дата: Вс, 25.01.2015, 10:36  |                                                                                                                Сообщение # 22
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

anatol,  пользовался программой для подбора picmiltical, вроде, называется. Нужно оговориться, что я использовал eusart на этом кварце при этой скорости, usart при таких параметрах, естественно, не заработал. Сейчас все подобрал, чтобы было как можно меньше % ошибки.
Тут вопрос не в железе, так как я мониторил порт. И при запросах ответы летят правильные и вовремя. Я даже использовал заводские модули модбас, результат тот же. Т.е. все работает, но иногда не с первого раза. Объясню, понять все ли пришло помогает двухбайтная контрольная сумма.Когда она совпадает, тогда все ок, если она не совпадает, идет повторный запрос до тех пор пока либо не выйдет максимальное кол–во запросов, либо пока не примет, а счетчик отображает кол–во попыток. Так вот, бывает 1 попытка=1 успешный прием, а бывает и за 3 попытки не может принять, хотя монитор порта говорит, что железка отправила все верно. Создается такое впечатление, что виндовое приложение не все байты хватает.
anatol Дата: Вс, 25.01.2015, 20:37  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

MiXaS, попытаюсь пояснить про структуру обмена.
Если вы написали программу обмена для приемника и передатчика на обоих сторонах - это не имеет никакого отношения к порту (COM).
При соединении с стандартным портом необходимы ( при двухстороннем обмене) 4 провода
-TxD - данные, передаваемые компьютером в последовательном коде (логика отрицательная).
-RxD - данные, принимаемые компьютером в последовательном коде (логика отрицательная).
RTS - сигнал запроса передачи. Активен во все время передачи.
CTS - сигнал сброса (очистки) для передачи. Активен во все время передачи. Говорит о готовности приемника.
Это отсюда.
Сигнал RTS  - выставляет приемник, сообщая передатчику на другой стороне, что готов к приему данных. Если начать передачу раньше или позже = сбой при соблюдении всех прочих условий. А "виндовое приложение" допускается "виндой" по приоритетам и другой трихомудии операционной системы.
Грубо говоря это приоритетная синхронизация.
В физическом порту есть еще много нюансов. Посмотри даже здесь.

Сообщение отредактировал anatol - Вс, 25.01.2015, 20:39
MiXaS Дата: Вс, 25.01.2015, 20:55  |                                                                                                                Сообщение # 24
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

anatol,  спасибо, я примерно, так и представлял себе картину. Использовать еще 2 ноги не охота, да и нет возможности. У меня все работает, только вот был вопрос, на который Вы ответили.
DAlexV Дата: Пн, 26.01.2015, 01:34  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Усем Прювет !!!! Давно не заглядывал. Смотрю проблему так и не решили. Давайте попробую помочь.
Цитата MiXaS ()
В 18f2550 есть такая фишка! Стоит кварц на 20 МГц, и настройки такие:
Почему 48 ???? Да данная частота нужна для аппаратного контроллера USB. Данное условие так же справедливо для STM контроллеров с USB на борту. А проверить на какой частоте работает контроллер достаточно просто. Запускаем таймер на переполнение каждые 100мс например, внутри прерывания просто передергиваем любую лапу проца. PortB.4=not PortB.4. Тыкаемся в порт осцилографом и смотрим правильно ли свормирован импульс. Если не совпадает, меняем настройки таймера на другую частоту.
Что какаемо PLL
Цитата anatol ()
Но это не физический кварц (с PLL естественно), а только число для расчета таймингов в компиляторе.
Нет. Не верно. Читаем мануал anatol. Это умножитель который используется для умножения тактовой частоты. В 18 линейки при включении PLL тактовая * 4. То  есть физичесий кварц 10мгц а частота будет 40мгц. В STM еще прикольнее. Там c помощью PLL можно из 8мгц кварца высосать больше 100мгц. Но это в другой серии.
Теперь про обмен между железом и VB. То же решил добраться до VS2008.
Цитата MiXaS ()
Господа! Еще вопрос назрел. Как правильно принят данные с компорта? Я делал это 2-мя способами и все-равно не нравится. Первый способ: посылаю запрос (modbus), затем жду Application.DoEvents() Threading.Thread.Sleep(30) После читаю что пришло. Потом решил использовать событие по приему данных SerialPort1.ReceivedBytesThreshold = 12 указываю кол-во байт для появления события SerialPort1_DataReceived Оба способа работают, но иногда сбоят. Приходится делать много повторов с запросами. Кто как принимает данные с компа? Спасибо!
Тут вопрос не в железе, так как я мониторил порт. И при запросах ответы летят правильные и вовремя. Я даже использовал заводские модули модбас, результат тот же. Т.е. все работает, но иногда не с первого раза. Объясню, понять все ли пришло помогает двухбайтная контрольная сумма.Когда она совпадает, тогда все ок, если она не совпадает, идет повторный запрос до тех пор пока либо не выйдет максимальное кол–во запросов, либо пока не примет, а счетчик отображает кол–во попыток. Так вот, бывает 1 попытка=1 успешный прием, а бывает и за 3 попытки не может принять, хотя монитор порта говорит, что железка отправила все верно. Создается такое впечатление, что виндовое приложение не все байты хватает.
Под VB 2010 я подозреваю что кроется Basic for Visual Studio 2010. Чего то я просто Барсика 2010 я не видел. Первое и главное для корректного приема компом это слитная отправка со стороны железа. Если идет прерывание в момент отправки, то комп может не корректно их воспринять(есть там ReadTimeout или что то подобное). Как выход - организация отправки через аппаратное прерывание USART( TXIF и TRMT ). Так же и прием через прерывание ( RCIF ).
что касаемо приема от железа. Код бум рассматривать на VS2008(не думаю что будут сильные отличия от VS2010). Я использую таймер на 50-500мс например. В нем проверяю флаг наличия новых данных(ReciveNew = True) , запускаю проверку, преобразование, и т.д. И естественно событие SerialPort1_DataReceived. Оно происходит в конце  принятия всего пакета данных.
Код
' принимаем данные: ReciveLen - длинна посылки, RdBuff - приемный буфер  
  Private Sub CPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles CPort.DataReceived

   If CPort.IsOpen = True Then
ReciveLen = CPort.BytesToRead
CPort.Read(RdBuff, 0, CPort.BytesToRead)
ReciveNew = True
   End If
  End Sub
И как правильно мыслит MiXaS, главное правильно организовать последовательность обмена между железом и VB.
Код
Таймер 100мс
  Если есть данные (флаг)
    Преобразовываем данные
    Обновляем данные на экране
    сбрасываем флаг наличия данных

    

L1:
если кол-во переполнений больше чем нужно(нет ответа)
   выставляем запрет на передачу
   выставляем флаг ошибки приема(или обрабатываем ситуацию)  

Отправляем данные VB->PIC.  
Запускаем таймер ожидания ответа.
Если нет ответа при срабатывание таймера
    +1 к счетчику ошибок. Goto L1

Иначе
   Читаем Данные. Вытавляем флаг наличия данных(тут же можно и произвести все операции над      данными)

Вроде в двух словах описал.
Что касемо Аппаратных пинов порта  RTS и CTS предложенных anatol идеальный вариант, абсолюно лишний (не хватает ног в проце, добавление софта на железе, дополнительные преобразователи уровней, и т.д). А с USB CDC (эмуляция СОМ порта) это еще прикольнее решать. Да и вопрос то на самом деле не физике СОМ порта а проблемах приема Софтом компа.

Будут вопросы, задавайте. Успехов  wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
anatol Дата: Пн, 26.01.2015, 09:20  |                                                                                                                Сообщение # 26
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

DAlexV, 
Цитата
Читаем мануал anatol
Полностью согласен. Контроллеру совершенно по барабану как работает и где находится генератор тактовой. PLL можно представить как внешнее устройство. Желание писать поменьше слов и приводит к таким непоняткам.
А вот в плане "железячники" против программистов - экономия на ногах контроллера приводит к непредсказуемым последствиям. И не надо путать возможность работать по двум линиям, с надежностью и достоверностью передачи данных. Тем более что софт на одной стороне писан не нами, а примочки в виде подпрограмм обработки не совсем адекватно работают в системах реального времени. (Никто не наблюдал зависания указателя мышки? А ведь практически тот же последовательный порт.) Можно повысить достоверность передачи многократными повторами передачи данных, введением проверочных и корректирующих кодов, вычислением контрольных сумм. Только зачем. Всего один провод от компа к контроллеру (готов к приему) и половина проблем отвалилась. В принципе подход должен быть индивидуальным в каждом случае.
Насчет кратности частоты кварца (частоты PLL) выбираемым частотам обмена думаю повторять не стоит.

Сообщение отредактировал anatol - Пн, 26.01.2015, 09:20
AndrF Дата: Пн, 26.01.2015, 09:53  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 145
Репутация: 3   ±
Замечания:   ±
На сайте с 03.02.2012

Статус: Offline

Цитата anatol ()
Com port, в операционных системах выше Милениума физически недоступен

Да и не надо.

Цитата anatol ()
а соответственно и передача идет кусками. В соответствии с распределением времени заданном операционкой. Для нас - по случайному закону.

Я об этом и писал.

Цитата anatol ()
Для правильной работы выставляются флаги ожидания (дополнительные пины порта). Линий у порта (в урезанном варианте) = 9.

Мне вполне хватает двух линий. Проверить все ли данные приняты и принять недостающие я могу и программно. С обоих сторон. Каждая посылка у меня содержит свою длину и контрольную сумму. Но ошибок нет... Правда для связи с компом предпочитаю использовать UART<>USB через FT232RL для простоты. А то с железными COM-портами становится все сложнее...
DAlexV Дата: Пн, 26.01.2015, 14:18  |                                                                                                                Сообщение # 28
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата anatol ()
А вот в плане "железячники" против программистов - экономия на ногах контроллера приводит к непредсказуемым последствиям. И не надо путать возможность работать по двум линиям, с надежностью и достоверностью передачи данных. Тем более что софт на одной стороне писан не нами, а примочки в виде подпрограмм обработки не совсем адекватно работают в системах реального времени. (Никто не наблюдал зависания указателя мышки? А ведь практически тот же последовательный порт.)
anatol, я таки извиняюсь. А как тогда работают USB осцилографы, логические анализаторы, и всякие устройства обменивающие устройства в режиме realtime ???? Кроме D+ и D- в USB лишних проводов не наблюдается. Сколько устройств делал для обмена между COM - PC ни когда даже ошибок не было, при условии что Комп нагружен не только разрабатываемым приложением, но и СОМ шпионом, анализатором, VS2008, Рыбой, и т.д. Сейчас добиваю протокол обмена между железом и VS через RS485 на скорости 115200. Все мурлыкает без проблем.

Что же касаемо проблем приема это только неслитная передача со стороны железа. 80% проблем с этим связано.


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
anatol Дата: Пн, 26.01.2015, 15:27  |                                                                                                                Сообщение # 29
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 472
Репутация: 32   ±
Замечания:   ±
На сайте с 10.02.2010

Статус: Offline

DAlexV, я тоже извиняюсь, но какая длина буфера ФИФО у приемопередатчика RS-232 современного компьютера, и какая максимальная длина "послания" отправляемого вашими поделками. И не стоит ли в применяемом контроллере похожий "железный" порт. Некоторые источники говорят что в среднем 64 байта (было время что и 4 радость). И если не превышаете длину есть вероятность все получить правильно. 
Я не против кастрированных портов, однако надо соображать надо, а не сразу в омут головой.

По USB с виртуальными портами - промолчу. Там другая технология - программная = мне незнакомая.
Кстати и в преобразователях COM-USB типа FT232BM, PL-2303 формируются полноценные COMпорты с уровнями ТТЛ.
DAlexV Дата: Пн, 26.01.2015, 15:42  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата anatol ()
DAlexV, я тоже извиняюсь, но какая длина буфера ФИФО у приемопередатчика RS-232 современного компьютера, и какая максимальная длина "послания" отправляемого вашими поделками. И не стоит ли в применяемом контроллере похожий "железный" порт. Некоторые источники говорят что в среднем 64 байта (было время что и 4 радость). И если не превышаете длину есть вероятность все получить правильно.  Я не против кастрированных портов, однако надо соображать надо, а не сразу в омут головой.
Ну коль пошла такая пьянка про FIFO тогда не забываем про DMA который в современных портах разруливает это все на аппаратном уровне(без участия ОС). На самом деле тут вопрос задавался не о теории а о практике. Давайте anatol по делу, а то Наш данный разговор начинаем флудом попахивать.


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
Сообщение отредактировал DAlexV - Вт, 27.01.2015, 09:44
Форум Picbasic.ru » Программирование на ПК » Программирование на Basic » VB 2010: COM порт (Проблема при приеме информации с COM порт)
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск: