Мне нужно разработать программу на C++ для встроенной процессорной системы на базе FriendlyARM. Я использую Qt Creator 3.0.0 (на основе Qt 5.2.0) для настольного компьютера. Моя программа должна быть в состоянии читать из последовательного порта в Mini2440 FriendlyARM-процессоре.Неисправность при чтении из последовательного порта с использованием QSerialPort
Прежде чем перейти в целевую систему (встроенную систему), я попытался прочитать и записать из/в последовательный порт на моем ноутбуке. Моя основная проблема заключается в том, как читать из последовательного порта. Как вы знаете, новые компьютеры и ноутбуки не имеют последовательного порта, поэтому я пытаюсь имитировать программирование последовательного порта, используя ручной кабель USB-to-serial. Когда последовательный кабель USB подключен, он распознается как «/ dev/ttyUSB0» на Ubuntu. Кажется, это хорошо работает. Обратите внимание, что другой конец кабеля (последовательный порт) не подключен ни к чему.
Мой первый вопрос: нормально ли настроить такой кабель, или мне нужно подключить его к другому устройству? Я пытаюсь написать/dev/ttyUSB0 каждые 10 секунд и прочитать данные. Я закончил следующий код:
void MainWindow::refreshNotificationArea()
{
generateNotifAreaData(); // a typical random data-generator
QList<QSerialPortInfo> L = QSerialPortInfo::availablePorts();
for (auto e : L)
qDebug() << e.portName() << '\n'; // it prints 1 serial port: :ttyUSB0
// write to the port
QSerialPort notifAreaPort;
// 1. set properties
notifAreaPort.setBaudRate(QSerialPort::Baud9600);
notifAreaPort.setStopBits(QSerialPort::OneStop);
notifAreaPort.setParity(QSerialPort::NoParity);
notifAreaPort.setDataBits(QSerialPort::Data8);
notifAreaPort.setFlowControl(QSerialPort::NoFlowControl);
QObject::connect(¬ifAreaPort,SIGNAL(error(QSerialPort::SerialPortError)),
this, SLOT(errorReport(QSerialPort::SerialPortError)));
notifAreaPort.setPortName(serial_device.c_str());
// 2. open port
notifAreaPort.open(QIODevice::ReadWrite);
if (!notifAreaPort.isOpen())
qDebug() << "Open failed"; // open is OK, no error message printed
string s = convertNotifAreadData2Str();
qDebug() << "Generated data " << s.c_str(); // OK
int a = notifAreaPort.write(s.c_str()); // write done
qDebug() << "Write count" << a; // OK
// now read the info
QByteArray ba = notifAreaPort.readLine(3); // read failed
QSerialPort::SerialPortError err = notifAreaPort.error();
qDebug() << "Error code" << err;
qDebug() << "What? " << notifAreaPort.errorString();
qDebug() << "Read count " << ba.size(); // 0
notifAreaPort.close();
}
void MainWindow::errorReport(QSerialPort::SerialPortError error)
{
if(error!=0)
qDebug()<<"ERROR:"<<endl<<error; // nothing printed
}
Запись в последовательный порт в порядке. но иногда возникают проблемы с чтением «Нет такого файла или каталога»! иногда «Файл временно unavalable Странная вещь notifAreaPort.error() возвращает 0, и это не означает, что никакой ошибки произошла
Мысли
-!? Саид Amrollahi Boyouki
Благодарим вас за отзыв Matthias. Я проверю кабель позже. Ответьте на мой первый вопрос. Просто для проверки чтения и записи последовательного порта, все в порядке, один конец последовательного кабеля, подключенного к ноутбуку, и другой конец, не подключенный к устройству (какое бы последовательное устройство)? –
Matthias. Из QSerialPort :: open() doc: –
Внимание: режим должен быть QIODevice :: ReadOnly, QIODevice :: WriteOnly или QIODevice :: ReadWrite. Другие режимы не поддерживаются. –