Grauncontrol. Mavlink. Телеметрия. Авиагоризонт.
| |
uwrtey | Дата: Суббота, 09.01.2021, 22:05 | Сообщение # 16 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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
Статус: 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.
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Понедельник, 11.01.2021, 02:02 | Сообщение # 18 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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
Статус: 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 мс Воооооо :D :D это уже похоже на правду !!!!!
Так делают хаккеры?
К сообщению прикрепил захват протокола МАВЛинк
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Пятница, 15.01.2021, 23:52 | Сообщение # 20 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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
Статус: 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
Статус: 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
Теперь не помешало бы разобраться с математикой, ведь писать будем на ассемблере, а готовую библиотеку фиг найдешь!
расчет методом побитового сдвига
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Понедельник, 01.02.2021, 01:10 | Сообщение # 23 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| подпрограмма вычисления CRC_16-MCRF4XX из одного байта
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Вторник, 09.02.2021, 02:59 | Сообщение # 24 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Годные пакеты для теста
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Воскресенье, 28.02.2021, 20:15 | Сообщение # 25 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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
Статус: 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
Статус: 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
Статус: Offline
| конвертор протокола MavMegaConverter ( 03/апреля/2021)
протокол назовем MavConvLink (31/июля/2021)
программу в Unity назовем Vulture EFIS
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Понедельник, 26.07.2021, 22:44 | Сообщение # 29 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| https://stackoverflow.com/questio....ication
Цитата Я видел много людей, сообщающих о проблемах с SerialDataReceivedEventHandler . Я уверен, что SerialPort.BytesToRead работает. Вы можете забыть о SerialDataReceivedEventHandler и вместо этого реализовать свою собственную систему событий с помощью SerialPort.BytesToRead . Как это сделать: В вашей системе событий должно быть два события. Один, к которому НЕЛЬЗЯ получить доступ из вашего приложения (событие A), и один, к которому можно получить доступ из вашего приложения (событие . Для события А вы должны добавить SerialPort.BytesToRead для вызова события А, когда SerialPort.BytesToRead изменяет свое значение. Когда вызывается событие A , оно проверяет, больше ли SerialPort.BytesToRead нуля. Если SerialPort.BytesToRead больше 0, то у вас есть новые данные для чтения , а затем события B должны быть запускаемые события A . Если SerialPort.BytesToRead равен 0, событие B не запускается . Затем вы можете реализовать событие B из своего приложения и дождаться его запуска. Когда он срабатывает, вы можете прочитать оттуда новые полученные данные. Я видел много людей, сообщающих о проблемах с SerialDataReceivedEventHandler . Я уверен, что SerialPort.BytesToRead работает. Вы можете забыть о SerialDataReceivedEventHandler и вместо этого реализовать свою собственную систему событий с помощью SerialPort.BytesToRead . Как это сделать: В вашей системе событий должно быть два события. Один, к которому НЕЛЬЗЯ получить доступ из вашего приложения (событие A), и один, к которому можно получить доступ из вашего приложения (событие . Для события А вы должны добавить 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
Статус: Offline
| проект dyadica // в феврале 2022г автор добавил многопоточность https://github.com/dyadica https://www.youtube.com/watch?v=SyV941iTRvU
не успеваю за своими мыслями......
|
|
| |
|