Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
1

Парсинг данных полученных от Arduino через виртуальный COM порт

23.03.2019, 10:04. Просмотров 2551. Ответов 23
Метки нет (Все метки)

Добрый день уважаемые софорумчане,при реализации моего проекта возникла необходимость получать данные с блютуз устройства,задачу эту я решил открытия канала связи с виртуальным COM портом блютуз,и да данные я получить смог,но тут возникла другая проблема решение которой не даёт осуществить недостаток знаний,проблема собственно в том что от удалённого устройства в виртуальный COM-порт приходят данные такого типа:

Код
------- Xoris - Telemetry Report -------
Humidity: 43.30 %
Temperature: 24.50 *C
Pressure: 99468 mm.rt.st
ALT: 76 metres
------- Xoris - Telemetry Report END ---
Открытие порта для приёма данных:

C#
1
2
3
byte[] data = new byte[1024]; // Глобальный масив для данных от телеметрии
 
        SerialPort port = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); // Порт блютуз для телеметрии
Само чтение и запись в массив:

C#
1
2
port.Open();
port.Read(data, 0, data.Length);
Собственно проблемой стало то,как значения Humidity Temperature и другие распарсить в переменные C# такие например как string temperature и т.д,как я не пытался у меня ничего не вышло,буду рад любой помощи,если можете дайте пожалуйста примеры готового кода и если не сложно пояснения почему именно так. Заранее спасибо жду вашей помощи)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.03.2019, 10:04
Ответы с готовыми решениями:

Отправка данных с АПЦ Arduino Nano в Hiasm через COM-порт
Здравствуйте! У меня имеется готовая программа в Hiasm и АЦП для нее (на микроконтроллере Atmega8)...

STM32F102C8T6 и виртуальный COM порт через USB.
Господа, помогите осознать, что происходит. Микроконтроллер STM32F102C8T6. В прошивке...

Потеря данных полученных в Android от Arduino по Bluetooth (appinvertor)
Отправляю сигналы с ардуино, с разных датчиков, в виде "имя датчика + уровень" Пробовал вот так:...

[Arduino] Как правильно распознать команду через COM- порт
Не могу правильно интерпретировать полученое на Ардуино. На нем идет считывание и считаное =...

23
147 / 99 / 51
Регистрация: 08.01.2013
Сообщений: 579
23.03.2019, 11:51 2
Если я не ошибаюсь, то в data, храниться вся ваша информация, ее просто нужно переформатировать c byte в нужную вам структуру.
Пример:
Послали вы 1 число int32 и 1 символ char. В итоге 2 "слова"(int32 и char). int32 - 32 бит, что равно 4 byte, в первых 4 байт будет хранится число int32, а в следующем байте char, так как char 8 бит=1 байту.

Добавлено через 5 минут
Если не получится разобраться и найти нужные данные, то нужно разбираться с настройкой порта, совпадают ли боды, у вас стоит 9600, вы с такой же скоростью отправляете и принимаете данные и тому подобные настройки
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 11:57  [ТС] 3
Да с устройства на порт данные идут всё на той же скорости 9600,но вы меня не так поняли,мне надо понять или нужен код для того чтобы разложить конечный результат по переменным
0
147 / 99 / 51
Регистрация: 08.01.2013
Сообщений: 579
23.03.2019, 12:01 4
Цитата Сообщение от makris Посмотреть сообщение
мне надо понять или нужен код для того чтобы разложить конечный результат по переменным
Да, из data байты преобразовать в нужную вам структуру(int, string, float и т.д. в зависимости в каком порядке вы отправляли). Я лично с bluetooth не работал, но работал с wifi с COM портом. Но думаю принцип получения передачи данных одинаково
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 12:38  [ТС] 5
Можете дать примерный код как это должно выглядеть ?
0
147 / 99 / 51
Регистрация: 08.01.2013
Сообщений: 579
23.03.2019, 14:08 6
Цитата Сообщение от makris Посмотреть сообщение
Можете дать примерный код как это должно выглядеть ?
у меня нет, я очень давно этим заморачивался, но если поискать по форуму "как массив byte конвертировать в int", то найдете ответ на свой вопрос
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 14:11  [ТС] 7
Дак мне не нужен int,нужен string и потом эту строку разложить ещё дальше по переменным
0
147 / 99 / 51
Регистрация: 08.01.2013
Сообщений: 579
23.03.2019, 14:20 8
Цитата Сообщение от makris Посмотреть сообщение
Дак мне не нужен int,нужен string и потом эту строку разложить ещё дальше по переменным
https://www.cyberforum.ru/post308847.html

Добавлено через 4 минуты
P.S. также нужно учитывать кодировку
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 14:24  [ТС] 9
В Arduino вроде UTF-8

Добавлено через 27 секунд
Но к сожалению мою проблему это не решает
0
147 / 99 / 51
Регистрация: 08.01.2013
Сообщений: 579
23.03.2019, 14:35 10
Цитата Сообщение от makris Посмотреть сообщение
Но к сожалению мою проблему это не решает
Как я говорил, нужно разобраться в структуре отправки(мб ваше устройство не строку отправляет, а структуру) и мб в настройке порта.
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 14:46  [ТС] 11
Моё устройство отправляет каждые 2 секунды следующую структуру:

