我将从Arduino微控制器向运行Qt的PC发送几个kB数据。
Arduino根据命令从PC上测量数据,然后按如下方式将数据发回:
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接收的数据如下:
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。
发布于 2018-03-29 21:57:27
我没有仔细研究它,但似乎问题可能与这一行有关:
if(serialData.length()==2*datalength)
所以如果你有额外的数据,你就放弃了整件事?毕竟,不能保证数据会到达整洁的离散块。
如果长度大于或等于,则应读取数据,按指定的长度读取,并保留剩余的数据,因为它是下一个块的一部分。
这也解释了为什么您的函数挂起--如果您碰巧超过了2*datalength
,那么条件永远都不是真的。
但是,即使您修复了这个问题,这个实现也有点幼稚,不能被认为是完全可靠的。还有一些事情可能会出错,你需要有更多的描述性的块数据,这样你就可以找出哪里出了问题,以及如何修正它,或者跳过错误,而不必在齿轮上扔扳手。
发布于 2018-03-29 22:19:19
我的建议是把你的数据包装在信封里。添加标题字符(例如‘H’)和签名('S‘可能?)每次你想发送数据的时候。在接收部分,检查消息的第一个和最后一个字符,并确保它是应该的。这将消除噪音和不完整的数据差不多。
https://stackoverflow.com/questions/49564968
复制相似问题