Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/194: Рейтинг темы: голосов - 194, средняя оценка - 4.76
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
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
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.10.2011, 10:28
Цитата Сообщение от Capiton Посмотреть сообщение
с0 23 45 65 78 23 56 с1
Что за данные, что за протокол?

Считывается очень просто:
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
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.10.2011, 11:53
Цитата Сообщение от Capiton Посмотреть сообщение
хотелось бы примеры как именно обрабатывать данные то есть конвертировать в разные форматы и выводить в TextBox
Именно для этого я постом выше задал вопрос:
Цитата Сообщение от kolorotur Посмотреть сообщение
Что за данные, что за протокол?
Перед тем, как конвертировать голые байты в человеческий формат, надо знать что вам отсылают в виде этих байтов.
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
12.10.2011, 12:40  [ТС]
kolorotur, контролер отправляет символьный код выглядит он вот так признак старта это символ
! потом в десятичном формате идут данные 10 23 34 простые данные и конец пакета это символ ?
как это все разобрать на части каким конвертерами пользоваться и если не сложно можно примеры как для winform так и для console
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.10.2011, 12:48
Цитата Сообщение от Capiton Посмотреть сообщение
простые данные
Простые - это какие именно? Числа? Буквы? Битмаски?

Еще раз: какой протокол пытаетесь реализовать?
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
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.10.2011, 13:37
Цитата Сообщение от Capiton Посмотреть сообщение
Это свой протокол
Понял, спасибо.

Перво-наперво, совет: не используйте последний байт сообщения как символ окончания этого сообщения. Передаваться ваш вопросительный знак будет все равно как байт, а как отличить - это очередное число в сообщении или окончание сообщения? Знак "?" в таблице ASCII имеет порядковый номер 63. То есть принимающая сторона будет строить сообщение, пока не наткнется на число 63, которое символизирует окончание сообщения. Будет весело, если y=63, например.

Чтобы избежать этих веселостей, либо используйте фиксированную длину сообщений, либо формат сообщения должен быть такой:
[sync] [length] [data] [checksum]
где
sync - один синхронизирующий байт, указывающий на начало сообщения.
length - длина сообщения (если длина может быть больше, чем 256 байт, то используйте для этих целей 2, 3, 4 и т.д байт. Но - всегда)
data - следующие n байт, указанные в предыдущей части сообщения. При этом надо определить интервал возможных значений и отсылать определенное количество байт для каждого значения.
checksum - контрольная сумма для проверки правильности данных, т.к. могут быть ошибки при передаче. Алгоритмов много, например two's compliment или CRC.

То есть сначала проектируем протокол, потом пишем его реализацию.
Если у вас всегда передаются только три числа со значениями от 0 до 255, то все просто:
C#
1
2
3
4
5
6
7
8
9
byte[] buffer = new byte[4];
int recv = serialPort.Read(buffer, 0, buffer.Length);
 
if (buffer[0] = 33) // Синхронизирующий байт. После этого еще делаем проверку контрольной суммы.
{
   int x = buffer[1];
   int y = buffer[2];
   int z = buffer[3];
}
Если интервал допустимых значений выше, то немного сложнее, см. описание части data выше.
2
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 10
12.10.2011, 14:03  [ТС]
kolorotur, Возникает тогда другой вопрос если на порт контролера отправлять строку с данными в формате стринг и принимать его как строку на сколько я помню в работе со строкой есть вариант поиска части строки разделенные символами и уже по маске вытаскивать данные. Принимать методом ReadExisting(). Как вы думайте такой вариант как.
0
Эксперт .NET
 Аватар для kolorotur
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  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Нормальный вариант, если не заботит размер передаваемых данных и быстродействие не критично.
Да не особо я думаю что не критично если в течение 1с поступают и обрабатываются данные
0
Эксперт .NET
 Аватар для kolorotur
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
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
12.10.2011, 15:39
C#
1
2
3
4
var bytes = System.Text.Encoding.Unicode.GetBytes("blablabla");
 
// По ту сторону шнура
var text = System.Text.Encoding.Unicode.GetString(bytes);
1
0 / 0 / 0
Регистрация: 19.08.2009
Сообщений: 41
13.01.2016, 10:05
Вопрос по теме. Я пишу загрузчик для заливки прошивки в МК AVR. Протокол AVR109. Вот функция для подключения к загрузчику в МК. Данная функция вызывается после открытия порта.
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
// При подключении к порту соединится с загрусчиком, считать сигнатуру и заполнить поля.
        private void Boot_Init()
        {
            // Буфер данных
            char[] Byte_Data = new char[16];
            // Команда для подключения к загрузчику
            char[] Com_S = new char[] { 'S' };
            // Команда получить сигнатуру МК
            char[] Com_s = new char[] { 's' };
 
// Если выбран программный переход к загрузчику.
            if (Prog_Boot.Checked == true)
            {
                // Конвертация приклодной команды в char массив для вывода
                for (int i = 0; i < Comanda.Text.Length; i++)
                {
                    Byte_Data[i] = Convert.ToChar(Comanda.Text[i]);
                }
 
                // Передача приклодной команды основной программе
                serialPort1.Write(Byte_Data, 0, Comanda.Text.Length);
 
                // Индикация состояния работы программы
                Info.Text = "Команда";
 
                // Установка времени ожидания перехода МК от основной программы к загрузчику
                serialPort1.ReadTimeout = (Convert.ToInt32(Seconds.Text, 16) * 1000);
 
                try
                {
                    // Чтение ответа от загрузчика
                    serialPort1.Read(Byte_Data, 0, Byte_Data.Length);
 
                    // Если переход к загрузчику удачный, проверяем на правильный ответ
                    if (Byte_Data[0] != 0xAA)
                    {
                        // Если ответ не верный (Скорее всего неправильный битрейт)
                        // Вывод состояния работы программы, закрыть порт и выйти из функции
                        Info.Text = "Нет ответа";
                        ErrorCOM();
                        return;
                    }
                }
                catch
                {
                    // Выход по таймауту
                    // Вывод состояния работы программы, закрыть порт и выйти из функции
                    Info.Text = "Нет ответа";
                    ErrorCOM();
                    return;
                }
            }
 
// Подключение к загрузчику            
 
            // таймаут пол секунды
            serialPort1.ReadTimeout = 500;
            // Передать команду подключения к загрузчику
            serialPort1.Write(Com_S, 0, 1);
 
            try
            {
                // Получить ответ (Без разницы какой)
                serialPort1.Read(Byte_Data, 0, Byte_Data.Length);
            }
            catch
            {
                // Выход по таймауту
                // Вывод состояния работы программы, закрыть порт и выйти из функции
                Info.Text = "Нет ответа";
                ErrorCOM();
                return;
            }
 
            // таймаут пол секунды
            serialPort1.ReadTimeout = 500;
 
            // Команда на получение сигнатуры
            serialPort1.Write(Com_s, 0, 1);
 
            // Чтение из порта
            serialPort1.Read(Byte_Data, 0, Byte_Data.Length);
 
            try
            {
                // Если сигнатура от Mega8 вывести значения
                if ((Byte_Data[0] == 0x07) & (Byte_Data[1] == 0x93))
                {
                    Chip_Signatura.Text = "1E 93 07";
                    Chip_type.Text = "ATMega8";
                    Chip_flash.Text = "8";
                }
                else
                {
                    // Выход по таймауту
                    // Вывод состояния работы программы, закрыть порт и выйти из функции
                    Info.Text = "Нет ответа";
                    ErrorCOM();
                    return;
                }
 
            }
            catch
            {
                // Выход по таймауту
                // Вывод состояния работы программы, закрыть порт и выйти из функции
                Info.Text = "Нет ответа";
                ErrorCOM();
                return;
            }
 
            // Если все команды отработали нормально
            Info.Text = "Подключен";
        }
Проблема в следующем. При первом запуске программы после открытия порта я получаю в ответах нужное количество байт, но при этом адекватное значение только в первых байтах. Если я программно закрою порт (по нажатию на кнопку), то при повторном открытии считываются только первые байты, а остальные программа не читает. Скорость порта такая же как и у МК. Логическим анализатором смотрел передачу, МК четко отвечает на команды. В чем может быть причина такого глюка?.
0
Эксперт .NET
 Аватар для kolorotur
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
т.к. нуль-модем передает данные намного медленнее, чем ЦП их считывает
По моему это ахинея. На то и функция чтобы читать все что заказали. COM порт это RS-232 на ружу, а на плате это пяти вольтовый или трех вольтовый UART. Если скорости передачи на обоих концах настроены верно, то передача должна идти без проблем. У меня складывается впечатление что это какая-то бага в студии. У меня например по началу вообще при передаче любого числа байт в порт, в конце зачем-то передавались еще два байта 0x41 и 0x0A. Я долго искал причину, а потом она просто сама пропала. Перестал слать их и все. По поводу проверки числа принятых байт. Я изначально их смотрел, отчего и написал в вопросе, что при первом запуске программы на первую команду Read() принимает все семь байт, на второй команде все три байта, но данные верны только в первых байтах. Но стоит только закрыть порт, а потом снова открыть, так при первой команде приходит только один байт, а при второй три и все с ерундой.
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
13.01.2016, 14:00
Цитата Сообщение от gurvinok Посмотреть сообщение
складывается впечатление что это какая-то бага в студии.
Сколько с портом работаю, никаких багов не замечал... Немного полистал про этот протокол, но особо вникать некогда. Вот пример, как я работал, правда, тут другой мк (Motorola), и соответственно протокол там свой, но главное-принцип. У вас же есть протокол, верно? А он должен точно формализовать, на какой запрос что должно прийти. Так вот и надо этим пользоваться. Например, послали команду А, значит в ответ должно прийти точно N байт (байт, а не символов! В символы их можно перевести и потом). Если число не верное-то сразу можно сделать вывод, что что-то идет не так.
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Threading;
using System.Threading.Tasks;
using System.ComponentModel;
using System.IO.Ports;
                          
namespace MON08_Code_Searcher {
    public class CodeGenerator : BackgroundWorker {
 
        SerialPort _port = null; //Поле последовательного порта
        IAlgorithm _algo = null; //Поле алгоритма поиска
        uint _pause = 0;         //Поле задержки между запросами
        TargetType _target;      //Тип устройства
        public string CurrentCode { get; private set; }  //Автосвойство, текущий код 
 
        //Конструктор
        public CodeGenerator(IAlgorithm algorythm, TargetType target, string portName, int baudRate) {
            _port = new SerialPort {
                PortName = portName,
                BaudRate = baudRate
            };
            _algo = algorythm;
            _pause = target.PauseInterval;
            _target = target;
 
            this.WorkerReportsProgress = true;
            this.WorkerSupportsCancellation = true;
        }
        //Переопределенный метод OnDoWork()
        protected override void OnDoWork(DoWorkEventArgs e) {
            using (_port) {
                _port.Open();
                StartSearch(e);
            }
        }
        //Основной метод поиска кода
        void StartSearch(DoWorkEventArgs e) {
            //Событие старта поиска, с общим размером текущего диапазона
            this.ReportProgress(0, ProgressState.START);
            //Цикл поиска
            while (_algo.NextResult()) {
                //Проверка признака отмены операции
                if (this.CancellationPending) {
                    e.Cancel = true;
                    //Событие отмены операции поиска
                    this.ReportProgress(0, ProgressState.CANCELED);
                    return;
                }
 
                //Массив байт кода запроса
                byte[] code = Convert(_algo.Current);
                //Установка текущего кода из диапазона
                CurrentCode = _algo.Current.ToString();
 
                //Событие шага прогресса
                this.ReportProgress(0, ProgressState.STEP);
 
                //Включение DTR порта
                _port.DtrEnable = true;
 
                //Векторный запрос
                if (SendVectorAsc(code)) {
                    //Адресный запрос
                    if (SendAddressAsc(code)) {
                        e.Result = true;
                        return;
                    }
                }
                //Отключение DTR порта
                _port.DtrEnable = false;
                //Задержка между запросами
                Thread.Sleep((int)_target.PauseInterval);
            }
            //Событие окончания поиска
            e.Result = false;
            this.ReportProgress(0, ProgressState.END);
        }
        //Метод векторного запроса
        bool SendVectorAsc(byte[] vector) {
            for (int i = 0; i < vector.Count(); i++) {
                int count = i != vector.Count() - 1 ? 2 : 3;
                ReadBlock(vector[i], count, null);
            }
            return true;
        }
        //Метод адресного запроса
        bool SendAddressAsc(byte[] vector) {
            byte readCommand = 0x4A;
            byte vectorAddress = 0xF6;
            List<byte> temp = new List<byte>();
 
            for (int i = 0; i < vector.Count(); i++) {
                ReadBlock(readCommand, 2, null);
                ReadBlock(0xFF, 2, null);
                ReadBlock((byte)(vectorAddress + i), 3, temp);
                if (temp[2] != vector[i]) {
                    return false;
                }
            }
            return true;
        }
        //Метод записи/чтения блока данных из последовательного порта
        void ReadBlock(byte code, int readCount, List<byte> temp) {
            for (int i = 0; i < 10; i++) {
                _port.DiscardInBuffer();
                _port.Write(new byte[] { code }, 0, 1);
                for (int j = 0; j < 10; j++) {
                    if (_port.BytesToRead == readCount) {
                        byte[] data = new byte[readCount];
                        _port.Read(data, 0, readCount);
                        if (temp != null) {
                            temp.Clear();
                            temp.AddRange(data);
                        }
                        return;
                    }
                    else {
                        Thread.Sleep(100);
                    }
                }
            }
            throw new TimeoutException("NO ANSWER FROM DEVICE");
        }
        //Метод создания кода запроса (Vector >>> byte[])
        byte[] Convert(Vector4 vector) {
            List<byte> temp = new List<byte>();
            for (int i = 0; i < vector.Count; i++) {
                temp.Add((byte)(vector[i] / 0x100));
                temp.Add((byte)(vector[i] & 0xFF));
            }
            return temp.ToArray();
        }
        //Метод проверки корректности установленных диапазонов
        bool IsRangeCorrected(ushort[] code) {
            if (code.All((c) => c >= _target.Range.MemoryStart & c <= _target.Range.MemoryEnd)) {
                return true;
            }
            return false;
        }
    }
    //Перечисление этапов прогресса оперции
    internal enum ProgressState {
        START,
        END,
        STEP,
        CANCELED
    } 
}
Добавлено через 1 минуту
И да, я вижу, что у вас все в одной форме. Это не верно. Инкапсулируйте всю работу с мк в отдельном классе. Так будет удобнее, да и на будущее может упростить жизнь.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.01.2016, 14:06
Цитата Сообщение от gurvinok Посмотреть сообщение
По моему это ахинея.
Ахинея — то, что я написал или то, что метод так работает?

