- Что за дополнительная задержка добавляется, когда я использую наивный подход QThread :: usleep, который вызывает растяжение импульса?
Linux - этоне в операционной системе реального времени спящий поток приостанавливает процесс на не менее чем указанного времени.Во время сна другие потоки и процессы могут работать и могут не дать процессору дольше, чем ваш период ожидания, или могут вообще не работать и использовать весь выделенный ОС промежуток времени.Кроме того, обработчики прерываний драйвера ядра всегда будут вытеснять процесс пользовательского уровня.У Linus есть опция сборки для планирования в реальном времени, но гарантии остаются менее надежными, чем реальная ОСРВ и задержки, как правило, хуже.
Обратите также внимание, что не только ваш поток может быть приостановлен на более длительный период, чем период ожидания, нопередача может быть увеличена более чем на количество бит по скорости передачи данных - драйвер ядра может быть вытеснен другими драйверами и ввести межсимвольные промежутки, над которыми у вас нет контроля.
Почему не работает подход со слотом для сигналов, поскольку он управляется событиями?
В документации для QSerialPort::waitForBytesWritten()
указано:
Эта функция блокируется до тех пор, пока в последовательный порт не будет записан хотя бы один байт и не будет отправлен сигнал bytesWritten ().
Таким образом, ясно, что семантика этого« некоторые данные были записаны » вместо « все данные были записаны ».Он будет возвращаться всякий раз, когда записывается байт, затем, если вы вызовете его снова, он, скорее всего, сразу же вернется, если байты продолжают записываться (потому что QSerialPort
буферизуется и будет записывать данные независимо от вашего приложения).
В общем, как я могу дать команду выводу активироваться ТОЛЬКО во время передачи данных, а затем снова сброситься до нуля, чтобы я мог получить ответ ведомого?
Qt isне к сожалению ответ;это поведение должно быть реализовано в драйвере ядра последовательного порта или, по крайней мере, на более низком уровне, чем Qt.Абстракция Qt QSerialPort
не дает вам необходимого уровня контроля или понимания фактического события "на проводе".Это несколько руки от оборудования - по уважительной причине.
Однако есть простое решение - не беспокойтесь!это кажется совершенно ненужным.Это связь ведущий-ведомый, и поэтому сами данные являются контролем потока.Раб не разговаривает, пока с ним не разговаривают, и хозяин должен ожидать и ждать ответа после того, как он произнес.Почему рабу требуется какое-либо разрешение, чтобы говорить иначе, чем подразумевается, когда с ним разговаривают?