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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

如何在QT中读取串口数据

發(fā)布時(shí)間:2024/4/19 c/c++ 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在QT中读取串口数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

總是能在別人的博客中學(xué)到太多太多,謝謝各位對(duì)知識(shí)的無私共享,謝謝大家

前言

去年我使用Qt編寫串口通信程序時(shí),將自己的學(xué)習(xí)過程寫成了教程(Qt編寫串口通信程序全程圖文講解),但是由于時(shí)間等原因,我只實(shí)現(xiàn)了 Windows下的串口通信,并沒有去做Linux下的。自從教程發(fā)布到網(wǎng)上后,就不斷有人提出相關(guān)的問題,而其中問的最多的就是,怎樣在Linux下實(shí) 現(xiàn)串口通信。因?yàn)橛杏?jì)劃安排,而且沒有開發(fā)板,所以一直沒能去研究,也就沒能給出很好的解決辦法。前些天,網(wǎng)友hqwfreefly 用Qt寫了一個(gè)叫l(wèi)inucom的Linux下串口調(diào)試程序,實(shí)現(xiàn)了Linux的串口通信。而且,正好現(xiàn)在我有幾天假期,所以就和hqwfreefly合 作,將linucom更新為L(zhǎng)incom,并且推出了Windows下的Wincom,然后完成了這篇Qt編寫串口通信程序的專題教程,也算完成了我的一 個(gè)心愿。

查看以前的教程:Qt編寫串口通信程序全程圖文講解

查看Wincom和Lincom介紹:Qt跨平臺(tái)串口通信軟件Wincom與Lincom

下載軟件,文檔和源碼:資源下載

教程概述

該教程分三部分講述,第一部分講解qextserialport類的一些東東;第二部分講解在Windows下使用 qextserialport類實(shí)現(xiàn)串口通信的方法,這里將講述兩種不同的方法;第三部分講解在Linux下利用qextserialport類實(shí)現(xiàn)串口 通信的方法。在這個(gè)教程中我們更注重知識(shí)的講解,而不是界面的設(shè)計(jì)。關(guān)于界面和其他應(yīng)用問題,你可以查看以前的串口通信教程或者查看一下Wincom軟件的源碼。

第一部分 Qextserialport類介紹

在Qt中并沒有特定的串口控制類,現(xiàn)在大部分人使用的是第三方寫的qextserialport類,我們這里也使用了該類。

一、文件下載

文件下載地址:

http://sourceforge.net/projects/qextserialport/files/

也可以下載我上傳到網(wǎng)盤上的:

http://good.gd/494307.htm

二、文件內(nèi)容介紹

1.下載到的文件為qextserialport-1.2win-alpha ,解壓并打開后其內(nèi)容如下。

(點(diǎn)擊圖片可以查看清晰大圖)

下面分別介紹:

(1)doc文件夾中的文件內(nèi)容是QextSerialPort類和QextBaseType的簡(jiǎn)單的說明,我們可以使用記事本程序?qū)⑺鼈兇蜷_。

(2)examples文件夾中是幾個(gè)例子程序,可以看一下它的源碼,不過想運(yùn)行它們好像會(huì)出很多問題啊。

(3)html文件夾中是QextSerialPort類的使用文檔。

(4)然后就是剩下的幾個(gè)文件了。其中qextserialenumerator.cpp及qextserialenumerator.h文件中定 義的QextSerialEnumerator類是用來獲取平臺(tái)上可用的串口信息的。不過,這個(gè)類好像并不怎么好用,而且它不是我們關(guān)注的重點(diǎn),所以下面 就不再介紹它了。

(5)qextserialbase.cpp和qextserialbase.h文件定義了一個(gè)QextSerialBase 類,win_qextserialport.cpp和win_qextserialport.h文件定義了一個(gè)Win_QextSerialPort 類,posix_qextserialport.cpp和posix_qextserialport.h文件定義了一個(gè) Posix_QextSerialPort類,qextserialport.cpp和qextserialport.h文件定義了一個(gè) QextSerialPort類。這個(gè)QextSerialPort類就是我們上面所說的那個(gè),它是所有這些類的子類,是最高的抽象,它屏蔽了平臺(tái)特征, 使得在任何平臺(tái)上都可以使用它。

