Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/194: Рейтинг темы: голосов - 194, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10

SerialPort в C#

12.10.2011, 08:18. Показов 41320. Ответов 40
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята помогите с несколькими примерами обработки входящих данных на COM port. просмотрел кучу разных примеров в гугле и так не понял не чего. Меня интересует как можно обработать массив данных поступающих на порт используя WinForm b serialport.read(byte), serialport.read(char), На порт приходят данные в таком формате с0 23 45 65 78 23 56 с1
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.10.2011, 08:18
Ответы с готовыми решениями:

Serialport.write и serialport.basestream.write - в чем разница
в чем разница между следующими способами отправки данных на ком-порт?: serPort.BaseStream.Write(data,0,datalen); ...

Работа с SerialPort
Коллеги, добрый день! Есть проблема с работой COM порта. Нижеуказанный код компилируется без ошибок, порт открывает норм, но почему-то...

SerialPort и GPS
На автомобильном навигаторе с о.с. Windows CE на COM1 сидит GPS приемник. программу тестирую сразу на нем. проблемы возникают при обращении...

40
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.01.2016, 14:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kolorotur Посмотреть сообщение
сообщения все равно приходится считывать в несколько заходов, т.к. из буфера их считать быстрее, чем со шнура.
Поддерживаю. И добавлю, что последовательный порт - довольно тормозная штука. Не факт, что все ожидаемые для чтения байты попадут в буфер порта сразу же.
gurvinok, посмотрите мой код выше, а именно как организовано чтение. При каждом вызове метода чтения в него передается параметр - количество ожидаемых байт (мы же знаем протокол, и значит это число должно быть известно). А внутри метода крутим цикл с проверкой количества доступных байт в буфере порта. Как только буфер заполнился - читаем все байты.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 14:16
Цитата Сообщение от gurvinok Посмотреть сообщение
Теперь вообще ничего не приходит.
Вы на каждой итерации перезаписываете начало буфера.
Ожидаемый ответ ровно 20 байтов?
Попробуйте так:
C#
1
2
3
4
byte[] b = new byte[20];
int read = 0;
while (read < b.Length)
   read += serialPort1.Read(b, read, b.Length - read);
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.01.2016, 14:23
Цитата Сообщение от kolorotur Посмотреть сообщение
Ожидаемый ответ ровно 20 байтов?
kolorotur, так если в буфере точно столько сколько надо, можно просто в метод Read() передать массив и сразу все считать.
Типа того.
C#
1
2
byte[] data=new byte[20];
port.Read(data, 0, data.Length);
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 14:40
Цитата Сообщение от insite2012 Посмотреть сообщение
так если в буфере точно столько сколько надо, можно просто в метод Read() передать массив и сразу все считать.
Можно, если предположить, что на момент считывания все данные будут уже лежать в буфере, а не плестись по шнуру.
Тут зависит от подхода: если делать как вы — крутить ожидание пока BytesToRead не получит нужно значение и потом махом считать — да, такой подход оправдан.
А если начинать считывать ответ сразу после отправки сообщения, как это сделано у ТС, то Read считает то, что лежит в буфере на момент вызова и вернет количество считанных байт/символов. Если сообщение пришло еще не все, то на выходе вы получите его кусок.

Возможно, вкусовщина, но лично я не люблю активный опрос порта на наличие всех данных — мне это напоминает нетерпеливых детей на заднем сиденье автомобиля: "Ну что, приехали? А сейчас приехали? Ну когдаааа уже?!"
Предпочитаю блокировать поток ровно настолько, насколько это нужно.
0
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 43
13.01.2016, 14:49
Так у меня с самого начало так и было сделано.
C#
1
2
byte[] data=new byte[20];
port.Read(data, 0, data.Length);
С первого раза читает все байта, а дальше только первый.

Добавлено через 6 минут
И еще вопрос, insite2012 как такое возможно byte[] data = new byte[readCount]; ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 14:50
Цитата Сообщение от gurvinok Посмотреть сообщение
С первого раза читает все байта, а дальше только первый.
Вот и я о том же.
0
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 43
13.01.2016, 14:58
Не должно такого быть. Данная функция не закончит работу пока все не заберет в буфер, либо не закончится таймаут. Вот выписка из определения самой студии.

// Сводка:
// Считывает из входного буфера System.IO.Ports.SerialPort определенное число
// байтов и записывает их в байтовый массив, начиная с указанной позиции.
//
// Параметры:
// buffer:
// Массив байтов, в который записываются входные данные.
//
// offset:
// Смещение в буферном массиве, с которого начинается запись.
//
// count:
// Количество байтов, чтение которых необходимо выполнить.
//
// Возвращает:
// Число прочитанных байтов.

Должна все прочитать.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 15:05
Цитата Сообщение от gurvinok Посмотреть сообщение
Не должно такого быть.
*Вздыхает* И откуда у людей столько недоверия берется...
Документация того же метода, но в оригинале:
Parameters
buffer
Type: System.Byte[]
The byte array to write the input to.

offset
Type: System.Int32
The offset in buffer at which to write the bytes.

count
Type: System.Int32
The maximum number of bytes to read. Fewer bytes are read if count is greater than the number of bytes in the input buffer.

Return Value
Type: System.Int32
The number of bytes read.
Полужирным выделено мной.

Попробуйте сделать как я предложил — что вам мешает? Вирус вы не подхватите, комп не отформатируется.
0
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 43
13.01.2016, 15:10
Ну у меня всегда размер буфера больше чем принимаемые данные. Вашим методом пробовал, вообще ничего не приходит.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.01.2016, 15:13
Цитата Сообщение от gurvinok Посмотреть сообщение
как такое возможно byte[] data = new byte[readCount]; ?
В смысле? Просто создаем массив с известным размером...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 15:17
Цитата Сообщение от gurvinok Посмотреть сообщение
Вашим методом пробовал, вообще ничего не приходит.
Вы внесли исправление в ваш цикл?
Только если у вас размер буфера больше, то нужно считывать не пока read < b.Length, а пока он меньше размера ожидаемого ответа.
Я у вас об этом спрашивал, но вы не ответили.
0
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 43
13.01.2016, 15:18
Как это известного размера? readCount передается функции как аргумент. А откуда компилятор тогда узнает что и сколько передастся функции.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 15:21
Цитата Сообщение от gurvinok Посмотреть сообщение
А откуда компилятор тогда узнает что и сколько передастся функции.
Память под массив выделяется при выполнении программы, когда все значения известны.
Если вы с сей на шарп пересели, то new byte[readCount] аналогичен этому:
C
1
byte* b = (byte*)malloc(readCount * sizeof(byte));
Разумеется, в сях не byte, но суть та же.
0
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 43
13.01.2016, 15:24
Я даже data.Length заменил на числа, так как я точно знаю что мне придет 3 байта. Ничего не принимает, а вот так
C#
1
2
byte[] data=new byte[16];
port.Read(data, 0, 3);
Три байта принимает, но один раз.

Добавлено через 2 минуты
Цитата Сообщение от kolorotur Посмотреть сообщение
Если вы с сей на шарп пересели, то new byte[readCount] аналогичен этому:
Это хорошая новость.))) Мне как раз нужно будет массив собирать для передачи прошивки, это как раз то что надо.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 15:26
gurvinok, повторюсь, а то вдруг среди других ответов затерялось:

Цитата Сообщение от kolorotur Посмотреть сообщение
Проверьте:
1. Настройки порта с обеих сторон шнура.
2. Кодировку порта, которую вы устанавливаете в коде.
3. Количество считанных символов ответа.
4. Количество потоков, работающих одновременно с портом.
Попробуйте работу с символами заменить на работу с байтами — при 8-битном протоколе это делается элементарно, но зато отпадают возможные косяки с кодировкой.
Если ничего не помогает, набросайте на коленке эмулятор устройства, который принимает и отвечает на проблемную команду и подсоединитесь к нему через виртуальную пару.
Ну или подцепите куда-нибудь проект с примером отсылаемого сообщения и ожидаемого ответа — я проверю.
Добавлено через 3 минуты
gurvinok, вдогонку: у вас есть спецификация протокола? Можно глянуть?
Гуглеж по AVR109 выдает ссылку на вот это: http://www.atmel.com/images/doc1644.pdf
Оно?
Особенно интересует последняя часть про спецификацию. Чтобы имелась возможность ознакомиться и говорить предметно.
0
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 43
13.01.2016, 15:35
Именно этот протокол. Вот мое вольное описание его.
Протокол AVR109 фирмы Atmel.docx
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 15:38
gurvinok, спасибо, сейчас ознакомлюсь.
0
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 43
13.01.2016, 22:56
Веселье продолжается. Заставил порт принимать от МК данные, но теперь возникла следующая проблема. Если МК передает 1 байт, то ПК принимает его как надо, а если больше 1 байта, то ПК принимает со второго байта, а первого как-будто и не было. Вот накидал простой проектик. Открывает порт и посылает команду, а МК шлет ответ. Посмотрите если не лень.
Вложения
Тип файла: rar AVR8BOOT_test.rar (41.3 Кб, 25 просмотров)
0
0 / 0 / 1
Регистрация: 29.05.2015
Сообщений: 23
03.04.2018, 14:58
Добрый день!
хочу отправить массив
через SerialPort C#
написал программку , как рекомендуют по этой теме
но данные из порта не выходят
вопрос - почему?
........................................ ...............

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
System.IO.Ports.SerialPort SerialPort3;
    
    String name = ((string)ComPorts_comboBox.SelectedItem);
    byte nn = {3A, 30, 31, 31, 30,30,30,33,32,30,30,30,31,30,32,30,30,38,38,33,32,0D,0A };
 
    // byte nn = { 3A,30,31,31,30,30,30,33,32,30,30,30,31,42,43,0D,0A };
        serialPort3.PortName = "COM3"; //Указываем наш порт - в данном случае COM3.
        serialPort3.BaudRate = 9600; //указываем скорость.
        serialPort3.DataBits = 8; 
        serialPort3.Open(); //Открываем порт.
 
 
    //Serial = new SerialPort(COM3, 9600, System.IO.Ports.Parity.None, 8, StopBits.One);
   //  Serial.Open(); 
    for (int z = 0; z< 23;z++)
            {
    SeriaPort3.Write(byte nn[z] Buffer, int offset, int count);
    }
    SeriaPort3.Close();
0
0 / 0 / 1
Регистрация: 29.05.2015
Сообщений: 23
04.04.2018, 10:00
мимоходом-мимолетом создал
работающую форму, которая исправно посылает и принимает то, что записал в поле на экране
но как ее превратить в .EXE -файл ?
Вложения
Тип файла: zip serialPort (COMPORT).zip (205.5 Кб, 33 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.04.2018, 10:00

Serialport - Readline
Добрый день. Возникла глупая проблема, но не могу решить, не владею c# в нужной мере. Нужно прочитать строки с COM порта. код: ...

C# + CDC (SerialPort )
при обмене посылками запрос ответ все нормально обмен идет стабильно, но если на запрос отправляют 100 или 200 посылок(размер...

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

Отправка массива в serialPort
Здравствуйте, подскажите пожалуйста. Программа создаёт int mas01={82,164,73,146,37,74,148,41} и мне это массив надо отправить в serialPort,...

serialPort, форма и потоки
Допустим, на форме имеется label и к проекту прикручен стандртный компонент &quot;serialPort&quot; По приему байта пытаемся изменить текст...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru