我用ascii代码风格做了一个tansmition,一切都很好,直到我做了crc检查。在我的项目中,crc是一个字节。在我的reciver中,我将所有内容放入std :: string中,如果crc较小,那么127就可以了。但是如果我的crc更重,那么127然后到我的std :: string就是添加附加数据 - 下面的例子。
if crc = 80 -> in std:string "P"
if crc = 168 -> in std::string "�" (three diffrent signs)
我做错了什么?我以为127上面有特殊字符,但现在我迷路了...
编辑: 我试图让它变得简单,但当然我可以给你代码:)。
QSerialPort *serial = new QSerialPort;
std::string *buffer = new std::string;
//when 'readyRead' event comes from serial then:
QString tempBuffer = serial->readAll();
*buffer += tempBuffer.toStdString();
然后在不同的线程中我处理缓冲区数据。问题是当我发送一个大于127的字节时 - 在那种情况下,我的缓冲区会附加一些额外的字符(如第一个例子中所示)。
答案 0 :(得分:2)
问题在于:
QString tempBuffer = serial->readAll();
*buffer += tempBuffer.toStdString();
1)你依赖于从QByteArray到QString的默认转换,即utf-8,而不是本地拉丁语1,如果这是你想要的。
QString::QString(const QByteArray & ba)
构造一个用字节数组ba初始化的字符串。使用fromUtf8()将给定的字节数组转换为Unicode。停止复制前0个字符,否则复制整个字节数组。
在这种情况下,你需要在readAll的返回值上明确地调用fromLatin1,即:
QString tempBuffer = QString::fromLatin1(serial->readAll());
qDebug() << tempBuffer;
您的要求也可能与本地8位相关,在这种情况下,您可以使用fromLocal8Bit执行类似操作。
2)为堆上的std :: string对象分配内存是个坏主意。它意味着是一个堆栈对象。
3)在这种情况下,如果完全删除std :: string内部数据处理,代码会更简单,因为这样你也可以删除QString用于一般操作,你可以保留它只用于数据显示。这样,您还可以获得&#34;原始数据&#34;使用data() method。
在处理超过127的字符数据时,要记住一些事项,即:
4)您需要为该属性设置8个数据位,这是当前的默认值,但您需要确保它不是7位。
5)QIODevice接口处理用于读写的char *类型,无论是有符号还是无符号,都依赖于编译器。只要你在接收方和发送方一致地处理它们,这不会是一个问题。
答案 1 :(得分:-2)
您可以尝试使用wstring,也许可以更改字符集。