2.幾個(gè)類的簡(jiǎn)單介紹。

下面是這幾個(gè)類的關(guān)系圖。

可以看到它們都繼承自QIODevice類,所以該類的一些函數(shù)我們也可以直接來使用。圖中還有一個(gè)QextBaseType類,其實(shí)它只是一個(gè)標(biāo) 識(shí),沒有具體的內(nèi)容,它用來表示W(wǎng)in_QextSerialPort或Posix_QextSerialPort 中的一個(gè)類,因?yàn)樵赒extSerialPort類中使用了條件編譯,所以QextSerialPort類既可以繼承自 Win_QextSerialPort類,也可以繼承自Posix_QextSerialPort類,所以使用了QextBaseType來表示。這一點(diǎn) 我們可以在qextserialport.h文件中看到。再說QextSerialPort類,其實(shí)它只是為了方便程序的跨平臺(tái)編譯,使用它可以在不同的 平臺(tái)上,根據(jù)不同的條件編譯繼承不同的類。所以它只是一個(gè)抽象,提供了幾個(gè)構(gòu)造函數(shù)而已,并沒有具體的內(nèi)容。在qextserialport.h文件中的 條件編譯內(nèi)容如下:

#ifdef_TTY_POSIX_#include“posix_qextserialport.h”#define QextBaseTypePosix_QextSerialPort#else#include“win_qextserialport.h”#define QextBaseTypeWin_QextSerialPort#endif

所以,其實(shí)我們沒有必要使用這個(gè)類,直接使用Win_QextSerialPort或Posix_QextSerialPort就可以了。當(dāng)然如果 你想使用這個(gè)類,實(shí)現(xiàn)同樣的源程序可以直接在Windows和Linux下編譯運(yùn)行,那么一定要注意在Linux下這里需要添加 #define TTY_POSIX 。而我們這里為了使得程序更明了,所以沒有使用該類,下面也就不再介紹它了。

QextSerialBase類繼承自QIODevice類,它提供了操作串口所必需的一些變量和函數(shù)等,而 Win_QextSerialPort和Posix_QextSerialPort均繼承自QextSerialBase 類,Win_QextSerialPort類添加了Windows平臺(tái)下操作串口的一些功能,Posix_QextSerialPort類添加了 Linux平臺(tái)下操作串口的一些功能。所以說,在Windows下我們使用Win_QextSerialPort類,在Linux下我們使用 Posix_QextSerialPort類。

3.在QextSerialBase類中還涉及到了一個(gè)枚舉變量QueryMode。

它有兩個(gè)值Polling和EventDriven 。QueryMode指的是讀取串口的方式,下面我們稱為查詢模式,我們將Polling稱為查詢方式Polling,將EventDriven稱為事件驅(qū)動(dòng)方式。

事件驅(qū)動(dòng)方式EventDriven就是使用事件處理串口的讀取,一旦有數(shù)據(jù)到來,就會(huì)發(fā)出readyRead()信號(hào),我們可以關(guān)聯(lián)該信號(hào)來讀取串口的數(shù)據(jù)。在事件驅(qū)動(dòng)的方式下,串口的讀寫是異步的,調(diào)用讀寫函數(shù)會(huì)立即返回,它們不會(huì)凍結(jié)調(diào)用線程。

而查詢方式Polling則不同,讀寫函數(shù)是同步執(zhí)行的,信號(hào)不能工作在這種模式下,而且有些功能也無法實(shí)現(xiàn)。但是這種模式下的開銷較小。我們需要自己建立定時(shí)器來讀取串口的數(shù)據(jù)。

在Windows下支持以上兩種模式,而在Linux下只支持Polling模式。

三、小結(jié)。

這里講了這么多,最后要說的只是,我們?cè)赒t中使用這個(gè)類編寫串口程序,根據(jù)平臺(tái)的不同只需要分別使用四個(gè)文件。

在Windows下是:

qextserialbase.cpp和qextserialbase.h 以及win_qextserialport.cpp和win_qextserialport.h

在Linux下是:

qextserialbase.cpp和qextserialbase.h 以及posix_qextserialport.cpp和posix_qextserialport.h

而在Windows下我們可以使用事件驅(qū)動(dòng)EventDriven方式,也可以使用查詢Polling方式,但是在Linux下我們只能使用查詢Polling方式。

第二部分 在Windows下編寫串口通信程序

我們的環(huán)境是Windowsxp,Qt4.6.3及Qt Creator2.0。

第一,下面我們首先使用事件驅(qū)動(dòng)來實(shí)現(xiàn)串口通信。

1.新建工程。

我們?cè)赒tCreator中新建Qt Gui工程,命名為myCom,Base Class選擇QWidget。

2.添加文件。

我們將那四個(gè)文件添加到工程文件夾中。如下圖。

然后我們將這四個(gè)文件添加到工程中,在Qt Creator的工程列表中的工程文件夾上點(diǎn)擊鼠標(biāo)右鍵,在彈出的菜單中選擇“AddExisting Files”菜單。如下圖。

我們?cè)趶棾龅膶?duì)話框中選中四個(gè)文件,按下“打開”按鈕即可,如下圖。

最終工程文件列表如下圖。

3.更改界面。

我們將界面設(shè)計(jì)如下。

其中的TextBrowser 部件用來顯示接收到的數(shù)據(jù),Line Edit部件用來輸入要發(fā)送的數(shù)據(jù),Push Button按鈕用來發(fā)送數(shù)據(jù)。我們保持各部件的屬性為默認(rèn)值即可。

  • 我們?cè)趙idget.h文件中進(jìn)行對(duì)象及函數(shù)聲明。
  • 添加頭文件包含:#include“win_qextserialport.h”

    然后在private中聲明對(duì)象:Win_QextSerialPort *myCom;

    聲明私有槽函數(shù):

    private slots:voidon_pushButton_clicked(); //”發(fā)送數(shù)據(jù)”按鈕槽函數(shù)void readMyCom(); //讀取串口5.在widget.cpp文件中進(jìn)行更改。在構(gòu)造函數(shù)中添加代碼,完成后,構(gòu)造函數(shù)內(nèi)容如下:Widget::Widget(QWidget*parent) :QWidget(parent),ui(newUi::Widget){ui->setupUi(this);myCom= new Win_QextSerialPort(“COM1″,QextSerialBase::EventDriven);//定義串口對(duì)象,指定串口名和查詢模式,這里使用事件驅(qū)動(dòng)EventDrivenmyCom->open(QIODevice::ReadWrite);//以讀寫方式打開串口myCom->setBaudRate(BAUD9600);//波特率設(shè)置,我們?cè)O(shè)置為9600myCom->setDataBits(DATA_8);//數(shù)據(jù)位設(shè)置,我們?cè)O(shè)置為8位數(shù)據(jù)位myCom->setParity(PAR_NONE);//奇偶校驗(yàn)設(shè)置,我們?cè)O(shè)置為無校驗(yàn)myCom->setStopBits(STOP_1);//停止位設(shè)置,我們?cè)O(shè)置為1位停止位myCom->setFlowControl(FLOW_OFF);//數(shù)據(jù)流控制設(shè)置,我們?cè)O(shè)置為無數(shù)據(jù)流控制myCom->setTimeout(500);//延時(shí)設(shè)置,我們?cè)O(shè)置為延時(shí)500ms,這個(gè)在Windows下好像不起作用connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));//信號(hào)和槽函數(shù)關(guān)聯(lián),當(dāng)串口緩沖區(qū)有數(shù)據(jù)時(shí),進(jìn)行讀串口操作}

    實(shí)現(xiàn)槽函數(shù):

    void Widget::readMyCom()//讀取串口數(shù)據(jù)并顯示出來{QByteArray temp = myCom->readAll();//讀取串口緩沖區(qū)的所有數(shù)據(jù)給臨時(shí)變量tempui->textBrowser->insertPlainText(temp);//將串口的數(shù)據(jù)顯示在窗口的文本瀏覽器中}voidWidget::on_pushButton_clicked() //發(fā)送數(shù)據(jù){myCom->write(ui->lineEdit->text().toAscii());//以ASCII碼形式將數(shù)據(jù)寫入串口}

    6.此時(shí),我們運(yùn)行程序,效果如下。

    可以看到,已經(jīng)成功完成通信了。

    (注:我們這里下位機(jī)使用的是單片機(jī),它使用串口與計(jì)算機(jī)的COM1相連。單片機(jī)上運(yùn)行的程序的功能是,接收到一個(gè)字符便向上位機(jī)發(fā)送一個(gè)字符串然后發(fā)送接收到的字符。)

    兩個(gè)重要問題的講解:

    一、關(guān)于數(shù)據(jù)接收。

    我們想在程序中對(duì)接收的數(shù)據(jù)進(jìn)行控制,但是readyRead()信號(hào)是一旦有數(shù)據(jù)到來就發(fā)射的,不過我們可以使用bytesAvailable()函數(shù)來檢查已經(jīng)獲得的字節(jié)數(shù),從而對(duì)數(shù)據(jù)接收進(jìn)行控制。

    (1)我們?cè)趙idget.cpp中添加頭文件包含:#include

    然后在讀串口函數(shù)中添加一行代碼,如下:

    void Widget::readMyCom() //讀取串口數(shù)據(jù)并顯示出來{qDebug() << “read: “<<myCom->bytesAvailable()<<”bytes”;//我們輸出每次獲得的字節(jié)數(shù)QByteArray temp = myCom->readAll();ui->textBrowser->insertPlainText(temp);}

    運(yùn)行程序,效果如下:

    可以看到,我們獲取的數(shù)據(jù)并不是一次獲得的。

    (2)利用上面的結(jié)論,我們可以讓串口緩沖區(qū)擁有了一定的數(shù)據(jù)后再讀取。

    void Widget::readMyCom(){if(myCom->bytesAvailable()>=8 )//如果可用數(shù)據(jù)大于或等于8字節(jié)再讀取{qDebug() << “read: “<<myCom->bytesAvailable()<<”bytes”;QByteArray temp = myCom->readAll();ui->textBrowser->insertPlainText(temp);}}

    運(yùn)行程序,效果如下:

    我們發(fā)送了兩次數(shù)據(jù),可以看到,這樣實(shí)現(xiàn)了每8個(gè)字節(jié)讀取一次,而最后剩余的不夠8個(gè)字節(jié)的數(shù)據(jù)將會(huì)和后面的數(shù)據(jù)一起讀出。

    然后我們將8改為3,發(fā)送一次數(shù)據(jù),效果如下:

    改為7,發(fā)送兩次數(shù)據(jù),效果如下:

    改為11,發(fā)送兩次數(shù)據(jù),效果如下:

    改為17,發(fā)送三次數(shù)據(jù),效果如下:

    重要結(jié)論:我們發(fā)送一次數(shù)據(jù),應(yīng)該獲得37字節(jié)的數(shù)據(jù),然后我們對(duì)比上面的結(jié)果,發(fā)現(xiàn)了什么?是的,其實(shí)串口每次讀取8字節(jié)的數(shù)據(jù)放到緩沖區(qū),只有 數(shù)據(jù)總數(shù)小于8字節(jié)時(shí),才會(huì)讀取小于8字節(jié)的數(shù)據(jù)。為了再次驗(yàn)證我們的結(jié)論,我們可以將上面程序中的“>=”改為“==”,那么只有8的倍數(shù)才能讀 取數(shù)據(jù)(當(dāng)然這里37也可以),你可以測(cè)試一下。

    關(guān)于接收數(shù)據(jù)方面,可以根據(jù)你自己的需要再去進(jìn)行研究和改進(jìn),這里只是拋磚引玉。

    二、關(guān)于發(fā)送數(shù)據(jù)。

    我們也可以使用函數(shù)獲取要發(fā)送的數(shù)據(jù)的大小,這里有個(gè)bytesToWrite()可以獲取要發(fā)送的字節(jié)數(shù)。例如將發(fā)送數(shù)據(jù)更改如下:

    voidWidget::on_pushButton_clicked() //發(fā)送數(shù)據(jù){myCom->write(ui->lineEdit->text().toAscii());qDebug() << “write: “<<myCom->bytesToWrite()<<”bytes”;//輸出要發(fā)送的字節(jié)數(shù)}

    運(yùn)行后效果如下:

    當(dāng)然,對(duì)于要發(fā)送的數(shù)據(jù)的大小我們不是很關(guān)心,而且它還有很多方法可以實(shí)現(xiàn),這個(gè)還有個(gè)bytesWritten()信號(hào)函數(shù)來獲取已經(jīng)發(fā)送的數(shù)據(jù)的大小,不過好像它不是很好用。這里將它們提出來,只是供大家參考而已。

    第二,使用查詢方式Polling來實(shí)現(xiàn)串口通信。

    這里再次說明,Polling方式是不能使用readyRead()信號(hào)的,所以我們需要自己設(shè)置定時(shí)器,來不斷地讀取緩沖區(qū)的數(shù)據(jù)。

    1.我們?cè)趙idget.h中聲明一個(gè)定時(shí)器對(duì)象。

    添加頭文件包含:#include

    添加private變量:QTimer *readTimer;

    2.我們?cè)趙idget.cpp文件中的構(gòu)造函數(shù)中更改。

    (1)將串口定義更改為:

    myCom = newWin_QextSerialPort(“COM1″,QextSerialBase::Polling);

    //定義串口對(duì)象,指定串口名和查詢模式,這里使用Polling

    (2)定義定時(shí)器,并將以前的關(guān)聯(lián)更改為定時(shí)器的關(guān)聯(lián)。

    readTimer = newQTimer(this);

    readTimer->start(100);

    //設(shè)置延時(shí)為100ms

    connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom()));

    //信號(hào)和槽函數(shù)關(guān)聯(lián),延時(shí)一段時(shí)間,進(jìn)行讀串口操作

    3.此時(shí)運(yùn)行程序,便可以正常收發(fā)數(shù)據(jù)了。

    重點(diǎn):關(guān)于延時(shí)問題。

    上面的程序中可以進(jìn)行數(shù)據(jù)的接收了,但是好像中間的延時(shí)有點(diǎn)長(zhǎng),要等一會(huì)兒才能收到數(shù)據(jù),而且即便我們將定時(shí)器改為10ms 也不行。問題在哪里呢?其實(shí)真正控制串口讀寫時(shí)間的不是我們的定時(shí)器,而是延時(shí)timeout。我們?cè)跇?gòu)造函數(shù)中設(shè)置了延時(shí):

    myCom->setTimeout(500);

    //延時(shí)設(shè)置,我們?cè)O(shè)置為延時(shí)500ms

    我們前面說延時(shí)并不起作用,那是因?yàn)槭窃谑录?qū)動(dòng)的情況下,一旦有數(shù)據(jù)到來就會(huì)觸發(fā)readyRead()信號(hào),所以延時(shí)不起作用。但是現(xiàn)在,真正 控制串口讀寫數(shù)據(jù)間隔的就是這個(gè)函數(shù)。這里值得注意,我們現(xiàn)在所說的串口讀寫是指底層的串口讀寫,從上面的程序中我們也可以看到,我們每隔100ms去讀 串口,確切地說,應(yīng)該是去讀串口緩沖區(qū)。而timeout才是正真的讀取串口數(shù)據(jù),將讀到的數(shù)據(jù)放入串口緩沖區(qū)。所以如果timeout時(shí)間很長(zhǎng),即便我 們的定時(shí)器時(shí)間再短,也是讀不到數(shù)據(jù)的。所以我們這里需要將timeout設(shè)置為較小的值,比如10。我們更改代碼:

    myCom->setTimeout(10);

    這樣再運(yùn)行程序,我們就可以很快地獲得數(shù)據(jù)了。

    關(guān)于數(shù)據(jù)接收:事件驅(qū)動(dòng)那里的結(jié)論依然有用,不過這里更多的是靠讀取的時(shí)間間隔來控制。

    關(guān)于發(fā)送數(shù)據(jù):這時(shí)bytesToWrite()函數(shù)就不再那么好用了。

    第三部分 在Linux下編寫串口通信程序

    我這里的環(huán)境是Ubuntu10.04,Qt 4.6.3和Qt Creator2.0 。上面已經(jīng)提到,在Linux下只能使用Polling的方式讀取串口數(shù)據(jù),所以我們將上面Windows下的應(yīng)用Polling的程序在Linux下重 新編譯。我們使用Qt Creator打開該工程,然后進(jìn)行下面的操作。

    1.文件替換。

    將工程中的win_qextserialport.cpp和win_qextserialport.h文件替換成posix_qextserialport.cpp和posix_qextserialport.h文件。

    (1)我們先刪除工程中的win_qextserialport.cpp和win_qextserialport.h文件。

    在工程列表中用鼠標(biāo)右擊win_qextserialport.h,然后選擇“Remove File”選項(xiàng)。如下圖。

    在彈出的對(duì)話框中我們選中“Deletefile permanently”選項(xiàng),確保刪除了工程文件夾中的文件。如下圖。

    然后我們使用同樣的方法刪除win_qextserialport.cpp文件。

    (2)我們按照Windows下添加文件的方法,向工程中添加posix_qextserialport.cpp和posix_qextserialport.h文件。最終工程文件列表如下。

    2.設(shè)置編碼。

    (這是因?yàn)閮蓚€(gè)系統(tǒng)使用的默認(rèn)編碼不同造成的,如果你那里沒有該問題,可以跳過這一步)

    現(xiàn)在我們打開widget.cpp文件,發(fā)現(xiàn)中文出現(xiàn)亂碼,而且無法編輯。在編輯器最上面有一個(gè)黃色提示條和一個(gè)“Select Encoding”按鈕,我們點(diǎn)擊該按鈕。如下圖。

    在彈出的對(duì)話框中我們選擇“GB2312”。按下“Reload with Encoding”按鈕,中文就可以正常顯示了。

    3.更改程序。

    在widget.h文件中:

    將以前的#include“win_qextserialport.h”更改為#include“posix_qextserialport.h”將以前的Win_QextSerialPort*myCom;更改為Posix_QextSerialPort*myCom;在widget.cpp文件中:將以前的myCom= new Win_QextSerialPort(“COM1″,QextSerialBase::Polling);更改為:myCom= new Posix_QextSerialPort(“/dev/ttyS0″,QextSerialBase::Polling);

    (這里一定要注意串口名稱的寫法。)

    4.下面我們運(yùn)行程序。

    這時(shí)可能會(huì)出現(xiàn)以下提示。

    錯(cuò)誤是說一個(gè)函數(shù)的調(diào)用出現(xiàn)了問題。我們點(diǎn)擊該錯(cuò)誤,定位到出錯(cuò)的位置,然后將那個(gè)函數(shù)中的第一個(gè)參數(shù)刪除即可。如下圖。

    5.再次運(yùn)行程序,這時(shí)已經(jīng)可以正常運(yùn)行了。

    6.小結(jié)

    可以看到將Windows下的串口程序在Linux下重新編譯是很簡(jiǎn)單的,我們只需要替換那兩個(gè)文件,然后更改一下頭文件包含,對(duì)象定義和串口名即可。

    結(jié)尾

    本教程比較詳細(xì)的講述了使用Qt在Windows下和Linux下編寫串口通信程序的方法,但是對(duì)于串口通信的內(nèi)容還有很多,我們現(xiàn)在還無法全部涵蓋。希望廣大網(wǎng)友可以提出寶貴建議,將Wincom軟件進(jìn)行功能擴(kuò)展,或者將本教程繼續(xù)更新下去。

    如果你喜歡本教程的寫作風(fēng)格,而且您也是Qt愛好者,您可以訪問我們的網(wǎng)站,這里有一系列教程和軟件供您參考學(xué)習(xí),當(dāng)然也希望您能為我們的網(wǎng)站添磚加瓦,讓我們一起為Qt 及Qt Creator的普及貢獻(xiàn)自己的力量。

    總結(jié)

    以上是生活随笔為你收集整理的如何在QT中读取串口数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。