Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 07.04.2021
Сообщений: 9

Проблема с библиотекой SerialPort

07.04.2021, 15:00. Показов 2485. Ответов 12

Студворк — интернет-сервис помощи студентам
Здрасте.

Пытаюсь написать приложение (авиаприборы) для андроида в среде UNITY.
Опыта программирования на СИ-подобных языках - нет.
Немного пишу на Ассемблере для AVR-микроконтроллеров - представление о программировании в целом есть.

Задача:
В COM-Port андроид-устройства поступают бинарные данные
( Посылаю из микроконтроллера пакеты данных с телеметрией, в собственном протоколе. )
Пакеты разделены временными паузами.
На данный момент это два чередующихся пакета. ( В дальнейшем пакетов будет больше )
Каждый пакет имеет двухбайтовый заголовок.

Требуется по приходу пакета, сравнивать CRC, определять тип пакета, расшифровывать данные и выводить на дисплей.
До этого писал ( пытался ) в VisualStudio - там вопросов не возникло с приемом данных ( библиотеки работают )
Но VisualStudio скорей всего не очень подходит для работы с графикой..
В дальнейшем к данным будут привязаны 3D объекты (авиаприборы) - по этому и была выбрана среда UNITY.
Но в Unity проблема с библиотеками работающими с ком-портом. (кастрированная библа Serial-Port'а)
Данные приходится опрашивать вручную..
Хочется, что функция вызывалась по приходу каждого пакета.

На зарубежных форумах пишут, что нужно подключать сторонние либы либо отказываться от юнити...
Полез в сеть искать либы:

Нашел какую то либу от erdemkosk
но ни как не пойму как ее подключить и использовать...
никакой инструкции нет, и опыта нет - и я в тупике
библа тут https://github.com/erdemkosk/U... ortUtility


Потом установил библу Ardity ( ранее назывался SerialCommUnity )
установил, попробовал собрать по примеру, который прилагается в "Setup Guide"
Все работает, все замечательно, НО:
1) данные расшифровываются юникодом, а мне этого не надо - мне бы в HEX
2) программа ждет символов "переноса каретки" (CR+LF) а в моем случае нет таких символов, у меня максимум что есть временная пауза между пакетами, и довольно длительная, в будущем ее может и не стать - я планировал отслеживать сообщения по заголовку пакета...

Ardity (покопавшись нашел внутри нужный скрипт) позволяет читать компорт в хекс-виде и с временным разделителем между сообщениями, но запустить программу с данным кодом я не смог.
Инструкций снова нет, примеров в сети я не нашел и снова в тупике..

Других бесплатных библиотек я не нашел.
Есть платные, есть дорогие и не очень..
Ест платная версия Unity....
Но нигде нет гарантий, что там будет то что мне надо..
А если и будет, то не факт что я быстро с этим разберусь..

В общем я в тупике каком то...

Выслушаю все Ваши предложения...

Unity платный наверное нет смысла...
А вот библу-платную какую то возможно..
А еще бы лучше с примерами того как надо...
Может и Unity не совсем удачная среда ????
Я уж подумывал может задание кинуть на vsesdal.com или author24.ru или kwork.ru и посмотреть кто что предложит...
С одной стороны хочется приложение готовое, с другой стороны хочется самому во всем разобраться.
К тому же допиливать придется многое... Это только начало.
А бюджет совсем небольшой - живу в России - работаю руками..
А это так - хобби..
Заранее всем благодарен.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.04.2021, 15:00
Ответы с готовыми решениями:

SerialPort. Подскажите в чем проблема?
private void buttonSEND_Click(object sender, EventArgs e) { serialport1.open(); serialPort1.Write(new...

Проблема с библиотекой C++
Всем привет, после прочтения 1 главы в книге решил сделать самую простую программку. В итогу я добавил библиотеку...

Проблема с библиотекой Selenium
На сайте в открывающемся окне нужно активировать checkbox, но при выполнении появляется ошибка: raise exception_class(message, screen,...

12
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,075
07.04.2021, 17:49
я так понимаю вам надо просто сделать красивые элементы интерфеиса, что бы вы через них выводили ваши данные? Элементы то на экран можно нарисовать. Тут тоже появятся сложности из за незнания языка с#, не говоря уж о правильнои отправке/получении пакетов. В том что бы получиось так как нужно, нужно работать со скриптами.
Цитата Сообщение от UWRTEY Посмотреть сообщение
Может и Unity не совсем удачная среда ????
Дело не в этом. Один раз вам кто то напишет скрипт. Потом нужен будет второй, третии. За все будете платить? У вас может и не такие сложные проблемы, но если вы не ориетируясь в возможностях языка мечтаете. Что бы библиотеками пользоватьса нужно как минимум понимать как они работают. Библиотеку же не откроешь как текст, что там в ней зашито не посмотришь. Сами пишите инструкции нет. Когда известная библиотека на нее должна быть инструкция. Эту человек сам для себя начал писать, под свои нужды. Поэтому если еще не поздно начните изучать как самому псиать скрипты.
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
07.04.2021, 18:10
Цитата Сообщение от UWRTEY Посмотреть сообщение
(кастрированная библа Serial-Port'а)
В смысле?))
0
0 / 0 / 0
Регистрация: 07.04.2021
Сообщений: 9
07.04.2021, 20:44  [ТС]
Цитата Сообщение от zhunshun Посмотреть сообщение
Эту человек сам для себя начал писать, под свои нужды. Поэтому если еще не поздно начните изучать как самому псиать скрипты.
Я этим и занимаюсь. Уткнулся в то, что не могу нормально работать с SerialPort. Проблема известная - проблема в UNITY.
По этому я тут и прошу помощи...
Я не знаю что мне дальше делать.

Цитата Сообщение от 1max1 Посмотреть сообщение
В смысле?))
ну вот например код
обработчик по приему не срабатывает!

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.IO.Ports; // подключаем либу ком-порта
using Newtonsoft.Json;
 
 
 
class TrumpController : MonoBehaviour
{
 
    // переменные **************************************************************************************
 
 
    private const int DataSize = 2;                                     // размер данных "DataSize" = 2
    private readonly byte[] _bufer = new byte[DataSize];    // массив "_bufer" = "DataSize"
 
    private int _stepIndex;                                                // счетчик байт в массиве
    private bool _startRead;                                              // флаг начала посылки
 
    SerialPort port;                                                           // компорт - "port"
 
 
 
    // Старт вызывается перед обновлением первого кадра ************************************************
 
    void Start()
    {
        Debug.Log("start");                           // выводим в ЛОГ "start"
 
        port = new SerialPort();                    // SerialPort = new SerialPort();
 
 
        try                                                     // настройка ком-порта
        {
            port.PortName = "COM3";            // имя компорта
            port.BaudRate = 57600;              // скорость
            port.DataBits = 8;                       // количество бит
            port.Parity = System.IO.Ports.Parity.None;            // четность
            port.StopBits = System.IO.Ports.StopBits.One;      // стоп бит
            port.Handshake = Handshake.None;                     // заголовок
            port.RtsEnable = false;                                        // RTS
            port.DtrEnable = false;                                        // DTR
            port.ReadTimeout = 10000;                                 // ожидаем чтение (мс)
            port.WriteTimeout = 1000;                                   // ожидаем передачу (мс)
            port.Open();                                                       // закрыть порт
 
            Debug.Log("Port is open");                                  // выводим в ЛОГ "порт открыт"
            port.WriteLine("ff");                                            //Command to start Data Stream
 
            //port.DataReceived += SerialPort_DataReceived;                                                   // вариант написания
            port.DataReceived += new SerialDataReceivedEventHandler(Myport_DataReceived); // настраиваем обработчик по приему
 
 
 
        }
 
 
        catch            // 
        {
            return;     //  возврат
        }
 
 
    }
 
    // Обновление вызывается один раз за кадр ********************************************************
 
    void Update()
    {
        int rx_byte = port.ReadByte();                          // читаем байт в "rx_byte"
        Debug.Log(rx_byte);                                        // выводим в ЛОГ 
    }
 
 
 
    // обработчик события по приему *******************************************************************
 
    //void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)              // вариант написания
    void Myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
 
 
    {
        Debug.Log("мы внутри события");              // В ЛОГ это сообщение не выводится! значит этот код не выполняется!
 
    }
}
примерно этот же код нормально работал в визуал-студии
но в юнити нет.
0
 Аватар для zhunshun
767 / 495 / 216
Регистрация: 05.04.2015
Сообщений: 2,075
07.04.2021, 22:11
Цитата Сообщение от UWRTEY Посмотреть сообщение
примерно этот же код нормально работал в визуал-студии
Может у кого то и работал
UWRTEY, Что у вас дебаглог показывает?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
07.04.2021, 22:13
В консоль ошибки какие-то пишет?
0
0 / 0 / 0
Регистрация: 07.04.2021
Сообщений: 9
07.04.2021, 23:37  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
В консоль ошибки какие-то пишет?
нет.
Я же говорю - проблема известная.
эта функция port.DataReceived += new SerialDataReceivedEventHandler(Myport_Da taReceived)в UNITY не работает
можно лишь побайтно опрашивать порт..

вот пример:

если закоментить "void Update()",
то в логи выводится
"start"
"port is open"
и все... Данные из ком-порта не выводятся ни в каком виде.

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.IO.Ports;
using Newtonsoft.Json;
 
 
 
class TrumpController : MonoBehaviour
{
 
    // переменные **************************************************************************************
 
 
    private const int DataSize = 2;                         // размер данных "DataSize" = 2
    private readonly byte[] _bufer = new byte[DataSize];    // массив "_bufer" = "DataSize"
 
    private int _stepIndex;                                 // счетчик байт в массиве
    private bool _startRead;                                // флаг начала посылки
 
    SerialPort port;                                        // компорт - "port"
 
 
 
    // Старт вызывается перед обновлением первого кадра ************************************************
 
    void Start()
    {
        Debug.Log("start");                                     // выводим в ЛОГ "start"
 
        port = new SerialPort();                                // SerialPort = new SerialPort();
 
 
        try                                                     // настройка ком-порта
        {
            port.PortName = "COM3";                             // имя компорта
            port.BaudRate = 57600;                              // скорость
            port.DataBits = 8;                                  // количество бит
            port.Parity = System.IO.Ports.Parity.None;          // четность
            port.StopBits = System.IO.Ports.StopBits.One;       // стоп бит
            port.Handshake = Handshake.None;                    // заголовок
            port.RtsEnable = false;                             // RTS
            port.DtrEnable = false;                             // DTR
            port.ReadTimeout = 10000;                           // ожидаем чтение (мс)
            port.WriteTimeout = 1000;                           // ожидаем передачу (мс)
            port.Open();                                        // закрыть порт
 
            Debug.Log("Port is open");                          // выводим в ЛОГ "порт открыт"
            port.WriteLine("ff");                                //Command to start Data Stream
 
            //port.DataReceived += SerialPort_DataReceived;       // настраиваем обработчик по приему
            port.DataReceived += new SerialDataReceivedEventHandler(Myport_DataReceived);
 
            //port.Open();                                         // открыть порт
 
 
        }
 
 
        catch                                                   // 
        {
            return;                                             //  возврат
        }
 
 
    }
 
    // Обновление вызывается один раз за кадр ********************************************************
 
   /* void Update()
    {
        int rx_byte = port.ReadByte();                          // читаем байт в "rx_byte"
        Debug.Log(rx_byte);                                     // выводим в ЛОГ 
    }
   */
 
 
    // обработчик события по приему *******************************************************************
 
    //void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
    void Myport_DataReceived(object sender, SerialDataReceivedEventArgs e)
 
 
    {
        Debug.Log("мы внутри события");
 
    }
}
а если раскомментировать "void Update()"
то получаем опрос ком-порта раз за кадр
и в лог выводится побайтный опрос порта.
Но ведь это не удобно.
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
08.04.2021, 00:55
Судя по всему, юнити и правда не дружит с этим https://stackoverflow.com/ques... r-in-unity
0
0 / 0 / 0
Регистрация: 07.04.2021
Сообщений: 9
08.04.2021, 01:43  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Судя по всему, юнити и правда не дружит с этим https://stackoverflow.com/ques... r-in-unity
я это видел...
и не только - вот например тут https://stackoverflow.com/ques... y-in-unity



Вопрос в другом: как быть?
Или в топку юнити или либу стороннюю юзать?
Если не юнити, то что?
Если либу, то какую?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
08.04.2021, 02:34
Опрашивай в апдейте, или это критически неудобно?
0
0 / 0 / 0
Регистрация: 07.04.2021
Сообщений: 9
08.04.2021, 10:03  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Опрашивай в апдейте, или это критически неудобно?
Во первых опыта практически нет и я не представляю как это сделать.
Подобные примеры найти не могу.

Во вторых существуют сторонние библы.
например в Unity-магазине
попробовал бесплатную - "Ardity", работает на "пол шишки" - трабл описал в первом посте.

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

А может Юнити это не та среда, которая мне нужна..
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
08.04.2021, 11:44
Цитата Сообщение от UWRTEY Посмотреть сообщение
А может Юнити это не та среда, которая мне нужна..
Может и так.
0
0 / 0 / 0
Регистрация: 07.04.2021
Сообщений: 9
04.11.2021, 02:34  [ТС]
Ну вот, собственно, организовал побайтное чтение порта.
Программа написана и работает под Виндой.
Пытаюсь скомпилить под андроид, и вроде бы все успешно..
Но увы на андре не считывается порт - проблема известная - пространство имен SerialPort для android выглядит иначе..

Если в настройках Юнити выбирать .NET.2.0 Standart - то выдает ошибку "пространство имен SerialPort"
Если .NET.4 то компилит без проблем.. Игра запускается на андроиде, но данные с порта не поступают.

Добавлено через 1 час 43 минуты
Или может проблема все в другом?
В разрешениях например?

П.С.: другая программа, установленная на андроид получает поток данных без проблем.
как по USB так и по Bluetooth
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.11.2021, 02:34
Помогаю со студенческими работами здесь

Проблема с библиотекой SOIL
Здравствуйте, появилась такая проблема. Не могу загрузить текстуру, как бы я не пытался. Проблема не в самой текстуре, а в библиотеке SOIL....

Проблема с библиотекой VGAX
Есть библиотека VGAX Вот она: https://github.com/smaffer/vgax И в одном из её примеров есть пример "BitFont" При попытке...

Проблема с подключаемой библиотекой
Добрый день. Хочу подключить в проект внешнюю DLL, ругается экзепшном следующего содержания: Работаю в VS2003, операционка...

Проблема с библиотекой theano
Всем привет. Импортирую библиотеки Keras и Theano: import matplotlib.pyplot as plt import numpy as np import pandas as pd import...

Проблема с библиотекой EhLib
Всем привет! В делфи 7 подключил библиотеку EhLib. С её помощью можно, например, более красивый интерфейс у компонент делать. Когда...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru