|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
|
|
SerialPort в C#12.10.2011, 08:18. Показов 40959. Ответов 40
Метки нет (Все метки)
Ребята помогите с несколькими примерами обработки входящих данных на COM port. просмотрел кучу разных примеров в гугле и так не понял не чего. Меня интересует как можно обработать массив данных поступающих на порт используя WinForm b serialport.read(byte), serialport.read(char), На порт приходят данные в таком формате с0 23 45 65 78 23 56 с1
0
|
|
| 12.10.2011, 08:18 | |
|
Ответы с готовыми решениями:
40
Serialport.write и serialport.basestream.write - в чем разница Работа с SerialPort SerialPort и GPS |
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 12.10.2011, 10:28 | ||
|
Считывается очень просто: 1. Создается объект System.IO.Ports.SerialPort 2. Вызывается метод Read(), которому передается буффер типа byte[]. Метод возвращает количество считанных в буффер байт 3. Обрабатывается буффер. Для конкретных примеров надо понять, чего вы хотите добиться.
0
|
||
|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
|
|
| 12.10.2011, 11:49 [ТС] | |
|
kolorotur, хотелось бы примеры как именно обрабатывать данные то есть конвертировать в разные форматы и выводить в TextBox
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 12.10.2011, 11:53 | |||
|
0
|
|||
|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
|
|
| 12.10.2011, 12:40 [ТС] | |
|
kolorotur, контролер отправляет символьный код выглядит он вот так признак старта это символ
! потом в десятичном формате идут данные 10 23 34 простые данные и конец пакета это символ ? как это все разобрать на части каким конвертерами пользоваться и если не сложно можно примеры как для winform так и для console
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 12.10.2011, 12:48 | ||
|
Еще раз: какой протокол пытаетесь реализовать?
0
|
||
|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
|
|
| 12.10.2011, 13:13 [ТС] | |
|
kolorotur, Это свой протокол у меня контролер PIC он шлет данные кусок примера из контролера
var x,y,z byte x=10 y=23 z=34 SerOut("!",x,y,z,"?") Вот это надо принять и вывести в человеческий вид.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||
| 12.10.2011, 13:37 | |||||||
|
Перво-наперво, совет: не используйте последний байт сообщения как символ окончания этого сообщения. Передаваться ваш вопросительный знак будет все равно как байт, а как отличить - это очередное число в сообщении или окончание сообщения? Знак "?" в таблице ASCII имеет порядковый номер 63. То есть принимающая сторона будет строить сообщение, пока не наткнется на число 63, которое символизирует окончание сообщения. Будет весело, если y=63, например. Чтобы избежать этих веселостей, либо используйте фиксированную длину сообщений, либо формат сообщения должен быть такой: [sync] [length] [data] [checksum] где sync - один синхронизирующий байт, указывающий на начало сообщения. length - длина сообщения (если длина может быть больше, чем 256 байт, то используйте для этих целей 2, 3, 4 и т.д байт. Но - всегда) data - следующие n байт, указанные в предыдущей части сообщения. При этом надо определить интервал возможных значений и отсылать определенное количество байт для каждого значения. checksum - контрольная сумма для проверки правильности данных, т.к. могут быть ошибки при передаче. Алгоритмов много, например two's compliment или CRC. То есть сначала проектируем протокол, потом пишем его реализацию. Если у вас всегда передаются только три числа со значениями от 0 до 255, то все просто:
2
|
|||||||
|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
|
|
| 12.10.2011, 14:03 [ТС] | |
|
kolorotur, Возникает тогда другой вопрос если на порт контролера отправлять строку с данными в формате стринг и принимать его как строку на сколько я помню в работе со строкой есть вариант поиска части строки разделенные символами и уже по маске вытаскивать данные. Принимать методом ReadExisting(). Как вы думайте такой вариант как.
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 12.10.2011, 15:02 | |
|
Нормальный вариант, если не заботит размер передаваемых данных и быстродействие не критично.
0
|
|
|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
|
||
| 12.10.2011, 15:16 [ТС] | ||
|
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 12.10.2011, 15:33 | |
|
Тогда полный вперед - разбивайте строку на байты через Encoding.GetBytes и отсылайте через серийный порт.
На другом конце собирайте байты снова в строку через Encoding.GetString
0
|
|
|
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
|
|
| 12.10.2011, 15:36 [ТС] | |
|
kolorotur, А можно пример Encoding?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 12.10.2011, 15:39 | ||||||
1
|
||||||
|
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 41
|
||||||
| 13.01.2016, 10:05 | ||||||
|
Вопрос по теме. Я пишу загрузчик для заливки прошивки в МК AVR. Протокол AVR109. Вот функция для подключения к загрузчику в МК. Данная функция вызывается после открытия порта.
0
|
||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 13.01.2016, 11:11 | |
|
gurvinok, какая кодировка установлена в SerialPort? Смущает, что вы считываете в массив char, каждый элемент которого по 2 байта, а AVR — однобайтовый протокол.
Так же посмотрите на все места, где у вас идет вызов метода Read: нигде не проверяется возвращаемое значение, которое указывает на фактическое количество байт/символов, считанное с порта. Это значение может быть меньше чем размер буфера и даже меньше, чем размер отправляемого устройством пакета, т.к. нуль-модем передает данные намного медленнее, чем ЦП их считывает. Вам надо вызывать метод Read в цикле с соответствующими сдвигами до тех пор, пока не будет полностью считано нужное количество байт/символов.
0
|
|
|
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 41
|
||
| 13.01.2016, 13:40 | ||
0
|
||
|
|
|||||||
| 13.01.2016, 14:00 | |||||||
И да, я вижу, что у вас все в одной форме. Это не верно. Инкапсулируйте всю работу с мк в отдельном классе. Так будет удобнее, да и на будущее может упростить жизнь.
0
|
|||||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 13.01.2016, 14:06 | ||||||
|
Больше скажу: при реализации протокола с максимальным размером сообщения 256 байт и скоростью 38400, сообщения все равно приходится считывать в несколько заходов, т.к. из буфера их считать быстрее, чем со шнура. ![]() Это не к тому, что студия не содержит багов, а к тому, что начинать поиск проблемы нужно с собственной реализации. 1. Настройки порта с обеих сторон шнура. 2. Кодировку порта, которую вы устанавливаете в коде. 3. Количество считанных символов ответа. 4. Количество потоков, работающих одновременно с портом. Попробуйте работу с символами заменить на работу с байтами — при 8-битном протоколе это делается элементарно, но зато отпадают возможные косяки с кодировкой. Если ничего не помогает, набросайте на коленке эмулятор устройства, который принимает и отвечает на проблемную команду и подсоединитесь к нему через виртуальную пару. Ну или подцепите куда-нибудь проект с примером отсылаемого сообщения и ожидаемого ответа — я проверю. Добавлено через 3 минуты gurvinok, вдогонку: у вас есть спецификация протокола? Можно глянуть? Гуглеж по AVR109 выдает ссылку на вот это: http://www.atmel.com/images/doc1644.pdf Оно?
0
|
||||||
|
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 41
|
|||||||
| 13.01.2016, 14:13 | |||||||
|
kolorotur Сделал по Вашему варианту. Теперь вообще ничего не приходит.
0
|
|||||||
| 13.01.2016, 14:13 | |
|
Помогаю со студенческими работами здесь
20
Serialport - Readline
Считывание SerialPort
serialPort, форма и потоки Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|