【发布时间】:2018-03-29 21:01:59
【问题描述】:
我正在从 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 和我的 @987654323 接收上面的@函数悬而未决。我必须重置程序。所以我的问题是:我怎样才能使数据传输更可靠并避免丢失字节?
仅供参考:我知道存在 Arduino stackexchange。我没有在那里发帖,因为这似乎是一个与 Qt 相关的问题,而不是 Arduino。
【问题讨论】:
-
我从来都不喜欢这样的为最好的协议祈祷。您是否最好在定义明确的块中传输数据,每个块都有一个标头、校验和/CRC、尾部、timoeout 和 ACK/NACK,以便始终可以重新发送并从通信失败中恢复?
-
如果您可以忽略该消息,请尝试合并超时系统?
-
可能是的。你知道我可以遵循的任何既定协议的名称,而不是自己破解一些东西吗?
-
嗯,它是相同的东西,但你传输一些额外的数据,你可以将它们放入一些逻辑来管理传输。然而,它会增加复杂性和数据开销,但大多数时候这不是问题。您的数据包似乎是恒定大小的,因此可以稍微简化一下。
-
什么是
datalength?是常数吗?
标签: c++ qt arduino serial-port