1

我已经用 ascii 代码风格做了一个 tansmition,一切都很好,直到我进行了 crc 检查。在我的项目中 crc 是一个字节。在我的接收器中,我将所有内容都放入 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 的字节时 - 在这种情况下,一些额外的字符会附加到我的缓冲区(如第一个示例中)。

4

2 回答 2

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 进行一般操作,你可以保留它仅用于数据显示。这样,您还可以使用data() 方法获取“原始 c 数据” 。

在处理超过 127 的字符数据时,有一些事情需要牢记,即:

4) 您需要为这些天默认的属性设置 8 个数据位,但您需要确保它不是 7 位。

5) QIODevice 接口处理用于读写的 char* 类型,这取决于编译器是否有符号或无符号。只要您在接收方和发送方一致地处理它们,这将不是问题。

于 2014-05-17T15:57:43.060 回答
-2

您可以尝试使用 wstring 并可能更改您的字符集。

于 2014-05-17T16:49:20.507 回答