組み込みの FriendlyARM ベースのプロセッサ システム用の C++ プログラムを開発する必要があります。デスクトップコンピュータには Qt Creator 3.0.0 (Qt 5.2.0 ベース) を使用しています。私のプログラムは、Mini2440 FriendlyARM プロセッサのシリアル ポートから読み取ることができるはずです。
ターゲット システム (組み込みシステム) に移動する前に、ラップトップのシリアル ポートの読み取りと書き込みを試みました。私の主な問題は、シリアルポートから読み取る方法です。ご存知のように、新しいコンピュータやラップトップにはシリアル ポートがありません。そのため、手作りの USB-シリアル アダプタ ケーブルを使用して、シリアル ポート プログラミングをシミュレートしようとしています。USBシリアルケーブルを差し込むと、Ubuntuでは「/dev/ttyUSB0」として認識されます。うまくいきそうです。ケーブルのもう一方の端 (シリアル ポート) はどこにも接続されていないことに注意してください。
私の最初の質問は次のとおりです。このようにケーブルを構成しても問題ありませんか、それとも他のデバイスに接続する必要がありますか? 10 秒ごとに /dev/ttyUSB0 に書き込み、データを読み取ろうとします。私は次のコードになりました:
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
}
シリアルポートへの書き込みはOKです。しかし、読み込み時に「そのようなファイルやディレクトリはありません」という問題が発生することがあります。ときどき「ファイルが一時的に利用できません! 奇妙なことに、notifAreaPort.error() は 0 を返します。これは、エラーが発生していないことを意味します!
考え?
-- サイード・アムローラヒ・ボヨウキ