• 9444阅读
  • 11回复

[提问]Qt串口通信接收的数据怎么分开传给不同lineeidt显示? [复制链接]

上一主题 下一主题
离线kingqb
 

只看楼主 倒序阅读 楼主  发表于: 2013-11-06
在QT串口通信中,比如 QByteArray temp = myCom ->readAll();中temp的内容为12 回车符 13 回车符 14回车符,怎样把它区分出来,将12、13、14分别传给个lineedit1、lineedti2、lineedit3显示?不知道有什么好方法能分离它们,求指导。
离线tompsontan

只看该作者 1楼 发表于: 2013-11-06
回 楼主(kingqb) 的帖子
可以考虑用正则表达式
看淡得失
离线tompsontan

只看该作者 2楼 发表于: 2013-11-06
回 楼主(kingqb) 的帖子
先转为QString,然后用函数split(QRegExp("\\s+"));
看淡得失
离线kingqb

只看该作者 3楼 发表于: 2013-11-06
嗯,谢谢,这个方法可以,但是又卡在把list:["12","13","14"]中的数字分别给lineedit。
离线kingqb

只看该作者 4楼 发表于: 2013-11-06
回 2楼(tompsontan) 的帖子
嗯,谢谢,这个方法可以,但是又卡在把list:["12","13","14"]中的数字分别给lineedit。
离线tompsontan

只看该作者 5楼 发表于: 2013-11-06
回 4楼(kingqb) 的帖子
lineEdit1->setText(list[0]);
lineEdit2->setText(list[1]);
lineEdit3->setText(list[2]);
看淡得失
离线kingqb

只看该作者 6楼 发表于: 2013-11-06
回 5楼(tompsontan) 的帖子
这种方法和list.at(0)都出现了ASSERT failure in QList<T>::at: "index out of range", file c:\Qt\4.7.3\include/QtCore/../../src/corelib/tools/qlist.h, line 456这个错误,软件出现Runtime error!的错误,但是值能显示在lineedit上。
离线dbzhang800

只看该作者 7楼 发表于: 2013-11-06
问题出在你的串口操作上,你不能保证每次都能接受到有效数据,也不能保证每次都是 3个数据。
一般来说,你需要定义你自己的通讯协议(如果收发都是你写的东西),靠协议来保证数据的完整性。
离线tompsontan

只看该作者 8楼 发表于: 2013-11-06
回 6楼(kingqb) 的帖子
确实是,通讯协议你要先确定
看淡得失
离线kingqb

只看该作者 9楼 发表于: 2013-11-06
回 7楼(dbzhang800) 的帖子
void MainWindow::readMyCom()
{
    QStringList list;
    
    QByteArray temp = myCom ->readAll();
    
    QString str(temp);
    
    list = str.split(QRegExp("\\s+"));
    
    ui->lineEdit->setText(list.at(20));
    
    ui->textBrowser_2->insertHtml(str);
    
    ui->textBrowser->insertHtml(QString(temp));
    
    ui->textBrowser->moveCursor(QTextCursor::End);

} 嗯,谢谢,我再试试,但每次我从下位机读出来的数据在textbrowser上的都一样,应该不是数据丢失和无效。
离线dbzhang800

只看该作者 10楼 发表于: 2013-11-06
不是说丢失,是说你的一条命令可能需要几次read来能读全,也可能你一次读了好几条命令。你需要通讯协议来控制这些东西。而不是依赖于一个假定:每次读取一条命令。
离线kingqb

只看该作者 11楼 发表于: 2013-11-06
回 10楼(dbzhang800) 的帖子
嗯,好像可以了。我在readMyCom加了下面的判断:
if(list.size()==3)
{
ui->lineEdit1->setText(list[0]);
ui->lineEdit2->setText(list[1]);
ui->lineEdit3->setText(list[2]);
},结果可以运行正常也没有错误,但不知道为什么会这样,没有判断就不行。
快速回复
限100 字节
 
上一个 下一个