1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
||||||
1 | ||||||
Программа для связи с устройством через СОМ порт.Фиаско(11.10.2017, 11:11. Показов 4595. Ответов 33
Метки serialport (Все метки)
Друзья, всем добрый день. Решил написать программу для передачи и приема данных через СОМ порт. Писал всё с нуля не зная ни языка ни среды разработки. В итоге сделал небольшую программу, которая подключается к СОМ порту передает и принимает определенные пакеты данных по UART. Все было хорошо, программа работала и с терминальной программой через виртуальные СОМ порты и в симуляторе PROTEUS, передавало и принимало все правильно и то что нужно...пока не решил опробовать обмен данных с железом. Итак, подключил к компу Arduino, который использовал чисто как переходник USB-UART, настроил нужную скорость и количество байт данных. Для уверенности закольцевал RX и TX Arduino, послал данные через терминал, все отправляется и передается как надо. Подключаю свое устройство к UART, посылаю в него пакет из обычного терминала, все в порядке, прием и отправка работают как надо, все совпадает. Теперь запускаю свою написанную программу, нажимаю кнопку соединения ииии.... ничего не происходит((((
Чего я только не пробовал, и менял кодировку в свойстве SerialPort.Encoding, и задавал различные величины для SerialPort.WriteTimeout/ReadTimeout, и делал задержку в процедуре отправки и приема байт. Самое интересное, что с устройства данные приходят, это я понял, когда в PROTEUS подключил симулятор терминала в режиме прослушки. И я так понял, что пакет до устройства доходит, и с него же приходит, но в моей программе по каким-то причинам не срабатывает событие SerialPot_DataReceived. Может кто-нибудь подскажет, в какую сторону копать??? Прилагаю файлы проекта целиком в архиве. Ну и код для кучи сюда выложу.
0
|
11.10.2017, 11:11 | |
Ответы с готовыми решениями:
33
Как запустить купюроприемник для теста через сом порт ? Можно ли через VB организовать связь (через паралельный порт) с отдельным устройством? управление через СОМ порт Как управлять устройством через com-порт? |
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
12.10.2017, 00:38 [ТС] | 2 |
Нашёл я причину, моя программа заработала через эмуляцию порта (использовал Virtual Serial Port Emulator), а вот напрямую если к порту подключать, то не работает, как сделать чтобы программа работала напрямую с портом?
Добавлено через 8 минут Так же возможная причина кроется в том что устройство соединено посредством USB COM порта. Через СОМ порт на материнской плате ещё не пробовал.
0
|
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
|
|
17.10.2017, 20:33 | 3 |
Я с COM-портом начинал извращения с установки точки останова на событии приема данных, и уже детально смотрел - что конкретно пришло и какой длинны. Насколько я успел понять - ваша программа принимает сообщения только вполне конкретной длины - 16 или 24, а вот варианта для, например 20 - у вас не предусмотрено. А сообщения в буфер чтения прибывают словно Почтой России - не разуми когда и в какой форме. Поэтому вы легко можете получить, например, сначала первые 10 байт в буфер, а вторым вызовом - оставшиеся 6. Ваш код под такую ситуацию не заточен!
Добавлено через 46 секунд Это врядли.
0
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
17.10.2017, 21:52 [ТС] | 4 |
Да, всё верно, пакеты принимаются либо 16 либо 24 байта, что интересно, я использую метод чтения определенного количества байт
как при этом может прийти разное количество байт по времени? Да и входной и выходной буферы настроены на 24 байта.
0
|
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
|
|
17.10.2017, 22:52 | 5 |
Легко. Я в свой практике сталкивался с такой же проблемой.
Как принимаются пакеты - вы, я думаю, сказать не можете, так как не совсем понятно, в какой момент возникает событие приема данных. Возможно, оно связано с дискретизацией времени. Ну это я, есессно, предполагаю. В моей практике, при работе с реальным железом, событие приема данных возникало скажем так хаотично, и в буфере могла содержаться информации от двух сообщений. Например: железо отправляет мессагу в 16 байт. А обработчик события сначала перехватывает 10, а потом 6. Вот вам и пук в лужу. На буржуйских форумах рекомендуют записывать принятые сообщения в отдельную переменную (али массив), а потом его парсить требуемым образом, основываясь на маркере конца сообщения. Соответственно, из переменной прочитанные данные изымаются. Вот как то так.
0
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
17.10.2017, 23:02 [ТС] | 6 |
А может в этом помочь свойство SerialPort.ReceivedBytesThreshold?
0
|
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
|
|
17.10.2017, 23:21 | 7 |
Вероятно. Попробуйте. Нужно проверить этот подход при передачи большого количества пакетов. Главное - чтобы ничего не пропало)))
Добавлено через 4 минуты В моем случае такой подход был не шибко хорош, так как длина принимаемого сообщения зависела от переданной информации. В общем, намаялся я знатно тогда. Обидно, что код где-то посеял...только принципы в башке остались.
1
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
27.10.2017, 15:59 [ТС] | 8 |
Поправил немного прошивку в устройстве для отладки. Теперь устройство отправляет ровно то, что оно приняло. В итоге количество отправленных и принятых байт совпадает, но значения различаются. В общем пробовал разные методы, но что-то мне подсказывает, что дело либо в кодировке, либо в драйвере Arduino. Моя программа отлично работает, если создать виртуальный СОМ порт и работать через него. Количество и значения полностью совпадают. Но вот напрямую с USB-COM драйвером работать не хочет. Подскажите, в какую сторону двигаться?
0
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
27.10.2017, 21:40 [ТС] | 10 |
Всё одинаковое, скорость, количество бит, четность, стоп бит
Добавлено через 2 часа 7 минут Отправляю в порт 24 байта со значением "0" а получаю вот это: FE FF FF FE 00 00 00 06 06 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 0A 09 06 06 00
0
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
27.10.2017, 22:59 [ТС] | 12 |
Rius, смотрите первый пост.
Добавлено через 6 минут Отправляю данные через Terminal by Bray, данные передает корректно, даже без эмуляции СОМ порта. Добавлено через 9 минут Жду пока придет конвертер USB COM, протестирую на нем, отпишусь.
0
|
27.10.2017, 23:04 | 13 |
Попробуйте записывать методом Write.
И сразу считывать ответ методом Read. С указанием размера буфера, заведомо превышающего пакет. И с таймаутом чтения, с запасом. Не по теме: Могу показать код, но на другом языке.
0
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
28.10.2017, 01:03 [ТС] | 14 |
Всем откликнувшимся спасибо за помощь, немного покопавшись в коде для микроконтроллера нашел ошибку)))Теперь всё отправляет и принимает без ошибок.
0
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
30.10.2017, 00:43 [ТС] | 16 |
Замабувараев, Ошибка была в том что устройство посылало неправильные данные в порт. Поэтому всегда проверяйте прошивку на возможные штатные и нештатные режимы работы. К примеру в моём устройстве, если отправить в пакете неверный адрес, то программа считает неправильную строку из RAM и отправит её в порт, поэтому я видел не то, что нужно.
1
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
||||||
03.11.2017, 23:57 [ТС] | 17 | |||||
Всем добрый вечер! Снова возникают вопросы в решении проблем)) Итак, на этот раз хотел бы узнать имеет ли право на жизнь такая реализация кода: в теле одной процедуры вызывается другая процедура? У меня в теле процедуры SerialPort1_DataReceived_1 вызывается процедура Read_write_Click при определенном условии? Оно вроде работает, но как-то с прерываниями, на процедуру Read_write_Click переходит не с первого раза. А еще иногда ругается System.IO.IOException в этом месте: SerialPort1.Read(Buf, 0, 24) "Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения." & vbCrLf при попытке записать в порт
0
|
1 / 1 / 0
Регистрация: 03.07.2017
Сообщений: 23
|
|
04.11.2017, 10:50 [ТС] | 19 |
Rius, Как тогда реализовать вызов подпрограммы сразу по завершении предыдущей? Где можно почитать информацию о методах вызова?
0
|
04.11.2017, 11:42 | 20 |
Вам это никак не поможет. Стоит пересмотреть работу с SerialPort.
У вас обмен идёт в формате запрос-ответ?
0
|
04.11.2017, 11:42 | |
04.11.2017, 11:42 | |
Помогаю со студенческими работами здесь
20
Взаимодействие с устройством через usb порт Обмен данными с устройством через com-порт Общение с внешним устройством через COM-порт Программа для роботы с устройством через RS-232 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |