Среда, 01.05.2024, 01:49
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Grauncontrol. Mavlink. Телеметрия. Авиагоризонт. - Страница 2 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 7
  • «
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • »
Модератор форума: ВитГо  
Форум » Разработка электронных устройств » Идеи ! » Grauncontrol. Mavlink. Телеметрия. Авиагоризонт. (Mavlink, ADS-B, Mission Planer, EFIS, PFD)
Grauncontrol. Mavlink. Телеметрия. Авиагоризонт.
uwrteyДата: Суббота, 09.01.2021, 22:05 | Сообщение # 16
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
теперь задача научить ГУ понимать протокол MAVLINK
https://mavlink.io/en/guide/serialization.html#v1_packet_format

Пакет может содержать от 8 до 263 бит

0, первый байт - стартовый - всегда FE
1, второй - длина полезной нагрузки - от 0 до 255
2, третий - порядковый номер пакета - от 0 до 255 ( всего 256 пакетов что ли ? или зацикливается ? )
3, четвертый - ID ардупилота, отправляющей сообщение от 1 до 255 байт ( либо по умолчанию, либо настраивается )
4, пятый - ID компонента, отправляющего сообщение ( автопилот или подвес например )
5, шестой - ID типа сообщения в полезной нагрузке. ( тангаж, курс, крен, GPS или воздушная скорость ).
От 7 до (n + 7) - полезная нагрузка - содержит от 0 до 255 байт
(n + 7) и (n + 8) - чек-сумм ( CRC-16 / MCRF4XX для сообщения (за исключением magicбайта). Включает байт CRC_EXTRA . )

Думаю что эта запись полный бред:
От 7 до (n + 7)
Так как полезная нагрузка может не содержать ничего и не занимать ни одного байта ( n = число байт в полезной нагрузке )
При такой записи, получается, что при полезной нагрузке равной 0 байт, порядковый номер полезной нагрузки будет равен 7, но на самом деле он не будет равен ничему...

Как раскодировать полезную нагрузку

(байт №5) идентификатор сообщения определяет конкретное сообщение, закодированное в пакете.


не успеваю за своими мыслями......
 
uwrteyДата: Воскресенье, 10.01.2021, 02:41 | Сообщение # 17
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
GitHab репозиторий ArduPilotMavlink https://github.com/ArduPilot/mavlink

GitHab репозиторий Mawlink Mavlink https://github.com/mavlink/mavlink

Википедия на Английском - https://en.wikipedia.org/wiki/MAVLink

таблица на оф.сайте
ardupilotmega https://mavlink.io/en/messages/ardupilotmega.html
standart (common) https://mavlink.io/en/messages/common.html

дайдронес https://diydrones.com/group/arducopterusergroup/forum

============================================================

Вот тут есть пояснения по Message ID - https://mavlink.io/en/messages/common.html
Правда там не все. Выборочно что ли
MAVLINK Common Message Set ключевое слово Common

============================================================

после знака "#" указано десятичное число !!!! нет бы hex-ом сразу указать.....

ATTITUDE ( #30 ) hex = 1e авиагоризонт
he attitude in the aeronautical frame (right-handed, Z-down, X-front, Y-right).

time_boot_ms = uint32_t = ms == Timestamp (time since system boot). ( время с момента загрузки системы )
roll ======== float === rad == Roll angle (-pi..+pi)
pitch ======= float === rad == Pitch angle (-pi..+pi)
yaw ======= float === rad == Yaw angle (-pi..+pi)
rollspeed ==== float === rad/s = Roll angular speed
pitchspeed === float === rad/s = Pitch angular speed
yawspeed === float === rad/s = Yaw angular speed

ATTITUDE_QUATERNION ( #31 ) hex = 1f авигоризонт выраженный в кватернионах
The attitude in the aeronautical frame (right-handed, Z-down, X-front, Y-right), expressed as quaternion.
Quaternion order is w, x, y, z and a zero rotation would be expressed as (1 0 0 0).

LOCAL_POSITION_NED ( #32 ) hex = 20 - локальные координаты ( от места старта ) из полезного высота над точкой старта
The filtered local position (e.g. fused computer vision and accelerometers).
Coordinate frame is right-handed, Z-axis down (aeronautical frame, NED / north-east-down convention)

GLOBAL_POSITION_INT ( #33 ) hex = 21 - глобальные координаты
The filtered global position (e.g. fused GPS and accelerometers). The position is in GPS-frame (right-handed, Z-up).
It is designed as scaled integer message since the resolution of float is not sufficient.
Прикрепления: common.zip (268.2 Kb)


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 11.01.2021, 02:02 | Сообщение # 18
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Рассмотрим пакет MAVLink
FE 1C E2 01 01 1E EE 3B 00 00 A0 10 57 3B 75 F5 10 BD 4B D0 21 40 59 95 94 B9 DC 80 4B BA 9E C7 8A B9 7B 1D

FE = начало пакета
1C = 28 байт в полезной нагрузке
E2 = 226 порядковый номер сообщения
01 = ID автопилота ( у нас один автопилот, по умолчанию единица )
01 = ID компонента ( у нас всего один компонент - автопилот )
1E = 30 ( табличный номер ATTITUDE #30 )
EE 3B 00 00 A0 10 57 3B 75 F5 10 BD 4B D0 21 40 59 95 94 B9 DC 80 4B BA 9E C7 8A B9 = полезная нагрузка ( 28 байт )
7B 1D = контрольная сумма

Теперь нужно расшифровать полезную нагрузку

EE 3B 00 00 A0 10 57 3B 75 F5 10 BD 4B D0 21 40 59 95 94 B9 DC 80 4B BA 9E C7 8A B9

Так как каждый параметр по 4 байта получаем такое сообщение:

hex-> EE3B0000 A010573B 75F510BD 4BD02140 599594B9 DC804BBA 9EC78AB9

Но так как байты поступали наоборот, то в параметрах их нужно поменять местами ( поступали младшим байтом вперед )

hex-> 00003BEE 3B5710A0 BD10F575 4021D04B B9949559 BA4B80DC B98AC79E

Теперь это нужно перевести в человекопонятный вид

float переводим тут:
https://www.scadacore.com/tools....nverter

float wiki https://ru.wikipedia.org/wiki....2%D0%B8
radiokot https://radiokot.ru/forum/viewtopic.php?f=21&t=174916

а затем полученные значения радиан преобразуем в градусы
например яндекс-калькулятором

Порядок параметров определен экспериментально! Он соответствует табличному значению.

time_boot_ms = uint32_t = ms
roll ======== float=== rad
pitch ======= float=== rad
yaw ======= float=== rad
rollspeed ==== float=== rad/s
pitchspeed === float === rad/s
yawspeed === float === rad/s

вычисляем:

EE3B0000 => 00003BEE = 15342 миллисекунд с момента старта микроконтроллера
A010573B => 3B5710A0 = 0.00328163058 радиан = 0,19 градусов
75F510BD => BD10F575 = -0.0353903361 радиан = -2,03 градуса
4BD02140 => 4021D04B = 2.52833819 радиан = 144,86 градуса ( по магнитному компасу )
599594B9 => B9949559 = -0.000283400324 рад/сек = -0,02 гр/сек
DC804BBA => BA4B80DC = -0.0007763037 рад/се = -0,04 гр/сек
9EC78AB9 => B98AC79E = -0.000264701375 рад/сек= -0,02 гр/сек


не успеваю за своими мыслями......
 
uwrteyДата: Вторник, 12.01.2021, 03:41 | Сообщение # 19
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline

Как определить какая последовательность параметров?
И как определить как отправляются параметры - старшим байтом вперед или младшим?


Идея такая
берем два пакета, следующих друг за другом, в которых имеется параметр времени с момента старта контроллера

пример выдернул из потока MAVLink:
FE 1C 0F 01 01 1E DD 40 00 00 BD 08 3D 3B A8 43 0F BD 32 16 22 40 34 F1 06 3A 08 62 B7 37 6F 22 0B BA E9 CA
FE 1C 10 01 01 21 2D 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 B0 38 6C B9

1E = ATTITUDE ( #30 )
21 = GLOBAL_POSITION_INT ( #33 )

Оба пакета содержат информация о времени
DD 40 00 00 BD 08 3D 3B A8 43 0F BD 32 16 22 40 34 F1 06 3A 08 62 B7 37 6F 22 0B BA
2D 41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0A 00 00 00 00 00 00 00 00 00 B0 38

предположим, что параметр time_boot_ms находится в начале посылки
DD400000 - 3711959040
2D410000 - 759234560
не похоже это на правду, попробуем записать байты наоборот
000040DD - 16605 мс
0000412D - 16685 мс
Воооооо biggrin :D biggrin :D biggrin это уже похоже на правду !!!!!

Так делают хаккеры? biggrin cool

К сообщению прикрепил захват протокола МАВЛинк
Прикрепления: 9915562.txt (27.4 Kb)


не успеваю за своими мыслями......
 
uwrteyДата: Пятница, 15.01.2021, 23:52 | Сообщение # 20
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Контрольная сумма

16 бит ( 2 байта ) CRC-16/MCRF4XX

википедия
https://ru.wikipedia.org/wiki....E%D0%B4

По условию МАВЛинк:
For message (excluding magic byte). Includes CRC_EXTRA byte.
Для сообщения (исключая магический байт). Включает ДОПОЛНИТЕЛЬНЫЙ байт CRC.
Магическим байтом они называют стартовый байт "FE"
"ДОПОЛНИТЕЛЬНЫЙ байт CRC" для данного пакета = 0x27 ( для каждого пакета свой байт - смотреть в таблице )

калькулятор CRC:
https://crccalc.com/

Пример:
Есть пакет: FE 1C F5 01 01 1E 5B 59 00 00 5F C3 4F 3B 69 2E 0F BD DB 33 22 40 EF 8A 4A 3A 7A FF 74 B9 51 37 06 BA 33 67

В котором последние 2 байта - контрольная сумма 0x3367
( хотя, скорей всего, они записаны младшим байтом вперед, то-есть = 0x6733 )

Первый байт FE - заголовок, и по условию* он не считается в контрольную сумму.

Остается: 1C F5 01 01 1E 5B 59 00 00 5F C3 4F 3B 69 2E 0F BD DB 33 22 40 EF 8A 4A 3A 7A FF 74 B9 51 37 06 BA

( 1CF501011E5B5900005FC34F3B692E0FBDDB332240EF8A4A3A7AFF74B9513706BA+27 ) - в калькулятор вводим без пробела и без плюса - результат 0x6733

***************************

форумы:
радиокот https://radiokot.ru/forum/viewtopic.php?f=21&t=174996
ГитХаб https://github.com/mavlink/mavlink/issues/30

***************************
Цитата

Экстракция CRC защищает пакет от декодирования другой версии того же пакета, но с другими переменными. Это средство гарантирует, что случайное смешение диалектов или версий MAVLink никогда не приведет к неверной интерпретации данных.

Они определены в каждом файле диалекта, например, в common.h или pixhawk.h. Это пример из common.h:

#ifndef MAVLINK_MESSAGE_CRCS
#define MAVLINK_MESSAGE_CRCS {50, 124, 137, 0, 237, 217, 104, 119, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 214, 159, 220, 168, 24, 23, 170, 144, 67, 115, 39, 246, 185, 104, 237, 244, 222, 212, 9, 254, 230, 28, 28, 132, 221, 232, 11, 153, 41, 39, 214, 223, 141, 33, 15, 3, 100, 24, 239, 238, 30, 200, 183, 0, 130, 0, 148, 21, 0, 52, 124, 0, 0, 0, 20, 0, 152, 143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 231, 183, 63, 54, 0, 0, 0, 0, 0, 0, 0, 175, 102, 158, 208, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 49, 170, 44, 83, 46, 0}
#endif

Это кодировка сообщения:

контрольная сумма = crc_calculate ((uint8_t *) & msg-> len, length + MAVLINK_CORE_HEADER_LEN);
#if MAVLINK_CRC_EXTRA
crc_accumulate (crc_extra, & контрольная сумма);
#endif
mavlink_ck_a (msg) = (uint8_t) (контрольная сумма & 0xFF);
mavlink_ck_b (msg) = (uint8_t) (контрольная сумма >> 8);

Вы видите, что к контрольной сумме добавляется полная полезная нагрузка плюс заголовок, так как все, начиная с поля "len", берется в контрольную сумму:

typedef struct __mavlink_message {
uint16_t контрольная сумма; /// отправлено в конце пакета
uint8_t magic; /// <магический маркер протокола
uint8_t len; /// <Длина полезной нагрузки
uint8_t seq; /// <Последовательность пакета
uint8_t sysid; /// <ID системы отправителя сообщения / самолета
uint8_t compid; /// <ID компонента отправителя сообщения
uint8_t msgid; /// <ID сообщения в полезной нагрузке
uint64_t payload64 [(MAVLINK_MAX_PAYLOAD_LEN + MAVLINK_NUM_CHECKSUM_BYTES + 7) / 8];
} mavlink_message_t;

Таким образом, вы должны вычислить контрольную сумму по полному заголовку, всем байтам полезной нагрузки и, наконец, добавить байт CRC_EXTRA. Это должно дать вам тот же результат.


подглядел код на СИ в стандартной либе
Страно откуда взялось число 0xf0b8 - https://github.com/mavlink/c_library_v2/blob/master/checksum.h
#define X25_INIT_CRC 0xffff
#define X25_VALIDATE_CRC 0xf0b8


не успеваю за своими мыслями......
 
uwrteyДата: Суббота, 16.01.2021, 04:03 | Сообщение # 21
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Float to HEX

Float - Big Endian (ABCD)

калькулятор https://www.scadacore.com/tools....nverter

Вики: https://ru.wikipedia.org/wiki....2%D0%B8

Пример: float BD10F575 = ( -0.0353903361 )

Математика:

переводим в бинарный вид:
BD10F575 = 1011 1101 0001 0000 1111 0101 0111 0101

"Знак числа" - старший символ - "1" значит число отрицательное

"Порядок" - (восемь следующих (старших) символов ) 01111010 ( dec 122 ) ( xeh 0x7a )

"Степень" - Что бы вычислить степень, нужно из "порядка" вычесть число 127 -> 122-127= -5

"Мантисса" - ( оставшиеся 23 символа ) 001 0000 1111 0101 0111 0101 - являются дробной частью. Целой частью мантиссы всегда является единица
0b1,001 0000 1111 0101 0111 0101

Результат: произведение мантисса на двойку_в степени "порядка"
0b1,001 0000 1111 0101 0111 0101 умножить на 2 в минус пятой степени

Округление до трех знаков после запятой:
0b1,001 0000 1111 0101 0111 0101 -> 0b1,001

Расчет:
0b1,001 умножить на 2 в минус пятой степени
// сдвигаем запятую у мантиссы вправо на 3 знака, при этом степень уменьшится на 3 ( -5-3=-7 )
0b1001 умножить на 2 в минус восьмой степени
// переводим двоичное число в десятичный вид
9 умножить на 2 в минус восьмой степени
// считаем степень
9 умножить на 0,00390625 = 0,03515625
// И не забываем знак ( в нашем случае отрицательный ) -0,03515625

Итог: ( -0,03515625 ) - отличается от ( -0.0353903361 ), но точность в 2 знака меня более чем устроит...

===============
Без округления
===============

0b1,001 0000 1111 0101 0111 0101

Расчет:
0b1,001 0000 1111 0101 0111 0101 умножить на 2 в минус пятой степени
// сдвигаем запятую у мантиссы вправо на 23 знака, при этом степень уменьшится на 23 (-5-23=-28)
0b1001 0000 1111 0101 0111 0101 умножить на 2 в минус_28 степени
// переводим двоичное число в десятичный вид
9500021 умножить на 2 в минус_28 степени
// считаем степень
9500021 умножить на 3,725290298461914e-9 = 0,03539033608
// И не забываем знак ( в нашем случае отрицательный ) -0,03539033608
// сравниваем результат с тем что дано по условию 0,03539033608 и 0.0353903361 -> результат превзошел условие !


не успеваю за своими мыслями......
 
uwrteyДата: Воскресенье, 17.01.2021, 05:49 | Сообщение # 22
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Контрольная сумма

CRC – это остаток от деления сообщения на константу.

Name CRC-16/MCRF4XX
Width 16 ( ширина )
Poly 0x1021 ( многочлен ) dec 4129 или 0b 0001 0000 0010 0001 -> инверсия порядка битов 0b 1000 0100 0000 1000 0x8408
Check 0x6F91 // dec 28561 0b110111110010001
Init 0xFFFF ( начальный ) dec 65535 или 0b1111111111111111
RefIn true
RefOut true
XorOut 0x0
Check 0x6F91 dec 28561 или 0b110111110010001

тут помогли https://radiokot.ru/forum/viewtopic.php?f=21&t=174996
нужно из таблицы брать значение #30+1 это такое смещение получается


результаты контрольной суммы пошагово

FE 1C F5 01 01 1E 5B 59 00 00 5F C3 4F 3B 69 2E 0F BD DB 33 22 40 EF 8A 4A 3A 7A FF 74 B9 51 37 06 BA 33 67

0x27 = crc-extra

1C F5 01 01 1E 5B 59 00 00 5F C3 4F 3B 69 2E 0F BD DB 33 22 40 EF 8A 4A 3A 7A FF 74 B9 51 37 06 BA 27

data:0x1c crc:0xffff -> 0xd56a
data:0xf5 crc:0xd56a -> 0x6cab
data:0x01 crc:0x6cab -> 0x0a3c
data:0x01 crc:0x0a3c -> 0xea6c
data:0x1e crc:0xea6c -> 0x507f
data:0x5b crc:0x507f -> 0x6776
data:0x59 crc:0x6776 -> 0xd992
data:0x00 crc:0xd992 -> 0xb742
data:0x00 crc:0xb742 -> 0x61a1
data:0x5f crc:0x61a1 -> 0x1e90
data:0xc3 crc:0x1e90 -> 0x6000
data:0x4f crc:0x6000 -> 0xba93
data:0x3b crc:0xba93 -> 0x29f8
data:0x69 crc:0x29f8 -> 0x8529
data:0x2e crc:0x8529 -> 0x743a
data:0x0f crc:0x743a -> 0x665a
data:0xbd crc:0x665a -> 0x93d7
data:0xdb crc:0x93d7 -> 0xcaff
data:0x33 crc:0xcaff -> 0x0caa
data:0x22 crc:0x0caa -> 0x084c
data:0x40 crc:0x084c -> 0xca64
data:0xef crc:0xca64 -> 0x3a11
data:0x8a crc:0x3a11 -> 0x2a60
data:0x4a crc:0x2a60 -> 0x8e72
data:0x3a crc:0x8e72 -> 0xcec2
data:0x7a crc:0xcec2 -> 0x390d
data:0xff crc:0x390d -> 0xd4a4
data:0x74 crc:0xd4a4 -> 0xd659
data:0xb9 crc:0xd659 -> 0xe7d8
data:0x51 crc:0xe7d8 -> 0x192e
data:0x37 crc:0x192e -> 0x8d59
data:0x06 crc:0x8d59 -> 0xaaff
data:0xba crc:0xaaff -> 0x1503
index of MAVLINK_MESSAGE_CRCS:0x1e crc_extra:0x27
data:0x27 crc:0x1503 -> 0x6733

Теперь не помешало бы разобраться с математикой, ведь писать будем на ассемблере, а готовую библиотеку фиг найдешь!

расчет методом побитового сдвига

Прикрепления: 5941868.jpg (92.9 Kb) · 7051134.jpg (108.1 Kb)


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 01.02.2021, 01:10 | Сообщение # 23
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
подпрограмма вычисления CRC_16-MCRF4XX из одного байта
Прикрепления: CRC_16-MCRF4XX.zip (1.5 Kb)


не успеваю за своими мыслями......
 
uwrteyДата: Вторник, 09.02.2021, 02:59 | Сообщение # 24
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Годные пакеты для теста


не успеваю за своими мыслями......
 
uwrteyДата: Воскресенье, 28.02.2021, 20:15 | Сообщение # 25
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Формируем пакет на отправку

#30 Attitude (17 байт)
FE 01 1E roll, pitch, yaw, CRC

roll - 4 байта
pitch - 4 байта
yaw - 4 байта
CRC - 2 байта

#74 VFR_HUD (23 байт )
FE 01 4A Air_speed, Grownd_speed, Route, Alt, Climb, CRC

Air_speed - 4 байта ------------------( метры в секунду )
Grownd_speed - 4 байта --------------( метры в секунду )
Route /HEADING/ (курс) - 2 байта ----( без GPS показывает постоянно меняющиеся числа, с GPS - не проверял )
Alt (высота) - 4 байта ---------------( в метрах, высота над домашней точкой - доступно после арминга)
Climb (скороподъемность) - 4 байта --( метры в секунду )
CRC - 2 байта

CRC расчитываем только для полезной нагрузки


не успеваю за своими мыслями......
 
uwrteyДата: Четверг, 04.03.2021, 03:33 | Сообщение # 26
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Пример приема, переделки и передачи пакета
FE 1C F5 01 01 1E 5B 59 00 00 5F C3 4F 3B 69 2E 0F BD DB 33 22 40 EF 8A 4A 3A 7A FF 74 B9 51 37 06 BA 33 67
FE 01 1E 5F C3 4F 3B 69 2E 0F BD DB 33 22 40 7E 2F

проверим расчет CRC для калькулятором:
калькулятор https://crccalc.com/
строка: 5F C3 4F 3B 69 2E 0F BD DB 33 22 40
Результат: 0x2F7E
все верно!

результат тестирования при прослушивании потока данных MAVLINK


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 15.03.2021, 02:07 | Сообщение # 27
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Visual Studio C#: работа с последовательным портом
http://microsin.net/program....rt.html

https://docs.microsoft.com/ru-ru....ext-3.1

DataReceivedСобытие также вызывается при получении символа EOF,
независимо от числа байтов во внутреннем входном буфере и значения ReceivedBytesThreshold Свойства.

Ха-Ха, вычитал, что UNITY корявка - не умеет толком работать с компортом. Работает только функция рид-байт.
Тут либо в ручную чтение организовать, либо отказаться от UNITY
https://gamedev.ru/code/forum/?id=192854&page=1

Цитата
Некоторые пользователи используют backgroundworkerthread для чтения / записи в последовательный порт, не блокируя цикл Update () Unity.


https://stackoverflow.com

плагин NuGet
https://www.youtube.com/watch?v=GRn49ehm_pI

плагин SPUP ( для Андройд он платный )
https://portutility.com/wp-content/uploads/2018/11/SPUP_UserManual.pdf

библиотека erdemkosk
https://github.com/erdemkosk/Unity-SerialPortUtility

использование сторонних библиотек
Цитата

Так как юнити использует свой компилятор, студия используется только как текстовый редактор и средство отладки, не более.
Если вы подключаете dll, то вам нужно просто положить ее в папку Plugins (не обязательно, просто так удобнее).
Если вы подключаете библиотеку из исходников, то просто кладете код в папку на ваше усмотрение и используете.
Вы так же можете собрать динамически подключаемую библиотеку (dll) из исходников сами, используя, к примеру, Visual Studio.


не успеваю за своими мыслями......
 
uwrteyДата: Суббота, 27.03.2021, 14:22 | Сообщение # 28
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
конвертор протокола MavMegaConverter ( 03/апреля/2021)

протокол назовем MavConvLink (31/июля/2021)

программу в Unity назовем Vulture EFIS


не успеваю за своими мыслями......
 
uwrteyДата: Понедельник, 26.07.2021, 22:44 | Сообщение # 29
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
https://stackoverflow.com/questio....ication
Цитата

Я видел много людей, сообщающих о проблемах с SerialDataReceivedEventHandler . Я уверен, что SerialPort.BytesToRead работает. Вы можете забыть о SerialDataReceivedEventHandler и вместо этого реализовать свою собственную систему событий с помощью SerialPort.BytesToRead .

Как это сделать:

В вашей системе событий должно быть два события. Один, к которому НЕЛЬЗЯ получить доступ из вашего приложения (событие A), и один, к которому можно получить доступ из вашего приложения (событие cool .

Для события А вы должны добавить SerialPort.BytesToRead для вызова события А, когда SerialPort.BytesToRead изменяет свое значение.

Когда вызывается событие A , оно проверяет, больше ли SerialPort.BytesToRead нуля. Если SerialPort.BytesToRead больше 0, то у вас есть новые данные для чтения , а затем события B должны быть запускаемые события A . Если SerialPort.BytesToRead равен 0, событие B не запускается .

Затем вы можете реализовать событие B из своего приложения и дождаться его запуска. Когда он срабатывает, вы можете прочитать оттуда новые полученные данные.
Я видел много людей, сообщающих о проблемах с SerialDataReceivedEventHandler . Я уверен, что SerialPort.BytesToRead работает. Вы можете забыть о SerialDataReceivedEventHandler и вместо этого реализовать свою собственную систему событий с помощью SerialPort.BytesToRead .

Как это сделать:

В вашей системе событий должно быть два события. Один, к которому НЕЛЬЗЯ получить доступ из вашего приложения (событие A), и один, к которому можно получить доступ из вашего приложения (событие cool .

Для события А вы должны добавить SerialPort.BytesToRead для вызова события А, когда SerialPort.BytesToRead изменяет свое значение.

Когда вызывается событие A , оно проверяет, больше ли SerialPort.BytesToRead нуля. Если SerialPort.BytesToRead больше 0, то у вас есть новые данные для чтения , а затем события B должны быть запускаемые события A . Если SerialPort.BytesToRead равен 0, событие B не запускается .

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


не успеваю за своими мыслями......
 
uwrteyДата: Среда, 28.07.2021, 21:50 | Сообщение # 30
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
проект dyadica // в феврале 2022г автор добавил многопоточность
https://github.com/dyadica
https://www.youtube.com/watch?v=SyV941iTRvU


не успеваю за своими мыслями......
 
Форум » Разработка электронных устройств » Идеи ! » Grauncontrol. Mavlink. Телеметрия. Авиагоризонт. (Mavlink, ADS-B, Mission Planer, EFIS, PFD)
  • Страница 2 из 7
  • «
  • 1
  • 2
  • 3
  • 4
  • 6
  • 7
  • »
Поиск:


Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz