2016-07-19 14 views
0

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が必要とするすべての設定を効果的に変更できないようです。

答えて

1

データを送信するたびにポートを開いたり閉じたりするのはなぜですか?さらに、writeまたはwaitForBytesWrittenが、データが「書き込まれた」ことを示す何らかの値を返したという理由だけで、データがトップレベルのデバイスドライバのバッファからフラッシュされたことを意味します。すべてのデータをハードウェアに実際にプッシュするUSB​​要求がまだ保留中で、デバイスのFIFOにまだデータなどが残っている可能性があります。

ただし、デバイスを閉じると、通常は進行中のトランザクションは中止され、そのバッファをクリアするためのハードウェア書き込みは非同期であり、パフォーマンスを維持するためのストリーミングであり、デバイスの終了は同期して即座に実行されるアクションのタイプです。

端末を開いたままにしてください。プラットフォーム固有の方法で、離れたデバイス、または新しいデバイスが追加されたことが通知されたときに再オープンする必要があります。

+0

だから基本的に、私は私が開いたポートを追跡する必要があると開いた場合は、それ以外の場合は、データを書き込む:オープン、データを書き込み、オープンとしてポートをマーク。ポートが開いているかどうかを確認する方法はありますか? – othmoz

+0

@othmozそれはあなた次第です。使用しているポートのリストを保持する。あなたが明らかに使っていないものはあなたが開いていないもの、あなたが使っているものは開いたままのものです。それで全部です。 –

0

@Kuba Oberが正しくありました。私はこのように見えるように関数を修正しました: (私は、各ポートのQSerialPortポインタを持っているか、以下のようにデータを書き込むたびにポート設定を再定義するためにこのコードを使用しなければなりません。

bool Bridge::printToSerial(QByteArray arr, QString serialPortName, quint16 baud) { 

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; 
    return false; 
} 

bool portOpen = m_opened.contains(serialPortName); 

if(!portOpen) { 
    if(m_port == NULL) { 
     m_port = new QSerialPort(this); 
    } 
    m_port->setPortName(serialPortName); 
    if(!m_port->open(QSerialPort::WriteOnly)) { 
     qDebug() << "Error serial open"; 
     return false; 
    } 
    portOpen = true; 
    m_opened[serialPortName] = true; 
} else { 
    m_port->setPortName(serialPortName); // \\.\COM1 
} 

m_port->setBaudRate(baud); 
m_port->setDataBits(QSerialPort::Data8); 
m_port->setParity(QSerialPort::NoParity); 
m_port->setStopBits(QSerialPort::OneStop); 

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(5000)) { 
    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; 
} 
qDebug() << QObject::tr("Data successfully sent to port %1").arg(serialPortName) << endl; 
return true; 
} 
関連する問題