Russian Qt Forum
Май 04, 2024, 07:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 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;
};
Тут нет ошибки.
71  Программирование / С/C++ / Re: чтение и запись битовых структур данных : Апрель 27, 2021, 13:24
Цитировать
0 или -1?
0

Цитировать
type punning
понятно... да это вариант с type punning
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. У него переезд на посвежее - нереальный. Придется отложить до лучших времён. ((
 
Страниц: 1 ... 3 4 [5] 6 7 ... 38

Страница сгенерирована за 0.067 секунд. Запросов: 23.