用textEdit
发送文本遇到的换行问题
在开发BLE
通讯的过程中遇到了以下问题:
在自己写的BLE
上位机的输入框textEdit
中输入数据、回车换行之后发送,但串口调试助手处接收的数据没有换行;但是在串口调试助手的输入框中输入数据再回车换行后发送,BLE
上位机处接收的数据有换行
确定问题
将上位机发送的数据用qDebug
打印到终端查看,发现在textEdit
输入框中打了回车后,发送的数据中只有一个\n
,没有\r
参考这个博客,在Windows中,如果要实现想要的换行的效果(到下一行并使光标回到行首),需要在末尾加上\r\n
;本上位机也运行在Windows系统中,所以需要针对此问题进行解决。
解决过程
一开始的思路是在字符串中寻找\n
,每有一个\n
说明进行一次换行,那么我们只要在每一个\n
前加上\r
即可。查阅了QString
官方手册发现了indexOf
和insert
方法,于是实现了如下代码:
QString str = "\r"; //要插入的内容
QString text = ui->btSendDataTextEdit->toPlainText(); //当前输入框中的数据
if(text.indexOf("\n") != -1) //数据中有\n,插入\r; 怎么应对一个以上的换行?
{
int index = text.indexOf("\n");
text.insert(index, str);
}
m_bleServicePtr->writeCharacteristic(m_bleWriteCharacteristic, text.toUtf8(), QLowEnergyService::WriteWithResponse); //写特性,发送数据
但是由于indexOf
的限制,只能发现\n
第一次出现的索引,当有多个\n
时无法正确处理。
再次查阅了QString
官方手册后,发现了replace
方法,正好可以满足我的需求。
使用了QString
的replace
方法实现了如下代码,成功解决了应对多个换行的问题:
QString str = "\r\n"; //将\n替换为\r\n
QString text = ui->btSendDataTextEdit->toPlainText(); //当前输入框中的数据
if(text.indexOf("\n") != -1) //如果有\n
{
text.replace("\n","\r\n"); //将每个\n都替换为\r\n
}
m_bleServicePtr->writeCharacteristic(m_characteristicSelectionDialog->getWriteCharacteristic(), text.toUtf8(), QLowEnergyService::WriteWithResponse);
使用了这个方法终于实现了想换行就换行、不想换行就不换行的效果。