日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

让串口可以自动分辨一帧数据

發布時間:2025/4/5 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让串口可以自动分辨一帧数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
串口接收完整一幀數據處理方式 原文地址:讓串口可以自動分辨一幀數據作者:李冬冬

有時我們希望串口接收到數據后,在該幀數據的末尾加上一些標志,比如這是第幾幀或接收的時間等等。那么我們就需要知道什么時候

接收到了完整的一幀數據。有兩種方法可以實現:

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;
}

class MainWindow : public QMainWindow {
????Q_OBJECT
public:
????MainWindow(QWidget *parent = 0);
????~MainWindow();

protected:
????void changeEvent(QEvent *e);

private:
????Ui::MainWindow *ui;
????Win_QextSerialPort *myCom;

?//增加一個數據用于放數據
????char data[1024];???????????????

//增加一個標志用于計算接收了個多少數據????????
????unsigned int bytesRead ;???????
????QTimer *timer;

private slots:
????void on_sendComMsgbtn_released();
????void on_closeMyCombtn_released();
????void on_openMyCompbn_released();

//?增加一個函數用于定時器溢出后的處理程序
????void timerUpDate();
????void readMyCom();
};

#endif // MAINWINDOW_H

然后是.cpp文件

#include “mainwindow.h”
#include “ui_mainwindow.h”

MainWindow::MainWindow(QWidget *parent) :
????QMainWindow(parent),
????ui(new Ui::MainWindow)
{
????ui->setupUi(this);
????ui->openMyCompbn->setEnabled(true);
????ui->closeMyCombtn->setEnabled(false);
????ui->sendComMsgbtn->setEnabled(false);
????bytesRead = 0;
????timer = new QTimer(this);

????connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));
}
MainWindow::~MainWindow()
{
????delete ui;
}
void MainWindow::changeEvent(QEvent *e)
{
????QMainWindow::changeEvent(e);
????switch (e->type()) {
????case QEvent::LanguageChange:
????????ui->retranslateUi(this);
????????break;
????default:
????????break;
????}
}

void MainWindow::readMyCom()
{
????unsigned int byte = 0;
????byte = myCom->read(&data[bytesRead], 1024);
????bytesRead +=byte;

//上面講的就在此體現了,為什么是50呢,因為此是并不是操作最底層IO,PC機會將數據接收幾個后在給上層。所以這個時間稍微長一點點
????timer->start(50);

}
void MainWindow::on_openMyCompbn_released()
{
???
????struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,
????????????????????????????????????500};
????myCom = new Win_QextSerialPort(“com1″,myComSetting,QextSerialBase::EventDriven);
???if( myCom->open(QIODevice::ReadWrite))
????{
????connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));
????ui->openMyCompbn->setEnabled(false);
????ui->closeMyCombtn->setEnabled(true);
????ui->sendComMsgbtn->setEnabled(true);
????}
???else
???{
???????QMessageBox::information(this,tr(“錯誤”),tr(“串口被打開或沒有該串口”));
???}
}

void MainWindow::on_closeMyCombtn_released()
{
????myCom->close();
????ui->openMyCompbn->setEnabled(true);
????ui->closeMyCombtn->setEnabled(false);
????ui->sendComMsgbtn->setEnabled(false);
}

void MainWindow::on_sendComMsgbtn_released()
{
????myCom->write(ui->sendMsglineEdit->text().toAscii());
}

//定時器到的處理函數,我在數據的最好添加了一幀日期。剛看這里的朋友也可以看看yafeilinux講的關于定時器和日期(十、Qt Creator中實現定時器和產生隨機數)的文章
void MainWindow::timerUpDate()
{
????timer->stop();
????QDateTime time = QDateTime::currentDateTime();
????QString str = time.toString(“yyyy-MM-dd hh:mm:ss dddd”);
????ui->textBrowser->insertPlainText(str.append(‘n’));
????data[bytesRead] = ‘n’;
????data[bytesRead+1] = ”;
????ui->textBrowser->insertPlainText(data);
????bytesRead = 0;
}

好了,講到這了,本人才疏學淺,學QT也沒幾日,上面難免會出現不地道的語句,希望大家別見笑。另外,這個發帖子的東東我也是第一次用,發的帖子不是很好,以后慢慢學習。另外希望大家一起進步。

總結

以上是生活随笔為你收集整理的让串口可以自动分辨一帧数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: h片在线播放 | 性色在线视频 | 日本特级黄色大片 | 欧美女人一区二区 | 日本黄色免费大片 | 天堂在线一区 | 3344成人 | 奇米第四色在线 | 精品少妇白浆小泬60P | 天天躁日日躁狠狠躁欧美 | 美女隐私无遮挡免费 | 欧美日韩国产精品综合 | 成人做爰的视频 | 制服丝袜影音先锋 | 伦理片一区二区三区 | 91精品91久久久中77777 | 欧洲一区二区视频 | 国产综合免费视频 | 精品人妻在线一区二区三区 | 免费网站成人 | 国产三区av | 亚洲黄色一级 | 婷婷五月小说 | 我要操av | 99视频在线精品免费观看2 | 亚洲久久在线 | 少妇精品一区 | 999热精品视频| 污片免费网站 | xxx一区二区| 日韩在线视频免费播放 | 亚洲精品乱码久久久久久9色 | 色婷婷一区二区 | 红桃视频隐藏入口 | 欧美精品99| www.av网址| 亚洲www.| 男女一起插插插 | 亚洲不卡免费视频 | 国产一区久久久 | 99re6在线精品视频免费播放 | 亚洲色成人网站www永久四虎 | 日韩在线观看一区二区 | 不卡av免费在线观看 | www日韩在线观看 | 欧美精品久久久久久久 | 精品女同一区 | 999久久久精品 | 亚洲最大毛片 | 精品欧美激情精品一区 | 国产99久久精品 | 欧美一级做a爰片免费视频 成人激情在线观看 | 天天干天天色综合 | 人人人爽| 午夜精品久久久久 | 中文字幕在线看人 | wwwxxx在线观看| 不卡一区二区在线观看 | 久草热线| 久久久亚洲av波多野结衣 | 找个毛片看看 | 波多野结衣伦理 | 妞干网这里只有精品 | 国产91精品久久久久 | 先锋影音制服丝袜 | 欧美精品在线第一页 | 成人mv | 欧美一级电影在线 | 好男人www社区| 国产精品一区二区三区免费在线观看 | 男人天堂网址 | www.日韩欧美 | 国产精品变态另类虐交 | 3d动漫精品h区xxxxx区 | 欧美97| 极品91尤物被啪到呻吟喷水 | 爽爽影院免费观看 | 成人美女毛片 | 久久与婷婷| 久九九 | 亚洲乱子伦| 西西444www无码大胆 | 国模无码大尺度一区二区三区 | 国产麻豆免费视频 | 高清欧美性猛交 | 四虎影院在线观看免费 | 亚洲精品在线视频免费观看 | 91精品国产综合久久香蕉922 | 免费黄色片子 | 色老板av | 初尝情欲h名器av | 亚洲精品久久久久久久蜜桃 | av导航站| 日本免费在线视频 | 国产精品自产拍高潮在线观看 | 国产丝袜视频在线观看 | 香蕉视频在线播放 | 国产剧情精品 | 麻豆天天躁天天揉揉av |