Я пишу приложение 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();
}
Я нашел решение, и я подозреваю, что это была ошибка кодирования, но я не уверен. Вместо отправки QString по последовательному порту, отправка QByteArray устранила обе проблемы. Я изменил writeToTerminal()
метод:
void Logic::writeToTerminal(QString string )
{
string.append( "\r");
QByteArray ba = string.toAscii();
port->write(ba);
}
От этот форум, Кажется, что иногда не все данные отправляются, и что бы ни отправлялось, к нему добавляется ‘\ 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();
}