2015-10-22 14 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 现在它真的有效。 感谢您的帮助!