在Qt5中通过uart发送一个大缓冲区

时间:2015-01-19 08:58:28

标签: c++ qt qt5 qstring

我是Qt的初学者。现在我想使用Qt5通过uart发送一个9字节的命令。 这是我的命令:

FFFFFF5550464DAA0E

我想将命令转移到Qstring对象。当我像这样写代码时,它告诉我const太大了。

QString str=0xFFFFFF5550464DAA0E;

所以我选择这样一个数组,但它仍然没有用。

char cmd[9]={0xFF,0xFF,0xFF,0x55,0x50,0x46,0x4D,0xAA,0x0E};
for(int i=0;i<9;i++)
{
    QString str=cmd[i];
    QByteArray outData=str.toLatin1();
    int size=outData.size();
    outData=myHelper::HexStrToByteArray(str);
    size=outData.size();
    myCom->write(outData);
}

我也尝试再次失败

char cmd[9]={0xFF,0xFF,0xFF,0x55,0x50,0x46,0x4D,0xAA,0x0E};
QString str=cmd;
QByteArray outData=str.toLatin1();
int size=outData.size();
outData=myHelper::HexStrToByteArray(str);
size=outData.size();
myCom->write(outData);

所以有人能告诉我怎么做吗?

2 个答案:

答案 0 :(得分:2)

这行代码:

QString str=0xFFFFFF5550464DAA0E;

0xFFFFFF5550464DAA0E不是字符串。您正尝试将非常大的常量(9字节)数字分配给字符串。请注意,0xFF不是字符串,而是ASCII代码0xFF的字符。第二次尝试时,你的方法是正确的:

char cmd[9]={0xFF,0xFF,0xFF,0x55,0x50,0x46,0x4D,0xAA,0x0E};

现在你有两个选择;它取决于您必须发送的内容,9个字节或更长的字符串,其中的命令表示为十六进制字符串并编码为ASCII。第一种情况更容易,删除所有代码:

QByteArray outData = QByteArray(cmd, sizeof(cmd));
myCom->write(outData);

使用此代码,您不会向设备发送字符串,而是9字节(0xFF ... 0x0E)。如果你必须发送一个字符串,那么你可以做paxdiablo建议:

QByteArray outData = QByteArray("\xFF\xFF\xFF\x55\x50\x46\x4D\xAA\x0E", 9);
myCom->write(outData);

或者:

QByteArray outData = QString("0xFF0xFF0xFF0x550x500x460x4D0xAA0x0E")
    .toLatin1();
myCom->write(outData);

或者您也可以这样做:

char cmd[9]={0xFF,0xFF,0xFF,0x55,0x50,0x46,0x4D,0xAA,0x0E};
QByteArray outData = QByteArray(cmd, sizeof(cmd)).toHex();
myCom->write(outData);

哪一个适合你?那么你应该澄清你的背景......

答案 1 :(得分:1)

你不需要乱用字符串和转换。你可以直接从数据本身创建QByteArray ,只需一个简单的单行程序:

QbyteArray data("\xFF\xFF\xFF\x55\x50\x46\x4D\xAA\x0E", 9);

之后,声明:

myCom->write(data);
然后

将输出字符串中指定的九个字节。