------- Xoris - Telemetry Report -------
Humidity: 43.30 %
Temperature: 24.50 *C
Pressure: 99468 mm.rt.st
ALT: 76 metres
------- Xoris - Telemetry Report END ---
0
4368 / 3069 / 1322
Регистрация: 09.05.2015
Сообщений: 7,533
23.03.2019, 14:48 12
Цитата Сообщение от makris Посмотреть сообщение
Моё устройство отправляет каждые 2 секунды следующую структуру
Больше похоже на текст, а не на структуру...
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 14:51  [ТС] 13
Можно сказать что тексовая структура с данными от телеметрии,но увы распарсить данные этих строк у меня так и не вышло
0
147 / 99 / 51
Регистрация: 08.01.2013
Сообщений: 579
23.03.2019, 14:53 14
Цитата Сообщение от makris Посмотреть сообщение
Моё устройство отправляет каждые 2 секунды следующую структуру:
в переменной data тебе нужно их искать, конвертировав под структуру отправки этого устройтсва(мб в каких то документациях или даташитах на это устройство написано)

Добавлено через 45 секунд
Цитата Сообщение от makris Посмотреть сообщение
Можно сказать что тексовая структура с данными от телеметрии,но увы распарсить данные этих строк у меня так и не вышло
сам текст в приложение пришло?

Добавлено через 1 минуту
data с не нулювыми значениями?
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 14:56  [ТС] 15
Если текст конвертировать в UTF-8 или ASCI2 то будет выводится только - и всё,на устройство документации нет ибо оно самодельное,а построено на базе Arduino Uno
0
147 / 99 / 51
Регистрация: 08.01.2013
Сообщений: 579
23.03.2019, 15:02 16
Цитата Сообщение от makris Посмотреть сообщение
проблема собственно в том что от удалённого устройства в виртуальный COM-порт приходят данные такого типа:
Данные в приложении где храниться? в string/файл или что-то подобное. Мы не можем понять что тебе нужно.
Если проблема в получении текстовой структуры в приложении, то нужно разбираться с data, портом, настройками блютуз устройства. Если проблема в получение данных (Humidity, Temperature, Pressure, ALT) из полученного текста в приложении, то тут надо со строкой/текстом разбираться
0
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 15:08  [ТС] 17
Есть переменные

string temperatur = "";
string humidity = "";

и другие под Pressure, ALT

мне надо получить данные с устройства,перевести их в читабельный string буфер ( просто переменная для хранения буферного значения переведённого массива ) и этот буфер как-то считать и данные из него распихать уже по переменным,но т.к в программирование на C# я не очень силён для меня это стало настоящей проблемой,блютуз устройство в данный момент не используется а устройство подключено по USB и делает для себя тот самый виртуальный COM порт,в принципе как и блютуз.
0
Супер-модератор
Эксперт .NET
12377 / 10214 / 4249
Регистрация: 17.03.2014
Сообщений: 20,477
Записей в блоге: 1
23.03.2019, 15:09 18
makris, сначала нужно получить все байты отчета и преобразовать их в строку. Преобразование делается с помощью Encoding.GetString().

После преобразования данные можно вытянуть регулярками
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
string report = @"------- Xoris - Telemetry Report -------
Humidity: 43.30 %
Temperature: 24.50 *C
Pressure: 99468 mm.rt.st
ALT: 76 metres
------- Xoris - Telemetry Report END ---";
 
 
double humidity = double.Parse(
    Regex.Match(report, @"^Humidity:\s+(\d+(.\d+)?)\s+%", RegexOptions.Multiline).Groups[1].Value,
    CultureInfo.InvariantCulture
);
double temperature = double.Parse(
    Regex.Match(report, @"^Temperature:\s+(\d+(.\d+)?)\s+\*C", RegexOptions.Multiline).Groups[1].Value,
    CultureInfo.InvariantCulture
);
int pressure = int.Parse(
    Regex.Match(report, @"^Pressure:\s+(\d+(.\d+)?)\s+mm\.rt\.st", RegexOptions.Multiline).Groups[1].Value,
    CultureInfo.InvariantCulture
);
int alt = int.Parse(
    Regex.Match(report, @"^ALT:\s+(\d+(.\d+)?)\s+metres", RegexOptions.Multiline).Groups[1].Value,
    CultureInfo.InvariantCulture
);
1
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 15:33  [ТС] 19
Да,но вот преобразование выполнить почему-то не получается,выводит только - и больше ничего,из офф документации узнал что Arduino отправляет данные в COM порт через ASCI2,но увы и для теста решил использовать ваш код,но он к сожалению не работает при его запуске пишет что Входная строка имела неверный формат,и тут я тоже не знаю что делать,ибо с регулярками и регексами кроме как в pawn нигде не работал,да и там мой опыт с ними был около 5-6 строк
0
Миниатюры
Парсинг данных полученных от Arduino через виртуальный COM порт  
0 / 0 / 0
Регистрация: 02.03.2018
Сообщений: 72
23.03.2019, 15:59  [ТС] 20
С получением и конвертом строки разобрался,а вот с регулярками не получилось
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.03.2019, 15:59

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

Парсинг множества документов PDF с сохранением полученных данных в БД
Всем доброго времени суток. Ситуация такая, что у меня есть куча PDF файлов из которых нужно...

Парсинг файлов формата IFC и построение дерева TreeView на основе полученных данных
Всем здрасти! У меня ужасное положение. Мне нужно сдавать проект. Проект парсит файлы формата IFC и...

COM-порт прием данных и парсинг
Всем привет. Прикупил arduino и не могу разобраться с COM портом. Пытаюсь принять данные...

Асинхронная функция которая считывает всего несколько раз данные с микроконтроллера (Arduino) через СОМ порт
Такая проблема: Пишу небольшой проектик (задание:визуализация на диплом). Схема работы должна быть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.