2015-10-22 13 views
0

我:QSerialPort和發送字節數(與值> 127?)

QString hex = "0234301c4c49541d4741546f77617220a5a91e42411e43311e44332c30301e45332c30301e47737a74756b613742413303"; 
QByteArray test = QByteArray::fromHex(hex.toLatin1()); 

現在,我想通過的SerialPort發送:

serial = new QSerialPort(this); 
serial->setPortName("ttyACM0"); 
serial->setBaudRate(QSerialPort::Baud9600); 
serial->setDataBits(QSerialPort::Data8); 
serial->setParity(QSerialPort::NoParity); 
serial->setStopBits(QSerialPort::OneStop); 
serial->setFlowControl(QSerialPort::NoFlowControl); 

if(serial->open(QIODevice::ReadWrite)) 

{ 

    qDebug()<<"Port is open!"; 
    if(serial->isWritable()) 
    { 
     qDebug()<<"Yes, i can write to port!"; 
    } 
    serial->waitForBytesWritten(-1); 
    serial->write(test.data()); 
    serial->flush(); // Port Error 12 (timed out???) 
    serial->close() 
} 

我成了沒有結果(也字符/字節值小於127似乎是發送,但不是那些他們超過這個值)

我的問題 - >如何轉換此QByteArray發送所有字節corectly? (我試圖找到在谷歌的答案,但沒有成功/我是新手)

+0

你使用'signed char'或'unsigned char'或'uint8_t'嗎? –

+0

我應該在哪裏使用unsigned char? (在我的程序中,我應該發送數據值從0到255) – blackmoon

+1

爲什麼你要'serial-> write(test.data());'? 'QSerialPort :: write()'有一個直接使用'QByteArray'的重載,所以它應該足夠執行'serial-> write(test);'...它是否以這種方式工作? 此外(與你的問題無關):爲什麼你要在串口寫數據之前做'serial-> waitForBytesWritten(-1);'我認爲,如果你在將數據寫入串口之後這樣做會更有意義(如果你真的需要的話),不是嗎? –

回答

3

你幾乎肯定不想調用的QSerialPort寫入重載,需要一個const char *。請查看docs以瞭解過載情況:

將數據從零終止的8位字符串寫入設備。

但是你不寫一個零終止的C字符串,你正在寫任意的二進制數據。所以,你需要調用write重載直接採取QByteArray中,像這樣:

serial->write(test); 

正如在其他一些評論指出,關於waitForBytesWritten東西調用write不使一個很大的意義之前,但你最大的問題是試圖將你的任意數據的QByteArray視爲一個空終止的C-String。

+0

它根本沒有麥汁。如果我用char(int)大於127的字符發送qbytearray,我將不會收到來自收銀機的迴應答案,並且錯誤12會超時?在其他情況下,我將成爲收件人和回顯確認(而端口讀取)...有些問題是錯誤的用這個::寫函數 – blackmoon

0

他們是crc代碼中的錯誤(從某個門戶網站下載) 它被投射到uint16_t,而不是uint8_t 現在它真的有效。 感謝您的幫助!