首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取串行数据的Qt .工作代码,但需要更可靠

读取串行数据的Qt .工作代码,但需要更可靠
EN

Stack Overflow用户
提问于 2018-03-29 21:01:59
回答 2查看 340关注 0票数 0

我将从Arduino微控制器向运行Qt的PC发送几个kB数据。

Arduino根据命令从PC上测量数据,然后按如下方式将数据发回:

代码语言:javascript
运行
复制
void loop(){

// I wait for trigger signal from PC, then begin data acquisition
// Data are acquired from a sensor, typically few thousand 16-bit values
// 1 kHz sampling rate, store data on SRAM chip

// Code below transfers data to PC
   for(unsigned int i=0;i<datalength;i++){

     // Get data from SRAM
     msb=SPI.transfer(0x00);
     lsb=SPI.transfer(0x00);        

     // Serial write
     Serial.write(msb);
     Serial.write(lsb);
     }
Serial.flush();

} // Loop over

Qt接收的数据如下:

代码语言:javascript
运行
复制
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)  
{
ui->setupUi(this);

if(microcontroller_is_available){
   // open and configure serialport
    microcontroller->setPortName(microcontroller_port_name);
    microcontroller->open(QSerialPort::ReadWrite);
    microcontroller->setBaudRate(QSerialPort::Baud115200);
    microcontroller->setDataBits(QSerialPort::Data8);
    microcontroller->setParity(QSerialPort::NoParity);
    microcontroller->setStopBits(QSerialPort::OneStop);
    microcontroller->setFlowControl(QSerialPort::NoFlowControl);
    }

connect(microcontroller, &QSerialPort::readyRead, this, &MainWindow::readData);
}

void MainWindow::readData()  // Read in serial data bytes
{
    serialData += microcontroller->readAll();

    if(serialData.length()==2*datalength){ 
// Once all serial data received
// Do something, like save data to file, plot or process
}
}

现在,上面的代码运行得很好,但是偶尔(假设每几百次收购中就有一次,所以不到1%的时间),不是所有的数据都会被Qt接收到,我上面的readData函数被搁置了。我得重新设置程序。因此,我的问题是:如何使数据传输更加可靠,并避免丢失字节?

FYI:我知道有一个Arduino stackexchange。我没有在那里张贴,因为这似乎是一个问题,更多的Qt,而不是Arduino。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-29 21:57:27

我没有仔细研究它,但似乎问题可能与这一行有关:

代码语言:javascript
运行
复制
if(serialData.length()==2*datalength)

所以如果你有额外的数据,你就放弃了整件事?毕竟,不能保证数据会到达整洁的离散块。

如果长度大于或等于,则应读取数据,按指定的长度读取,并保留剩余的数据,因为它是下一个块的一部分。

这也解释了为什么您的函数挂起--如果您碰巧超过了2*datalength,那么条件永远都不是真的。

但是,即使您修复了这个问题,这个实现也有点幼稚,不能被认为是完全可靠的。还有一些事情可能会出错,你需要有更多的描述性的块数据,这样你就可以找出哪里出了问题,以及如何修正它,或者跳过错误,而不必在齿轮上扔扳手。

票数 2
EN

Stack Overflow用户

发布于 2018-03-29 22:19:19

我的建议是把你的数据包装在信封里。添加标题字符(例如‘H’)和签名('S‘可能?)每次你想发送数据的时候。在接收部分,检查消息的第一个和最后一个字符,并确保它是应该的。这将消除噪音和不完整的数据差不多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49564968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档