|
1Qter豆
求助!{:soso_e154:}还是串口程序的问题,我在使用现在用qcom调试一个单片机,功能大致是我发送一组16进制数给单片机,然后单片机反馈给qcom一些信息,现在发送数据没什么问题,接受到了板子的反馈信息,但是反馈信息读取出现了一定是32字节一读,少于32字节的就等待后面来的信息凑足32字节才会发过来,这样会十分影响我在qcom的QTextBroswer中的显示
这是qcom中的readMycom函数,我除了加了一句qDebug其他什么都没改:
void MainWindow::readMyCom()
{
qDebug()<<"read:"<<myCom->bytesAvailable()<<"bytes"; //这里是我加的调试信息
QByteArray temp = myCom->readAll();
QString buf;
if(!temp.isEmpty()){
ui->textBrowser->setTextColor(Qt::black);
if(ui->ccradioButton->isChecked()){
buf = temp;
//qDebug()<<"temp="<<temp;
}else if(ui->chradioButton->isChecked()){
QString str;
for(int i = 0; i < temp.count(); i++){
QString s;
s.sprintf("0x%02x, ", (unsigned char)temp.at(i));
buf += s;
}
}
if(!write2fileName.isEmpty()){
QFile file(write2fileName);
//如果打开失败则给出提示并退出函数
if(!file.open(QFile::WriteOnly | QIODevice::Text)){
QMessageBox::warning(this, tr("写入文件"), tr("打开文件 %1 失败, 无法写入\n%2").arg(write2fileName).arg(file.errorString()), QMessageBox::Ok);
return;
}
QTextStream out(&file);
out<<buf;
file.close();
}
ui->textBrowser->setText(ui->textBrowser->document()->toPlainText() + buf);
QTextCursor cursor = ui->textBrowser->textCursor();
cursor.movePosition(QTextCursor::End);
ui->textBrowser->setTextCursor(cursor);
ui->recvbyteslcdNumber->display(ui->recvbyteslcdNumber->value() + temp.size());
ui->statusBar->showMessage(tr("成功读取%1字节数据").arg(temp.size()));
}
}
然后QTextBroswer显示的反馈信息如下面所示;
问题在于如图1显示的最后一行:“channel 0:<0.01450”,明显是少了个“>”的。
我加了一句qDebug()<<"read:"<<myCom->bytesAvailable()<<"bytes"后,发现每次read的都是32bytes,其实后面的“>”并没有丢,是因为他前面到0刚好是32字节,所以他被分割到下面那段去了,但是如果他要是下面那段也发过来也就好了,但是感觉他好像是等着下面的数据来一起凑够32bytes才能发过来,就像图2那样,我又发了一次,可以看到前面一段的丢失“>”也已经发过来了,但是依旧是32一读,所以可以看到空了一行是因为那个32bytes是刚好读到的回车字符开头的;我不知道是不是单片机问题,但是另外一个人用JAVA写的一个串口也是用这个单片机显示没什么问题,所以我感觉应该是这个只有满32字节才读的问题导致的,我希望能够在单片机发送一次内把全部信息传送过来,不管最后那段是否小于32字节,请问下要如何解决,串口教程里面好像也有提到过这些问题,但是看了几遍着实没看懂...
|
最佳答案
查看完整内容
嗯。当时记着测试是8字节,应该是在windows xp下测试的。可以按照 通信专题 里面讲到再测试下。
|