有时我们希望串口接收到数据后,在该帧数据的末尾加上一些标志,比如这是第几帧或接收的时间等等。那么我们就需要知道什么时候
接收到了完整的一帧数据。有两种方法可以实现:
1,自己人为地在一帧数据的最后加上一个标志符号,如#,@等,上位机接收到这些标志后可认为一帧数据到来完成。这样做很方便,但缺点是
2:利用定时器判断一帧数据是否完成。这种做法可以通用与任何信息。
下面主要分析第二种方法,对第一种方法感兴趣的朋友可以自己实验。以波特率9600BPS为例。
9600BPS,则传送每一位的时间为1000MS/9600=0.104MS,即位与位之间间隔为0.104MS,
现在假如我们在操作PC机最底层IO,收到5个数据。当5个数据的第一个数据到来时,我们启动一个
定时器,时间为1MS,然后每收到一个数据时就重新设置定时器,因为0.104MS要远远小于1MS,所以
如果一直有数据来,定时器就会被重设,没有溢出的机会。当没有数据来了(也就是第5个数据接收到了)
定时器不会被重设直到溢出产生事件号,然后我们就到这个事件号的处理函数里面处理刚接收的完整的一帧数据了
,当然该处理函数里面要停止定时器,直到再有数据来才开启。本人不善言辞,不直到讲的大家听懂没有。
下面弄点实际的东东给大家看,我是把yafeilinux 老兄的串口稍加修改做成,如果刚看到我的例子的朋友
可以先看看他写的串口(Qt编写串口通信程序全程图文讲解),写的很好很容易懂。
头文件中增加如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QMessageBox>
#include <QTimer>//添加定时器类
#include <QtCore>//添加日期类
#include <QString>
#include “win_qextserialport.h”
namespace Ui
{
}
class MainWindow : public QMainWindow {
public:
protected:
private:
//增加一个标志用于计算接收了个多少数据
private slots:
//
};
#endif // MAINWINDOW_H
然后是.cpp文件
#include “mainwindow.h”
#include “ui_mainwindow.h”
MainWindow::MainWindow(QWidget *parent) :
{
}
MainWindow::~MainWindow()
{
}
void MainWindow::changeEvent(QEvent *e)
{
}
void MainWindow::readMyCom()
{
//上面讲的就在此体现了,为什么是50呢,因为此是并不是操作最底层IO,PC机会将数据接收几个后在给上层。所以这个时间稍微长一点点
}
void MainWindow::on_openMyCompbn_released()
{
}
void MainWindow::on_closeMyCombtn_released()
{
}
void MainWindow::on_sendComMsgbtn_released()
{
}
//定时器到的处理函数,我在数据的最好添加了一帧日期。刚看这里的朋友也可以看看yafeilinux讲的关于定时器和日期(十、Qt Creator中实现定时器和产生随机数)的文章
void MainWindow::timerUpDate()
{
}
好了,讲到这了,本人才疏学浅,学QT也没几日,上面难免会出现不地道的语句,希望大家别见笑。另外,这个发帖子的东东我也是第一次用,发的帖子不是很好,以后慢慢学习。另外希望大家一起进步。