Связь через последовательный порт Qt

Я пишу приложение Qt для связи с другим компьютером через последовательный порт. У меня есть 2 настоящие проблемы.

1.
Я могу отправлять и получать данные нормально, но иногда последовательный порт «съедает» часть моего ввода.
Например, если я отправлю:

cd /application/bin

иногда (не всегда) он получит только:

cd /applica

(Так как это терминал, он повторяет ввод. Также моя подсказка говорит мне, что я нахожусь не в том месте.)

2.
Кроме того, иногда слот Qt, который срабатывает, когда есть доступные данные, не срабатывает, хотя я знаю, что есть данные, которые я могу получить. Если я отправлю другой \r\n вниз по порту слот сработает.
Например иногда я ls что-то, и имя команды будет считано обратно из порта, но содержимое папки находится там в подвешенном состоянии, пока я не нажму кнопку возврата снова. Затем я получаю список каталогов и две подсказки.

Вот мой код:

void Logic::onReadyRead(){
QByteArray incomingData;
incomingData = port->readAll();
QString s(incomingData);
emit dataAvailable(s);// this is a Qt slot if you don't know what it is.
qDebug() << "in:"<< s.toLatin1();
}

void Logic::writeToTerminal(QString string )
{
string.append( "\r\n");
port->write((char*)string.data(), string.length());
if ( port->bytesToWrite() > 0){
port->flush();
}
qDebug() << "out:" << string.toLatin1();
}

4

Решение

Я нашел решение, и я подозреваю, что это была ошибка кодирования, но я не уверен. Вместо отправки QString по последовательному порту, отправка QByteArray устранила обе проблемы. Я изменил writeToTerminal() метод:

void Logic::writeToTerminal(QString string )
{
string.append( "\r");
QByteArray ba = string.toAscii();
port->write(ba);
}
2

Другие решения

От этот форум, Кажется, что иногда не все данные отправляются, и что бы ни отправлялось, к нему добавляется ‘\ 0’. Так что если

CD / приложение «\ 0»
получил, то port->readAll() остановился бы там, потому что думает, что все прочитал.

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

void Logic::onReadyRead(){
QByteArray incomingData;
if(port->canReadLine()) {
incomingData = port->readLine();
QString s(incomingData);
emit dataAvailable(s);// this is a Qt slot if you don't know what it is.
qDebug() << "in:"<< s.toLatin1();
}
}

void Logic::writeToTerminal(QString string )
{
string.append( "\r\n");
port->write((char*)string.data(), string.length());
if ( port->bytesToWrite() > 0){
port->flush();
}
qDebug() << "out:" << string.toLatin1();
}
0

По вопросам рекламы [email protected]