QByteArray的外部与内部声明
External vs internal declaration of QByteArray
我目前对QSerialPort
有一些问题:当我使用一个看起来像的示例中的函数时
QKeyEvent *e;
emit getData(e->text().toLocal8Bit());
connect(console, SIGNAL(getData(QByteArray)), this, SLOT(writeData(QByteArray)));
void MainWindow::writeData(const QByteArray &data)
{
qDebug() << "Data is to write: " << data;
serial->write(data);
}
则接收设备可以使用该数据。但当我将函数writeData()
更改为时
void MainWindow::writeData(const QByteArray &data)
{
QString a = "Q";
QByteArray b = a.toLocal8Bit();
serial->write(b);
}
接收设备不能与接收到的数据一起工作。这两种方法的区别在哪里
更新:我发现,显然只有在键入字母后按Enter
,数据才能有效传输。不知怎的,'n'
在从QString
到QByteArray
的转换中丢失了。我该怎么保管?
您应该像下面的一样在Qstring中添加一个回车
QString a = "Qx00D";
在您给出的示例中,QString中没有"\n"!它不会迷路,它一开始就不在那里。
如果需要换行,则将String构造为QString a = "Qn"
。
您也可以直接从字符数组构建QByteArray,而不是通过字符数组->QString->QByteArrray转换序列,如下所示:
QByteArray b("Qn");
编辑:我意识到,你只是发送字母"Q"的人为例子可能是一次调试尝试,而不是你真正的代码。事实上,你正在从发射QByteArray的其他信号中获得数据作为QByteArray。您正在接收的QByteArray中不能包含换行符。如果您正在读取文件或用户输入,则这是正常的。大多数类似readline的函数都会去掉后面的换行符。如果总是需要换行,您可以在WriteData方法中简单地执行以下操作:
void MainWindow::writeData(const QByteArray &data)
{
serial->write(data);
serial->write("n");
}
如果传入的QByteArray有时在末尾有换行符,有时没有,并且您的接收设备无法处理冗余换行符,那么您需要检查数据是否以换行符结尾,如果没有,则只写入"\n"。
如果你把QByteArray
做成这个会怎么样
QByteArray b(&a);
相关文章:
- C++:在函数内部声明数组时,表达式必须具有常数值
- 正在为循环内部声明向量
- (C++)返回函数内部声明的对象的地址
- 稍后在程序中使用if-else构造内部声明的变量会导致未声明的标识符错误
- C++在if-else内部声明派生类对象,并在外部使用它
- 在类内部声明结构
- 在条件中使用do-while循环内部声明的变量
- 在结构定义内部声明结构的堆栈
- 使用外部类内部声明的数据类型
- 在C++中的类的函数内部声明变量
- C++-在函数内部声明数组
- QByteArray的外部与内部声明
- C++ 结构内部声明混淆
- 在类外部使用在类内部声明的类型定义枚举
- 在函数内部声明函数的用法
- 模板成员函数的参数推导不适用于函数内部声明的类
- 函数内部声明的静态变量的值是多少
- 潜在的长循环和内部声明变量
- 在类内部声明模板化函数(基于容器类型),在模板类外部定义模板化函数(基于容器类型)
- 在函数内部声明函数时出现语法错误