项目场景:
有时需要串口发送数据大量数据比如七八百个字节,收端需要接收数据后如何把数据给拼凑起来。
使用工具 QT、 C++
解决方案:
发端代码:
如果每次发送 1000 字节 而不是 4096 字节,收端会触发两次槽函数,第一次接收1000,第二次一次性接收 4096,所以干脆直接每次发送 4096 字节 的数据。但是因为触发次数只有两次,只能实现 8K之内发送多少就接收多少,具体如何突破限制,欢迎大家予以指教。
void MainWindow::on_sendButton_clicked()
{
QString waitSend = ui->textEdit_2->toPlainText();
qDebug()<<"waitSend.size(): "<<waitSend.size();
int n = waitSend.size(); //剩余的字节数
if (waitSend.size() > 4096) {
for (int i = 0; i < waitSend.size(); ) { //大包发送
QByteArray buf;
if (n > 4096) {
buf.clear();
buf = waitSend.mid(i, 4096).toUtf8();
i += 4096;
n -= 4096;
} else { //最后一次
buf.clear();
buf = waitSend.mid(i, n).toUtf8();
i += n;
}
QString buf2 = buf;
qDebug() <<"buf2: "<<buf2;
qDebug()<<"buf2 size: "<<buf2.size();
qint64 nsize = serial->write(buf2.toLatin1());
serial->flush(); //必须加上,不然无论收端发送多少字节数据,收端只会触发一次接收槽函数!!!
qDebug()<<"write big num size: "<<nsize;
qDebug()<<"index i:"<<i;
}
}
else { //写小数据
qint64 nsize = serial->write(waitSend.toLatin1());
qDebug() << "wirte little size: "<<nsize;
}
}
收端代码:
void MainWindow::Read_Data()
{
int cnt = 0;
serial->setReadBufferSize(0);
QByteArray buf;
while (serial->bytesAvailable()) {
qDebug()<<"wait to be read size:"<<serial->bytesAvailable();
m_buffer.append(serial->readAll());
buf.append(m_buffer);
m_buffer.clear();
}
QString str = QString(buf);
qDebug()<<"接收到的数据是: "<<buf;
qDebug()<<"接收到的数据大小是: "<<buf.size();
if(!buf.isEmpty())
{
QString str = ui->textEdit->toPlainText();
str+= buf;
ui->textEdit->append(str);
}
ui->textEdit_2->append(str);
qDebug()<<"str.size(): "<<str.size();
cnt ++;
}
//发送端发送8K以内的数据,可保证收端原样收到,超出则只能收到8K之内的数据。(收端还有些bug,只能保证触发两次槽函数)。