Просмотр сообщений
|
Страниц: 1 ... 3 4 [5] 6 7 ... 38
|
61
|
Qt / Общие вопросы / Re: Проблемы с VCP в Windows
|
: Август 05, 2021, 06:03
|
ЗЫ: Я больше не занимаюсь сериал портом, не сопровождаю его. Так что спрашивай у кутешников теперь к ним все претензии
Я знаю, что ты съехал с сериалПорт-а, это притензия не к тебе, да и вообще это не притензия, это проблема, и может кто уже с такой проблемой сталкивался и как-то её решил?
|
|
|
62
|
Qt / Общие вопросы / Re: Проблемы с VCP в Windows
|
: Август 04, 2021, 13:51
|
через WinAPI функции
Точно! WinAPI!!! Запустил свою старую утилиту, там компорт поднят на WinAPI. кагбэ в 3-х строчках код такой if(openPort(cbSerialPorts->currentText()) { do { ReadFile(port, buffer, 1, &BytesCnt, NULL);//читаем из порта 1 байт if(BytesCnt == 1) good(); }while(timeOut); closePort();//закрыть порт } timeOut заряжен на 10...100 секунд. компорт в WinAPI заряжен на 1...10 сек COMMTIMEOUTS ct; ct.ReadTotalTimeoutConstant=1000;//10000 Если дернуть усб во время ReadFile, то через ReadTotalTimeoutConstant миллисекунд ReadFile() вернёт 0 в BytesCnt. потом, по do повторный вызов ReadFile().... через ReadTotalTimeoutConstant мс ReadFile() возвращяет 0 в BytesCnt.... и так по кругу, пока через timeOut не выйдем из do-while. После этого порт закрывается closePort(). Если воткнуть железку обратно и опять запустить прогу (хоть на WinAPI, хоть на QSerialPort), то компорт ни кем не занят, открывается и работает. Т.е. при использовании WinAPI таких траблов в маздае нет, а с QSerialPort есть. (((
|
|
|
63
|
Qt / Общие вопросы / Re: Проблемы с VCP в Windows
|
: Август 04, 2021, 08:47
|
ну да ладно.... не хочешь работать по СОМ30, переименовать в СОМ31 и открыть СОМ31.... такое чувство, что после закрытия QSerialPort и самой программы компорт продолжает оставаться открытым
|
|
|
64
|
Qt / Общие вопросы / Проблемы с VCP в Windows
|
: Август 04, 2021, 08:39
|
Программа через USB-VCP общается с железкой. Для СОМ порт используется QSerialPort. Подключил железку по USB, в винде появился COM порт, запустил программу, открыл порт - работаешь. Закрыл порт, закрыл программу.... Всё прекрасно... до тех пор, пока не дёрниш USB при открытом порте в программе. Естественно в программе прекращается обмен данными. А вот дальше проблема: закрыл компорт в программе (остановил обмен), подключил USB обратно, снова появился VCP, в программе пытаюсь открыть СОМ порт - получаю ошибку открытия порта. Запускаю другую программу, пытаюсь открыть порт - ошибка открытия порта. В общем в системе (в диспетчере устройств) СОМ порт есть, но ни одна программа его открыть не может.
1) Как это лечится? 2) Можно как-то автоматически определить в программе (в QSerialDevice) что открыты СОМ порт более в системе не существует и сделать принудительное закрытие порта?
ps Windows 7 64
|
|
|
65
|
Qt / Общие вопросы / Вопрос юзеру из не gui потока
|
: Май 13, 2021, 14:55
|
в не gui потоке идет обработка данных. При встрече определенных данных, нужно приостановить обработку, спросить пользователя "Быть?" или "Не быть?" и по результату ответа ветвиться в обработке дальше.
В голове куча "велосипедов".... Как это правильно и легко сделать? Есть пример/ссылка?
|
|
|
66
|
Qt / Вопросы новичков / Re: Получить указатель на главное окно
|
: Апрель 28, 2021, 12:47
|
Затем, что ...
Не горячитесь Не надо бросаться доказывать что Вы (и только Вы) правы. Вы и так это знаете, Ваша правота от Вас никуда не убежит. Гораздо полезнее посмотреть какие еще есть решения. я ваш вариант не отбрасываю, это вы мой баните и пытаетесь мне доказать, что мой путь плох. ))... Я вам про ваш код ни слова не сказал. Вариантов много... какой лучше - и всё зависит от реализации app. По мне, так вообще, если маинВиндоу сделал дочку, то ни какие поиски, дополнительные члены дочке или QApplication::topLevelWidgets() не нужны. Есть QWidget::parentWidget() - необходимо и достаточно. Но если есть дочки/внучки... если создатель не маинвиндоу... то тогда озвучено несколько вариантов.
|
|
|
67
|
Qt / Вопросы новичков / Re: Получить указатель на главное окно
|
: Апрель 28, 2021, 11:38
|
Зачем дочке еще член если он и так есть (парент)? И если это не дочка а внучка? Вы сами ответили на свой вопрос. Затем, что парентом может быть далеко не главное окно. Хоть внучка, хоть правнучка.... до 100 степени родства поколения - передать ссылку на Адама на главное окно, потом всегда можно напрямую обратиться к Путину, минуя министров к главному окну минуя парентов, без лишних розысков и проверок. ))
|
|
|
68
|
Qt / Вопросы новичков / Re: Получить указатель на главное окно
|
: Апрель 28, 2021, 11:12
|
Если же все-таки "ну вот надо", то можно напр так
при рождении дочери создании дочернего окна сообщить мать её передать указатель/ссылку на главное окно (или сообщить потом сеттером) и дочке запомнить указатель/ссылку в своих приватах.
|
|
|
69
|
Qt / Вопросы новичков / Re: Получить указатель на главное окно
|
: Апрель 28, 2021, 10:39
|
Как обращаться к функциям главного окна из дочерних окон? Ни как. ИМХО. Нефиг детям соваться в родительскую спальню. Запускайте из дочерних окон сигнал, в родительских обрабатывайте слотами.
|
|
|
70
|
Программирование / С/C++ / Re: чтение и запись битовых структур данных
|
: Апрель 28, 2021, 06:43
|
0 или -1? ответом будет: untitled 2:4:11: error: initializing multiple members of union float f{0}; ^ untitled 2:3:9: note: previous initialization is here int i{0}; ^ 1 error generated. пффф.... вопрос - что вернёт функция? Функция вернёт 0. А ваша ошибка компиляции из-за инициализации юниона, а не из-за использования. К использованию иниона отношения не имеет... ещё пропустите в примере символ ";" и на основании ошибки компиляции отправте юнион в топку. union U { int i{0}; float f; }; Тут нет ошибки.
|
|
|
72
|
Программирование / С/C++ / Re: чтение и запись битовых структур данных
|
: Апрель 27, 2021, 13:08
|
То есть можно скопировать буфер в структуру через memcpy а вот записать int64_t а потом прочитать из битфилда на него наложеннный - нет. Но да, все известные мне компиляторы это позволяют делать. Но clang-tidy ругается AFAIK
А в чем косяк такого метода? Я понимаю когда объединили int и long. Но когда int и uint uint32_t и float - за каким углом, в какой архитектуре и с каким компилятором может быть подвох? Это не то, чтобы "в с/с++ это предусмотрено и так нужно делать", это безопасный лайфхак. Если размер битовой структры 64 бита, и объединённого члена 64 бита, то компилятор не то что не позволит это сделать, или что-то испортит - а куда он денется с подводной лодки?
|
|
|
73
|
Программирование / С/C++ / Re: чтение и запись битовых структур данных
|
: Апрель 27, 2021, 11:11
|
писать в одно поле юниона, а читать из другого законно только в С, в С++ же: It's undefined behavior to read from the member of the union that wasn't most recently written. Many compilers implement, as a non-standard language extension, the ability to read inactive members of a union. оно может и работает в clang/gcc/msvc, но полагаться на это не хочется Писать в одно поле юниона, а читать из другово (в моих примерах) законно в любом языке. То, о чем говориться по вашей ссылке к моему случаю не имеет отношения. на поальцах, про эту граблю.... если union S { std::int32_t n; // occupies 4 bytes std::uint8_t c; // occupies 1 byte }; то записали в n одно, а читаем из с - получаем It's undefined behavior to read. Потому что sizeof(c) < sizeof(n). Если будет union S { std::int32_t n; // occupies 4 bytes std::uint32_t c; // occupies 4 byte float m; // occupies 4 byte MyType g; // occupies 4 byte }; То ни каких undefined behavior to read не случиться. Вы можете безопасно писать и читать в любой член юниона. Потому что размер S равен hold its largest data member. А размер любого member == largest data member и == размеру S. В моем случае примере под юнионом объединены два члена: uint64_t и struct (битовое поле). Каждый член занимает 8 байт.
|
|
|
74
|
Программирование / С/C++ / Re: чтение и запись битовых структур данных
|
: Апрель 27, 2021, 06:53
|
1) Есть какие-то готовые библиотеки, которые смогут буфер с байтами превратить в заданные структуры? (ну и обратный процесс)
Я делаю через юнион struct LCanOpen { union { uint64_t data; struct { int16_t x; int16_t y; int16_t rezerv; struct { uint16_t nx :2; uint16_t ny :2; uint16_t rezerv1 :12; }; }; }; };
struct Bjm { union { uint64_t data; struct { uint64_t neutralX :2; uint64_t left :2; uint64_t right :2; uint64_t x :10; uint64_t neutralY :2; uint64_t back :2; uint64_t forward :2; uint64_t y :10; uint64_t rezerv :8; uint64_t but4 :2; uint64_t but3 :2; uint64_t but2 :2; uint64_t but1 :2; uint64_t but8 :2; uint64_t but7 :2; uint64_t but6 :2; uint64_t but5 :2; uint64_t but12 :2; uint64_t but11 :2; uint64_t but10 :2; uint64_t but9 :2; }; }; }; При получении данных я не распихиваю каждый битик сдвигами в нужное поле, а сразу весь буфер помещаю в data uint64_t recData; uint8_t recBuf[100];
recive(port1, &recData); recive(port2, recBuf);
struct Bjm bjm; struct LCanOpen can;
bjm.data = recData;//заполенение структуры простым "=" memcpy(&can.data, &recbuf[13], 8); //заполнение структуры, в случае, если принятые данные не выровнены.
recive(port1, &can.data); //обратный процесс *(uint64_t*)recBuf = bjm.data;//опасно, но быстро. //или memcpy(recBuf+13, &bjm.data, 8);//безопасно
Такими юнионами легко одним "=" можно получить заполнить Bjm.x, который состоит из 10 бит и разбросан в 2-х байтах. Доступ unsigned int x = bjm.x; unsigned int y = can.ny зы только сейчас заметил "Причем размер не всех полей известен на момент компиляции". Мой вариант тут наверно не подойдет.
|
|
|
75
|
Qt / Общие вопросы / Re: Разделители разрядов
|
: Апрель 22, 2021, 12:31
|
еще раз: стандарты С и С++ — это совершенно разные вещи, не надо их путать. Ещё раз "красное" и "рельсы" - это совершенно разные вещи, не надо их путать. если твой IAR компилятор умеет что-то нестандартное IAR не мой... и я ни о каких нестандартных вещах не говорю. Иар работает в стандарте с17/с18 The IAR C/C++ Compiler for Arm supports the INCITS/ISO/IEC 9899:2018 standard, also known as C18. C18 addresses defects in C11 Вобщем пока в MinGW это не умеет.... что делать? Может MSVC умеет? Смотрим описание на MSVC In September 2020, Microsoft announced C11 and C17 standards support in MSVC - ДАЛАДНА!!! Я думал что с11 уже 100 лет как включен, а его только в 2020 включили.... Пробую в онлайн компиляторе MSVC - а таки понимает апострофы.... Скачал, поставил только компилятор. Собрал холоворд - понимает апострофы.... конец банальный.... начал настраивать QtC.... коллега подключился к проекту... он собирает "порт" из этих же для linux на gcc7.3. У него переезд на посвежее - нереальный. Придется отложить до лучших времён. ((
|
|
|
|
|