2016-07-29 3 views
0

Я пишу программу для чтения из QSerialPort. Похоже, что программа работает примерно в 85% случаев, однако возникает странная ситуация, когда глупость считывается в мой буфер.QSerialPort: неверные значения

Иногда программа неожиданно выходит из строя при запуске из-за массивного буфера значений x00. Это не ответ от моего модуля, и ТОЛЬКО, кажется, случается иногда при запуске.

Я думаю, что есть проблема в том, как я удаляю свой экземпляр QSerialPort, но не могу найти его.

Я также заметил, что у QSerialPort есть функция «sendBreak», которая, кажется, делает то, что моя программа (отправка массивного пара x00/x00/x00).

Мой вопрос: кто-нибудь сталкивался с этим раньше? Есть ли какая-то странная возможность, моя функция QSerialPort :: read() каким-то образом выполняет «sendBreak»? Или это более вероятно, будет проблемой с удалением экземпляров/указателей (чтение данных с адреса, который не был деконструирован должным образом)?

Constructor:

serial = new QSerialPort; 
    serial->setPortName("/dev/ttyUSB0"); 
    serial->setBaudRate(QSerialPort::Baud9600); // 9600 
    serial->setDataBits(QSerialPort::Data8); 
    serial->setParity(QSerialPort::NoParity); 
    serial->setStopBits(QSerialPort::OneStop); 
    serial->setFlowControl(QSerialPort::NoFlowControl); 
    serial->open(QSerialPort::ReadWrite); 
    serial->clear(QSerialPort::AllDirections); 

Чтение порт:

readData.append(serial->read(50)); 

Destructor:

serial->clear(QSerialPort::AllDirections); 
serial->close(); 
delete serial; 

Я понимаю, что это может быть довольно общий вопрос, но я в настоящее время не может найти проблему так любая помощь будет оценена по достоинству.

+0

Многие вещи могут ошибаться. Вы проверяете перед первым чтением, открыт ли последовательный порт? Вы используете waitForReadyRead? –

+0

Отправка NULL и «перерыв» не совпадают. «Разрыв» - это когда линия переходит в ноль в течение некоторого длительного периода времени (более нескольких символов). В перерыве нет начальных бит, поэтому получатель не должен видеть никаких символов, даже NULL. Чтобы увидеть строку символов NULL, каждому символу потребуется связанный бит начала. Шум (проявленный как ложные стартовые биты) может вызвать вашу проблему или проблему с драйвером последовательного порта, или другой конец действительно может посылать строку из NULL. – Mark

+0

Я использую readyRead(), чтобы знать, когда читать с порта, но не используя waitForReadyRead().Я не проверяю, открыт ли первый последовательный порт, однако я получаю сообщение об ошибке, если оно не открыто (чего я не получаю). Спасибо за информацию о перерыве, не поняли операцию. У меня, похоже, нет проблемы с драйвером, о которой я могу сказать, и модуль не должен отправлять этот пара данных (связавшись с производителем по этому поводу). После этих комментариев я склонен думать, что это может быть проблема readRead() ... Я слышал, что это может быть проблематично. – SamMetix

ответ

0

Хорошо, для чего это стоит, я нашел проблему.

После повторного чтения Qt документации на QSerialPort и конкретно прочитанного() функции, которые она говорит:

«Эта функция не имеет возможности сообщить об ошибках, возвращая пустой QByteArray может означать, что либо данных в настоящее время доступны для чтение, или что произошла ошибка ».

Что, по-видимому, происходит в том, что мой сигнал readyRead() срабатывает, даже когда у меня не было данных для чтения ?! Простая инструкция if, проверяющая bytesAvailable() в моем методе readPort, означает, что я читаю только когда у меня есть данные, ожидающие чтения.

Я очень удивлен, что эта функция читает независимо и чувствовать этот вопрос, возможно, был выделен/делом с лучше ....

EDIT: Нашел реальный вопрос к этой проблеме. Я использовал readData.resize(), который очищал массив, не создавая его. Поэтому, когда я очищал его перед чтением (но не инициализировал), он читал адрес.

Смежные вопросы