Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/26: Рейтинг темы: голосов - 26, средняя оценка - 4.58
2 / 2 / 6
Регистрация: 23.05.2012
Сообщений: 267

Как через serialport принять неизвестное количество байт

23.05.2012, 14:26. Показов 5177. Ответов 23
Метки нет (Все метки)

как через serialport принять неизвестное количество байт
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.05.2012, 14:26
Ответы с готовыми решениями:

Как инициализировать заранее неизвестное количество компонентов?
Всем привет. Собственно возник вопрос: как, используя WindowsForms создать на форме заранее не известное количество компонентов (по типу...

Узнать длину букв (не байт) буфера SerialPort'а
Здраствуйте, поскажите пожалуйста, как узнать длинну букв (не байт) буфера SerialPort'а, в arduino есть функция serial.avaliable —...

Чтение и проверка троек байт с последовательного порта, serialPort.Read()
Доброго времени суток! Буду рад Вашему совету о дальнейшем направлении разработки. Читаю данные с порта. Нужные данные...

23
2 / 2 / 2
Регистрация: 12.10.2011
Сообщений: 44
09.04.2014, 23:01
Я не понимаю, почему Вы так привязались к Портмону и остаткам пакета. Они приходят правильно, пускай даже с мусором. Мой вопрос совсем о другом. Я видел реализацию моего протокола на языке delphi, где вместо обычного компонента для последовательного порта, использовался asyncpro. Программист не отслеживал 0х10 и 0х03, а лишь указал, как начинается и как заканчивается пакет, а принимал его. Примерно за тем же я обратился сюда. Есть ли такой способ избирать из кучи байт пакет целиком? На просторах форума нашел следующую тему с проблемой, примерно как у меня. Там был ответ, который поселил в меня надежду. Там в коде я не понял, что должен возвращать метод APortStr, а дальше уже попробую сам разобраться
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
09.04.2014, 23:51
Regress, ну значит код просто читает, пока не встретит нужный байт, что мешает побайтово считывать из потока с serialport'а?

Добавлено через 12 минут
что-то в этом духе (писал на коленке):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Threading;
 
namespace ConsoleApplication10
{
    class Program
    {
        static void Main()
        {
            var listener = new MySerialPortListener(0x10, 0x03);
            listener.PacketRecieved += (sender, eventArgs) => Console.WriteLine("Packet recieved!");
            listener.Start("blablaportName");
        }
    }
 
    class MySerialPortListener
    {
        public class PacketEventArgs : EventArgs
        {
            public IList<byte> Packet { get; set; }
 
            public PacketEventArgs(IList<byte> packet)
            {
                Packet = packet;
            }
        }
        private readonly int _startByte;
        private readonly int _endByte;
        private SerialPort _port;
        private bool _doWork;
 
        public event EventHandler<PacketEventArgs> PacketRecieved = delegate { }; 
 
        public MySerialPortListener(int startByte, int endByte)
        {
            _startByte = startByte;
            _endByte = endByte;
        }
 
        private void DoWork()
        {
            while (_doWork)
            {
                byte b;
                while ((b = (byte)_port.ReadByte()) != _startByte)
                {
                }
                var list = new List<byte>(new[] {b});
                do
                {
                    b = (byte)_port.ReadByte();
                    list.Add(b);
                } while (b != _endByte);
                PacketRecieved(this, new PacketEventArgs(list));
            }
        }
 
 
        public void Start(string portName)
        {
            _port = new SerialPort(portName);
            _worker.RunWorkerAsync();
        }
 
        public void Stop()
        {
            _doWork = false;
        }
    }
}
Добавлено через 5 минут
Ну или так (так правильнее с точки зрения асинхронности):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 class MySerialPortListener
    {
        public class PacketEventArgs : EventArgs
        {
            public IList<byte> Packet { get; set; }
 
            public PacketEventArgs(IList<byte> packet)
            {
                Packet = packet;
            }
        }
        private readonly int _startByte;
        private readonly int _endByte;
        private SerialPort _port;
        private readonly BackgroundWorker _worker = new BackgroundWorker();
 
        public event EventHandler<PacketEventArgs> PacketRecieved = delegate { }; 
 
        public MySerialPortListener(int startByte, int endByte)
        {
            _startByte = startByte;
            _endByte = endByte;
            _worker.DoWork += DoWork;
        }
 
        private void DoWork(object sender, DoWorkEventArgs doWorkEventArgs)
        {
            var bw = (BackgroundWorker) sender;
            while (!bw.CancellationPending)
            {
                byte b;
                while ((b = (byte)_port.ReadByte()) != _startByte)
                {
                }
                var list = new List<byte>(new[] {b});
                do
                {
                    b = (byte)_port.ReadByte();
                    list.Add(b);
                } while (b != _endByte);
                PacketRecieved(this, new PacketEventArgs(list));
            }
        }
 
 
        public void Start(string portName)
        {
            if (_worker.CancellationPending)
                throw new InvalidAsynchronousStateException("Невозможно начать новую задачу, пока не закончилась предыдущая");
            _port = new SerialPort(portName);
            _worker.RunWorkerAsync();
        }
 
        public void Stop()
        {
            _worker.CancelAsync();
        }
    }
1
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
09.04.2014, 23:54
Я не понимаю, почему Вы так привязались к Портмону и остаткам пакета. Они приходят правильно, пускай даже с мусором.
вы пришли за помощью, не партизаньте. Portmon еще ни разу никого не подводил. И я прав.

Программист не отслеживал 0х10 и 0х03, а лишь указал, как начинается и как заканчивается пакет, а принимал его.
указал сферически? Не смешите тапочки, указание дается для отслеживания начала пакета и конца.

Есть ли такой способ избирать из кучи байт пакет целиком?
да, и вам его указывал постами ранее, вы проигнорировали.

Там был ответ, который поселил в меня надежду. Там в коде я не понял, что должен возвращать метод APortStr, а дальше уже попробую сам разобраться
о да, оберточники почему то не задумываются о реальных кишках методов и свойств компонентов. Это и есть отслеживание признаков.
0
2 / 2 / 2
Регистрация: 12.10.2011
Сообщений: 44
10.04.2014, 00:38
Psilon, спасибо за код, буду разбираться. Немного сложноват для начинающего, но ничего страшного =)
У меня еще будет пара вопросов в эту тему)
Цитата Сообщение от raxp Посмотреть сообщение
вы пришли за помощью, не партизаньте. Portmon еще ни разу никого не подводил. И я прав.
raxp, я действительно пришел за помощью, но Вы повели меня в совсем в другом направлении. Не ругайтесь, я любитель. Код для того, чтобы полезно проводить время.
Цитата Сообщение от raxp Посмотреть сообщение
указал сферически? Не смешите тапочки, указание дается для отслеживания начала пакета и конца.
Я точно знаю, что программист указывал сторокой начало сообщения #$10#$39 и конец сообщения #$10#$03. И я надеялся, что подобное можно провернуть и на C#.
raxp, я не игнорировал Ваш совет.
Цитата Сообщение от raxp Посмотреть сообщение
о да, оберточники почему то не задумываются о реальных кишках методов и свойств компонентов. Это и есть отслеживание признаков.
Я понял Вашу мысль: тем советом пользоваться не буду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2014, 00:38

Как принять заранее неизвестное количество аргументов и передать их в конструктор?
Допустим есть функция которая создает объект template&lt;typename T&gt; T* createObject(typename ...params) { return new...

Принять массив байт через сокет
Добрый вечер.. Есть соединение на сокетах. С сервера идут сообщения по 8 байт. Как их принимать в бесконечном потоке пока есть...

Принять через uart байт и записать его в память
Вобщем, если верить преподавателю, этот код надо немного переделать для желаемого эффекта .device ATmega8 .nolist .include...

MS Comm как принять 1 байт
Поставил заворот (прд.-прм.) посылаю 1-14 байт(символов) не принимает как только посылаю 15 байт принимает из них всего 8 вот пример ...

Как в симуляторе "принять" байт по UART?
Всем привет! Вопрос такого плана... Как в симуляторе студии &quot;принять&quot; байт по UART? Т.е. например надо отладить прерывание по приему, а для...


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru