Аватар для Fendorka
1 / 1 / 0
Регистрация: 24.11.2017
Сообщений: 15

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

14.08.2019, 13:17. Показов 1400. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Очистка реквизитов документа при копировании
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
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru