[SOLVED] Nasty String Ending
-
Hi there
I need to transmit an int16 over a serial port. To do this in a fast way, I split the variable into two byte. Now, when I want to read these two byte into a QString or a QByteArray because the read() - function of the qserialdevice library allows no other type to write in, I get a problem. When the value of my int16 is below 256, the first byte is 0. And unfortunatly 0 is the string ending constant. So my string stops at this point and I don't gat any more information in that String. Does anyone have an idea how to bypass this string ending rule?
-
Obviously I need a QDataStream. I tried to play a bit around with QDataStream and QBuffer, but I wasn't able to set this up. It is the first time I use these classes and I haven't found any useful examples. If somebody could give me a short example how I can write a QByteArray with a QDataStream into a QBuffer and read this out again, that would be great!
-
I would not use QDataStream as that does add marshalling information into its output stream which is most likely not expected on the other side... provided you do not use a QDataStream there, too.
You are aware that you can use QIODevice::readAll() does put all the bytes available into the QByteArray? Check the count() of the byte array: I bet it says more than 0 in your case. You just can not interpret the first bytes as a string as you did not put a string there but an integer.
@qint32 = reinterpret_cast<qint32>(data.constData());@
should get the 32bit integer out of the first 4 bytes of the QByteArray data though. Make sure to not go past the end of the QByteArray;-)
PS: When moving data between devices you should use qu?int(8|16|32|64) as data types instead of a simple int. Int is defined as >=32 bit, and thus might differ between your sender and your receiver.
-
You're right. The data is in the QByteArray. QDebug is just not able to show what is in there but the size is obviously 4. These 4 Bytes consist of an STX (0x02) Byte then 2 Byte for the uint16 and finally the ETX (0x03) Byte. So first I have to check the QByteArray if it was transmittet correctly with the STX-ETX Chain and extract the 2 Bytes in the mid. Finally I get a QByteArray with my 2 Bytes.
I put them together in an traditional way like this:
@uint16 myValue = valueArray[1] | (valueArray[0] << 8);@
This works so far altough I get 2 warnings I don't understand for this and a similar tag:
@while(valueArray[0] != 0x02) valueArray.remove(0,1);@
bq. warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
If I try to convert the 2 Bytes with your method like this:
@quint16 = reinterpret_cast<quint16>(valueArray.constData());@
I get this error:
bq. error: cast from 'const char*' to 'quint16' loses precision
But anyway, thx for the help until here!