Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
 Аватар для Злобный Зайц
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462

SerialPort. Максимальный размер буфера

22.05.2018, 12:19. Показов 4427. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задаю ReadBufferSize 1000000, принимаю около 30К данных, а в буфере почему-то всего 12290 байт. В чём тут дело, и что это за магическое число 12290? Откуда оно взялось? И как преодолеть этот магический барьер?
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.IO.Ports;
 
namespace Фотосчитка
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            comboBox1.Items.Clear();
            string[] comPorts = SerialPort.GetPortNames();
            comboBox1.DataSource = comPorts;
            comboBox1.SelectedIndex = 0;
        }
 
        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //Invoke(new EventHandler(PrintByte));
        }
 
        int bytes = 0;
        void PrintByte(object obj, EventArgs e)
        {
            bytes++;
            byte b = (byte)serialPort1.ReadByte();
            label1.Text = Convert.ToString(b, 2);
            while (label1.Text.Length < 8)
                label1.Text = '0' + label1.Text;
            label1.Text += " : " + bytes.ToString();
            if (label1.ForeColor != Color.Blue) label1.ForeColor = Color.Blue;
            else label1.ForeColor = Color.Black;
            serialPort1.ReadExisting();
        }
 
        private void StartButton_Click(object sender, EventArgs e)
        {
            serialPort1.ReadExisting();
        }
 
        private void Save()
        {
            int qwe = serialPort1.BytesToRead;
            byte[] bytesReceived = new byte[qwe];
            serialPort1.Read(bytesReceived, 0, qwe);
            List<byte> listBytesReceived = new List<byte>();
            for (int i = 0; i < bytesReceived.Length; i += 2)
                listBytesReceived.Add(bytesReceived[i]);
            List<byte> listBytesToWrite = new List<byte>();
            listBytesToWrite.Clear();
            for (int i = 0; i < listBytesReceived.Count - 4; i++)
            {
                byte b = (byte)(listBytesReceived[i] & (4 + 16 + 128));
                b += (byte)(listBytesReceived[i + 2] & (2 + 8 + 64));
                b += (byte)(listBytesReceived[i + 4] & (1 + 32));
                listBytesToWrite.Add(b);
            }
            SaveFileDialog opFile = new SaveFileDialog();
            if (opFile.ShowDialog() != DialogResult.OK)
                return;
            string binFile = Path.ChangeExtension(opFile.FileName, ".bin");
            File.WriteAllBytes(binFile, listBytesToWrite.ToArray());
        }
 
        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                serialPort1.Close();
                if (comboBox1.SelectedItem != null)
                    serialPort1.PortName = comboBox1.SelectedItem.ToString();
                serialPort1.Close();
                serialPort1.Open();
            }
            catch
            {
                MessageBox.Show("Не могу открыть");
            };
        }
 
        private void StopButton_Click(object sender, EventArgs e)
        {
            Save();
            serialPort1.ReadExisting();
        }
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.05.2018, 12:19
Ответы с готовыми решениями:

SerialPort: не получается прочитать байты из буфера com-порта
помогите пожалуйста..не получается прочитать байты из буфера com-порта(com2 или com3)..код по-ходу не работает..порты определяет - но байты...

размер буфера
принимаю с imap сервера ответ, в массив byte; и ответ добивает пустыми символами массив. свойство Lenght потока выкидывает исключение, ...

Размер буфера для получения данных из сокета
Подскажите как изменить размер буфера для получения данных из сокета? делаю так: public string Read() { byte...

10
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
22.05.2018, 12:25
Скорее всего это количество байт, которое успевает прочитаться за ReadTimeout миллисекунд на текущем баудрейте порта.
0
 Аватар для Злобный Зайц
14 / 14 / 1
Регистрация: 21.10.2010
Сообщений: 462
22.05.2018, 14:52  [ТС]
Благодарю за ответ. Но, похоже, что дело не в этом. Данные идут с совершенно произвольной скоростью - считывание перфоленты, протягиваемой вручную через фотосчитывающее устройство. Если бы дело упиралось в таймаут, то неизбежно получался бы каждый раз разный объём считанного.

Добавлено через 2 часа 20 минут
Решилась проблема. Через использование DataReceived. Загадка, однако, осталась - что это за магическое число 12290? Хотя, теперь оно уже не так и важно. Разве что, для общего развития хотелось бы понять.
0
2 / 2 / 0
Регистрация: 06.03.2017
Сообщений: 50
21.02.2019, 23:26
Цитата Сообщение от Злобный Зайц Посмотреть сообщение
Решилась проблема. Через использование DataReceived. Загадка, однако, осталась - что это за магическое число 12290? Хотя, теперь оно уже не так и важно. Разве что, для общего развития хотелось бы понять.
Добрый день ! Хоть убейте не понимаю как решить такую же проблему в магических, только 12300 .По буферу. Что только не перепробовал так и не смог. Может кто знает?
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
22.02.2019, 09:19
Дайте навангую: устройство работает на 256000 8E1 ?
0
2 / 2 / 0
Регистрация: 06.03.2017
Сообщений: 50
22.02.2019, 10:20
Цитата Сообщение от Exerion Посмотреть сообщение
256000 8E1
если имеете ввиду скорость порта,То пробовал разные.А что такое 8Е1?

Добавлено через 12 минут
Но если обьяснить суть того почему вопрос так интересует.Через железо по виртуальному порту принимаем данные ввиде высокоскоростной шины данных автомобиля. Все хорошо.Но ....проведя разные эксперименты обнаружилось что если убрать весь код и оставить только чтоб данные получать из порта, то работа порта так нагружает процессор, что я даже не знаю какой в таком случае и надо то.Вот и хотелось поиграть с размерностью буфера, чтоб количество считывания с порта уменьшить.НО все время принимает в одной и той же размерности,хотя настройки показывают что буфер -его размерность меняется, в зависимости какое выставили. Или это такая особенность на с#
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
22.02.2019, 10:32
Цитата Сообщение от serand Посмотреть сообщение
пробовал разные
По последовательному порту устройство может работать только на одной конкретной скорости, на других от него будут приходить некорректные данные.

Цитата Сообщение от serand Посмотреть сообщение
А что такое 8Е1
8 бит данных, чётность, 1 стоп-бит.
0
2 / 2 / 0
Регистрация: 06.03.2017
Сообщений: 50
22.02.2019, 11:23
Цитата Сообщение от Exerion Посмотреть сообщение
По последовательному порту устройство может работать только на одной конкретной скорости, на других от него будут приходить некорректные данные.
я с этим спорить не могу.
Меня на данный момент интересует почему так много используется процессор и как сделать так чтоб он не сильно нагружался .Вот и хотел поиграть с буфером но ....Упс так и не понял как за один раз принимать то количество что которое ограничено размером буфера а не магические 12300
0
[Bicycle Reinventor]
 Аватар для Exerion
332 / 270 / 109
Регистрация: 19.10.2011
Сообщений: 668
Записей в блоге: 2
22.02.2019, 11:30
Буфер можно хоть гигабайтный поставить, но принять за секунду больше, чем позволяет скорость порта, всё равно не получится.

Если скорость 256000, 10 бит на кадр, то выходит 25600 байт/сек. Таймаут чтения в SerialPort по умолчанию выставлен в 500 мсек, за это время можно принять максимум 12800 байт. С учетом того, что у таймеров в винде есть погрешности, можно допустить, что принимается только 12300 байт.
0
2 / 2 / 0
Регистрация: 06.03.2017
Сообщений: 50
22.02.2019, 11:43
Все как бы правильно,но тайминг разный пробовал.Все одно .12300 плюс ,минус единицы.Пробовал другое оборудование, в зависимости от скорости порта, чем ниже опеделенной скорости происходит переполнения буфера порта и соответственно на том оборудовании об этом говорит оборудование.То есть при меньшей скорости не успевал обновляться ком порт.Скорость выше все нормально.Программное обеспечение для оборудование позволяет выставить скорость в плоть до 8 мбит,что и рекомендует призводитель выставить 4мбит.Значит скорость порт поддержит и выше 256000.Но в том то идело что ам и там везде эти 12300.Как быть -ума не хватает.

Добавлено через 3 минуты
и все именно связано с работай порта.Если в оборудовании выставить аппаратные фильтра, то уменьшаем количество данных, сразу падает нагрузка проца.Если принимать все то и проблема с нагрузкой.В пике до 60 процентов, в среднем до 30.Много.
0
2 / 2 / 0
Регистрация: 06.03.2017
Сообщений: 50
23.02.2019, 12:35
Во всяком случае определенное решение было найдено, хотелось еще, ну во всяком случае это уже решение. Задача ставилась уменьшить нагрузку на процессор при очень большом и очень быстром приеме данных через CОМ порт. Если кому интересно применение внешней длл при работе порта уменьшило нагрузку на проц раз в 10-20. https://github.com/jcurl/SerialPortStream
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.02.2019, 12:35
Помогаю со студенческими работами здесь

Оптимальный размер буфера для чтения/записи файла
Какой оптимальный со стороны производительности размер буфера для чтения и записи данных в файл? Жду обоснованный ответ. Еще вопрос...

UDP чат. При отправке сообщения, размер которого больше принимаемого буфера, сервер падает
Всем привет. Учу c# устал от книжек и решил написать простенький чат используя udp сокеты. Получилось так что столкнулся с дурацкой...

Микроконтроллер от B&R, как получить размер буфера
Программируется микроконтроллер на нём пишется сетевой обмен(Сервер) TCP язык ANSI-C Пишу приложение на C# для считывания и отправки...

Реализация сервер - клиенты через Сокеты. Размер буфера при передаче списков
Доброго времени суток. Пишу приложение по ведению заказов. Столкнулся с проблемой. Есть сервер и множество клиентов. На сервере...

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru