2013-08-02 6 views
4

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

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(); 
} 
+0

Я только понял, что это может быть неясно, это не связанные проблемы. Shell сообщит мне, что он не может перейти в '/ applica', потому что такой каталог не существует – Muricula

+0

Вам нужно будет буферизовать данные, которые считываются из порта, до тех пор, пока вы не встретите , что может потребовать нескольких считываний из порта , – Pete

ответ

2

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

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

Из this forum, кажется, что иногда не все данные посылают, и все, что делает отсылается имеет «\ 0», присоединенное к нему. Так что, если

кд/Applica «\ 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(); 
} 
+1

Я бы предложил не слепо конвертировать из QByteArray в QString и наоборот, не указав кодировку. Например. при записи: 'QByteArray data = s.toUtf8(); // явно конвертировать в UTF-8'; И проверьте возвращаемые значения: 'const qint64 written = port-> write (data.constData(), data.length());' –

+0

@maditya, я пробовал читать строки за строкой, но это не исправить мою проблему. Он работал немного хуже, чем 'port-> readAll()' Спасибо тем не менее – Muricula

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