Цитата Сообщение от gurvinok Посмотреть сообщение
На то и функция чтобы читать все что заказали.
Функция делает ровно то, что задокументировано: считывает максимум указанных байт из буфера и возвращает количество фактически считанных.

Цитата Сообщение от gurvinok Посмотреть сообщение
COM порт это RS-232 на ружу, а на плате это пяти вольтовый или трех вольтовый UART. Если скорости передачи на обоих концах настроены верно, то передача должна идти без проблем.
Да нет, к сожалению не будет она идти без проблем: попробуйте на тех же 9600 заслать пару Кб и посмотрите, где будет узкое место.
Больше скажу: при реализации протокола с максимальным размером сообщения 256 байт и скоростью 38400, сообщения все равно приходится считывать в несколько заходов, т.к. из буфера их считать быстрее, чем со шнура.

Цитата Сообщение от gurvinok Посмотреть сообщение
У меня складывается впечатление что это какая-то бага в студии.
Да берите выше — всемирный жыдо-масонский заговор лично против вас, чего уж мелочиться
Это не к тому, что студия не содержит багов, а к тому, что начинать поиск проблемы нужно с собственной реализации.

Цитата Сообщение от gurvinok Посмотреть сообщение
По поводу проверки числа принятых байт. Я изначально их смотрел, отчего и написал в вопросе, что при первом запуске программы на первую команду Read() принимает все семь байт, на второй команде все три байта, но данные верны только в первых байтах. Но стоит только закрыть порт, а потом снова открыть, так при первой команде приходит только один байт, а при второй три и все с ерундой.
Проверьте:
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
Цитата Сообщение от insite2012 Посмотреть сообщение
И да, я вижу, что у вас все в одной форме. Это не верно. Инкапсулируйте всю работу с мк в отдельном классе. Так будет удобнее, да и на будущее может упростить жизнь.
Для меня это темный лес. Я привык работать с МК. Там все напрямую с регистрами и никаких кодировок. С UART через оработчик прерываний и так далее, а тут такой огород. Банально не могу принять байт.

kolorotur Сделал по Вашему варианту. Теперь вообще ничего не приходит.
C#
1
2
3
4
byte[] b = new byte[20];
int read = 0;
while (read < b.Length)
read += serialPort1.Read(b, 0, b.Length - read);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.01.2016, 14:13
Помогаю со студенческими работами здесь

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; По приему байта пытаемся изменить текст...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 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. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru