Форум программистов, компьютерный форум, киберфорум
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Fendorka
1 / 1 / 0
Регистрация: 24.11.2017
Сообщений: 15

Получение данных с SerialPort после запроса

14.08.2019, 13:17. Показов 1394. Ответов 0

Студворк — интернет-сервис помощи студентам
Добрый день. Есть устройство, подключенное по SerialPort, скорость 57600.

Стоит задача посылать пакет байт - 0x01, 0x03, 0x80, 0x0A, 0x00, 0x02, 0xCD, 0xC9
в ответ на который устройство посылает пакет 0x01, 0x03, 0x04, 0x00, 0x00, 0x00, 0x1B, 0xBA, 0x38
Где 0x01, 0x03, 0x04 всегда одинаковые, дальше 4 байта информации и 2 байта ModBus CRC
Задержка приёмопередатчика указана в PDF 4мс

Похожие устройства опрашивал с помощью кода в таймере и всё прекрасно работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
array<Byte>^ LIR = gcnew array<Byte> { 0x23, 0x01, 0x61 };  //команда запроса
    if (serialPort1->IsOpen) { 
try {
                timer1->Interval = 100;
                array<byte>^ LIRdannie = gcnew array <byte>(7);  //массив ответа
                this->serialPort1->Write(LIR, 0, LIR->Length);   //посылаем массив запроса
                Sleep(10);   //ждём 10мс скорость 19200
                this->serialPort1->Read(LIRdannie, 0, 7); //получаем ответ
 
                if (LIRdannie[0] == 0x3E && LIRdannie[6] == 0x0D) {
                              //обработка полученных данных
                                }
            }
            catch (TimeoutException^) {
                this->label23->Text = "Нет данных";
            }
}
В текущей же проблеме в ответ на похожий запрос выдаётся бегущая строка байтов, которые всегда не на своём месте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    array<Byte>^ Enkoder = gcnew array<Byte> { 0x01, 0x03, 0x80, 0x0A, 0x00, 0x02, 0xCD, 0xC9 }; //строка запроса
    if (serialPort2->IsOpen) {
        try {
            timer4->Interval = 100;
            array<byte>^ Enkoderdannie = gcnew array <byte>(9); //массив для приёма
            for (int i = 0; i < 9; i++) Enkoderdannie[i] = 0x00; //была попытка обнулить его перед приёмом, но бегущая строка просто стала иногда выдавать нули
            this->serialPort2->Write(Enkoder, 0, Enkoder->Length); //послать массив запроса
            Sleep(5); //подождать 5мс, так как скорость 57600
                       this->serialPort2->Read(Enkoderdannie, 0, 9); //получаем ответ
        }
        catch (TimeoutException^) {
            this->textBox16->Text = "-";
        }
Да, я понимаю, что Sleep в однопоточной программе может всё вешать, но другого способа не придумал.

В итоге если выводить массив полученных байт в TextBoxы после функции Read в отрывке выше:
C++
1
2
3
this->textBox34->Text = Enkoderdannie[3].ToString();
this->textBox35->Text = Enkoderdannie[4].ToString();
и тд
то они будут двигаться как бегущая строка справа налево при каждом измерении, плюс иногда мусор
01 03 80 0A 00 02 CD C9
03 80 0A 00 02 CD C9 01
80 0A 00 02 CD C9 01 03
0A 00 02 CD C9 01 03 80
Соответственно считывать нормально не получается, хотя если слать команду через Terminal, то ответ приходит стабильно нормально.

Пробовал ReadLine
C++
1
2
3
4
5
6
try {
this->textBox41->Text = this->serialPort2->ReadLine();
}
catch (TimeoutException^) {
this->textBox41->Text = "-";
}
Выводит много мусора и зависает

Пробовал ReadByte
C++
1
2
3
wchar_t item1; 
item1 = Convert::ToChar(serialPort2->ReadByte()); 
this->textBox34->Text = item1.ToString();
Выводит мусор по 1 байту, но не виснет

Пробовал ReadByte в цикле либо по окончанию считывания, либо по достижению -1
C++
1
2
3
4
5
6
7
int i = 0;
do {
Enkoderdannie[i] = serialPort2->ReadByte();
i++;
} while (Enkoderdannie[i] != (-1));
this->textBox34->Text = Enkoderdannie[3].ToString();
this->textBox35->Text = Enkoderdannie[4].ToString();
Выводит мусор в каждый TextBox

Пробовал ReadExisting
C++
1
2
String^ txt = serialPort2->ReadExisting();
    this->textBox41->Text = txt;
Выводит уже стабильно нормально, но в неправильной кодировке и в один Текстбокс что-то типа └┘????:s

Пробовал играться с Encoding, вставляя строчки
C++
1
2
3
serialPort2->Encoding = gcnew UTF8Encoding(true, true);
serialPort2->Encoding = Encoding::UTF8;
serialPort2->Encoding = System::Text::Encoding::GetEncoding(28591);
Но они все приводили к непонятным символам, которые менялись при вращении двигателя, то есть показания с энкодера поступали нормально, но не обрабатывались грамотно.

Подскажите, что я сделал не так? В идеале на выходе получить массив из байт, которые всегда будут на своём месте, чтоб их можно было обработать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.08.2019, 13:17
Ответы с готовыми решениями:

Получение результата после POST запроса
Как получить код страницы после POST запроса? параметры я передал верно, но после того как я загрузил код страницы в мемо, код остался...

Получение значения конкретного поля после SQL запроса
Нужно проверять введенный пароль и логин по MySQL базе и если пароль для данного логина правилен, то открывать программу. К примеру...

Получение данных от пост запроса
Добрый вечер. Прошу помощи. Начал делать авторизацию на c# с помощью php, то есть отсылаю post запрос на php скрипт, он обрабатывает,...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.08.2019, 13:17
Помогаю со студенческими работами здесь

Получение данных из Post запроса
Есть запрос на сервер, он благополучн проходит. Получаю ответ от сервера, но не могу его обработать. Могу получить все до, а как...

Отправка и получение данных (запроса) из сервера
Помогите пожалуйста! Мне нужно отправить данные на сервер, желательно чтобы и в ответ сервер что-то отправлял. Мне надо отправить на сервер...

Оправка Post-запроса и получение данных с сайта
Здравствуйте нужна отправить на форму в сайте кой какую информацию и после из этого сайта нужно получить информацию через delphi я не могу...

3 аякс запроса и получение данных на один php файл
Ув. форумчане , у меня вопрос: Можно ли отправить 3 аякс запроса на один php файл и получить для каждого аякс запроса конкретную...

Получение данных из javascript'a для формирования POST-запроса
Всем привет, пишу постер на форум с движком mybb, сниффал запросы, отсылается вот что: a786519c c66d14a4b155d83255e4d01faae991fbacc59e7c ...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 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. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru