Webアプリケーションからシリアルサーマルプリンタにアクセスするためのqtブリッジを作成しています。 私はここで、問題の設定シリアルポートの設定を抱えていることは私のコードです:Windows 7のQT QSerialPortは、シリアルCOMポートの設定を変更しません。
bool Bridge::printToSerial(QByteArray arr, QString serialPortName, quint16 baud) {
/*
QProcess proc;
QStringList args = QStringList() << QString("mode COM1 BAUD=%1 PARITY=%2 DATA=%3").arg(9600).arg("n").arg(8);
proc.start("cmd.exe", args);
proc.waitForStarted();
proc.close();
*/
QSerialPort* m_port = new QSerialPort(this);
m_port->setPortName(serialPortName); // \\.\COM1
if(!m_port->open(QSerialPort::ReadWrite)) {
qDebug() << "Error serial open";
} else {
if (arr.isEmpty()) {
qDebug() << QObject::tr("Either no data was currently available on the standard input for reading, or an error occurred for port %1, error: %2").arg(serialPortName).arg(m_port->errorString()) << endl;
delete m_port;
return 1;
}
m_port->setBaudRate(baud);
m_port->setDataBits(QSerialPort::Data8);
m_port->setParity(QSerialPort::NoParity);
m_port->setStopBits(QSerialPort::OneStop);
//m_port->setBreakEnabled(true);
qint64 bytesWritten = m_port->write(arr);
if (bytesWritten == -1) {
qDebug() << QObject::tr("Failed to write the data to port %1, error: %2").arg(serialPortName).arg(m_port->errorString()) << endl;
delete m_port;
return 1;
} else if (bytesWritten != arr.size()) {
qDebug() << QObject::tr("Failed to write all the data to port %1, error: %2").arg(serialPortName).arg(m_port->errorString()) << endl;
delete m_port;
return 1;
} else if (!m_port->waitForBytesWritten(500)) {
qDebug() << QObject::tr("Operation timed out or an error occurred for port %1, error: %2").arg(serialPortName).arg(m_port->errorString()) << endl;
delete m_port;
return 1;
}
m_port->close();
delete m_port;
qDebug() << QObject::tr("Data successfully sent to port %1").arg(serialPortName) << endl;
return false;
}
delete m_port;
return true;
}
問題は、そのデータのプリントですが、データビットを8ビットに設定されていない私はものと判断され、終了しません。
私はコマンドを実行しました:モードCOM1とポートが正しく設定されていないことを示します(ボーレート、ビット、パリティはすべて間違っています)。 btwデバイスマネージャは、ポートのデフォルト設定とコマンドラインとは異なる結果を表示しています: "mode COM1"
動作させるには、コマンドラインを実行する必要があります:モードCOM1 BAUD = 9600 PARITY = n DATA = 8私はプログラムを実行する前に。 またはm_port-> setBreakEnabled(true)を呼び出します。私はポートを開いた後。この呼び出しはプログラムをハングアップし、私は動作させずにexeファイルを再コンパイルする必要があります。 システムが再起動すると、コマンドラインモードで古い結果(ボーレート1200、データビット7など)が表示されます
この現象はなぜ発生していますか? QSerialPortが必要とするすべての設定を効果的に変更できないようです。
だから基本的に、私は私が開いたポートを追跡する必要があると開いた場合は、それ以外の場合は、データを書き込む:オープン、データを書き込み、オープンとしてポートをマーク。ポートが開いているかどうかを確認する方法はありますか? – othmoz
@othmozそれはあなた次第です。使用しているポートのリストを保持する。あなたが明らかに使っていないものはあなたが開いていないもの、あなたが使っているものは開いたままのものです。それで全部です。 –