亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于VS2010的PComm多類(lèi)型數(shù)據(jù)串口通信軟件設(shè)計(jì)

        2018-11-08 08:27:02王文娟李緒凱王欣邢娜
        電子測(cè)試 2018年20期
        關(guān)鍵詞:按鈕

        王文娟,李緒凱 ,王欣 ,邢娜

        (1.陸軍工程大學(xué)石家莊校區(qū),河北石家莊,053000;2.中國(guó)電子科技集團(tuán)公司第五十四研究所,河北石家莊,050081)

        關(guān)鍵字:Pcomm;VS2010;串口通信;多類(lèi)型數(shù)據(jù)

        0 引言

        串口通信程序設(shè)計(jì)方法多樣且靈活,可適應(yīng)于不同的應(yīng)用環(huán)境。在VC++平臺(tái)下實(shí)現(xiàn)串口數(shù)據(jù)傳輸通常有三種方式,最常用的方式是在程序中直接調(diào)用或使用類(lèi)封裝的Windows API(Application Program Interface)函數(shù),通過(guò)對(duì)設(shè)備驅(qū)動(dòng)程序的底層控制實(shí)現(xiàn)串口操作,API函數(shù)種類(lèi)較多、功能分散,且使用串口較多時(shí),需要編輯繁瑣的線程同步[1]。第二種方法是使用MSComm串口通信控件[3],在VS2010中使用,需要對(duì)控件進(jìn)行安裝和注冊(cè),并且要將串口通信控件添加到工具箱中。數(shù)據(jù)類(lèi)型轉(zhuǎn)換比較復(fù)雜,并且使用時(shí)需要將控件拖入對(duì)話框中,不能滿足復(fù)雜情況下的通信要求[2],例如Ribbon風(fēng)格下使用就會(huì)受到限制。本文使用另外一種方法,由第三方廠商MOXA公司提供的PComm(Professional Comm Tool for PC)串口通信。PComm提供了一套封裝的API函數(shù)動(dòng)態(tài)鏈接庫(kù),可滿足處理多進(jìn)程/多線程等復(fù)雜情況下的串口通信,并且功能強(qiáng)大、傳輸速率高、使用方便靈活[4]?;谝陨戏治觯赪in64位操作系統(tǒng)中,采用VS2010平臺(tái)下的MFC進(jìn)行多類(lèi)型數(shù)據(jù)串口通信軟件的設(shè)計(jì)和編程實(shí)現(xiàn),并解決PComm模塊難以在64位Windows環(huán)境中使用及不能傳輸多類(lèi)型數(shù)據(jù)的問(wèn)題。

        1 PComm函數(shù)庫(kù)

        PComm函數(shù)庫(kù)中包含了多種功能的函數(shù),包括串口設(shè)置(Port Control)、輸入數(shù)據(jù)(Input Data)、輸出數(shù)據(jù)(Output Data)、狀態(tài)查詢(Port Status Inquiry)、文件傳輸(File Transfer)及其他特殊設(shè)定函數(shù)(Miscellaneous),能夠滿足幾乎所有的串口通信需求。PComm所提供的函數(shù)均以sio_開(kāi)頭命名,其中本軟件中涉及的PComm函數(shù)如表1所示。

        表1 PComm函數(shù)列表

        2 軟件設(shè)計(jì)與實(shí)現(xiàn)

        2.1 窗體設(shè)計(jì)

        啟動(dòng)VS2010,新建一個(gè)基于對(duì)話框的MFC應(yīng)用程序SerialTest。MFC程序界面框架如圖1所示。

        圖1 MFC程序界面框架

        設(shè)置對(duì)話框的Caption屬性為“PCOMM串口通信”,增加2個(gè)編輯框控件(Edit Control)分別用來(lái)顯示接收數(shù)據(jù)和輸入發(fā)送數(shù)據(jù),3個(gè)按鈕控件(Button)分別表示“清空”,“發(fā)送”和“打開(kāi)串口”,并用于執(zhí)行相關(guān)操作,1個(gè)組合框控件(Combo Box)顯示串口號(hào),將其Type屬性設(shè)置為DropList,2個(gè)編組框控件(Group Box)表示接收和發(fā)送功能區(qū)域,1個(gè)靜態(tài)字符控件。與控件相對(duì)應(yīng)的成員變量[6]如表2所示。

        表2 與控件對(duì)應(yīng)成員變量

        2.2 函數(shù)聲明

        在VS2010環(huán)境下使用PComm函數(shù)庫(kù)必須將其引用到工程中。PComm函數(shù)庫(kù)中包含三個(gè)文件,PCOMM.H、PCOMM.dll和PCOMM.lib。PCOMM.H為頭文件、PCOMM.dll為動(dòng)態(tài)鏈接庫(kù),而PCOMM.lib則是靜態(tài)庫(kù)文件。h文件包含了函數(shù)聲明,lib文件用于指定dll中各功能函數(shù)的入口及地址,真正的函數(shù)在dll中。需要注意的是,如果Windows操作系統(tǒng)是64位,就需要專(zhuān)門(mén)下載64位動(dòng)態(tài)鏈接庫(kù)。將三個(gè)文件都復(fù)制到當(dāng)前工程的目錄下。

        打開(kāi)解決方案資源管理器,在頭文件中右擊添加現(xiàn)有項(xiàng)PCOMM.H頭文件?;蛘呤翘砑庸こ痰念^文件目錄,具體方法為:點(diǎn)擊菜單項(xiàng)目-SerialTest屬性-配置屬性-C/C++-常規(guī)-附加包含目錄,編輯輸入頭文件的存放目錄。然后打開(kāi)類(lèi)視圖,在SerialTestDlg.cpp中加入串口頭文件引用,輸入#include“PCOMM.h”。

        除引入頭文件之外,還需要在鏈接過(guò)程中將lib加入,即添加附加依賴(lài)項(xiàng)和附加庫(kù)目錄,否則只有函數(shù)聲明,沒(méi)有函數(shù)實(shí)現(xiàn)過(guò)程。具體方法為:點(diǎn)擊菜單項(xiàng)目-SerialTest屬性-配置屬性-鏈接器-輸入-附加依賴(lài)項(xiàng),編輯輸入PCOMM.lib,點(diǎn)擊鏈接器-輸入-附加庫(kù)目錄,編輯輸入lib所在目錄,對(duì)當(dāng)前項(xiàng)目有效,這樣就為PCOMM.dll動(dòng)態(tài)庫(kù)添加了靜態(tài)鏈接,實(shí)現(xiàn)了動(dòng)態(tài)庫(kù)的靜態(tài)調(diào)用。加入了動(dòng)態(tài)庫(kù)的函數(shù)聲明,就可以直接使用dll中的函數(shù)。

        2.3 程序設(shè)計(jì)

        (1)初始化

        在類(lèi)視圖面板的CSerialTestDlg類(lèi)中添加bool型變量flag用于標(biāo)記串口狀態(tài),添加int型變量表示串口號(hào)。在初始化函數(shù)OnInitDialog()中對(duì)表示串口號(hào)的組合框控件的列表框添加列表項(xiàng)。

        m_port.AddString(_T(“COM1”));

        m_port.AddString(_T(“COM2”));

        ……

        m_port.SetCurSel(0);//默認(rèn)選擇串口號(hào)為1

        (2)串口配置

        在CSerialTestDlg類(lèi)中添加兩個(gè)函數(shù):打開(kāi)串口函數(shù)和關(guān)閉串口函數(shù)。sio_ioctl()函數(shù)為串口設(shè)置波特率、位數(shù)據(jù)位、位停止位、無(wú)奇偶校驗(yàn)等參數(shù)。sio_cnt_irq用于設(shè)置中斷回調(diào)函數(shù),每當(dāng)串口收到指定字節(jié)數(shù)據(jù)時(shí),系統(tǒng)就會(huì)自動(dòng)調(diào)用這個(gè)中斷回調(diào)函數(shù),這里的回調(diào)函數(shù)名為cntirq。程序代碼如下:

        //打開(kāi)串口函數(shù)

        void CSerialTestDlg::open_com(void)

        {

        n_port=m_port.GetCurSel()+1;//真正的串口從索引號(hào)加1開(kāi)始

        if (SIO_OK!=sio_open(n_port))

        MessageBox(_T(“打開(kāi)串口失敗”),_T(“WARNING”),MB_ICONWARNING);

        sio_ioctl(n_port,115200,BIT_8|STOP_1|P_NONE);//設(shè)置串口參數(shù)

        sio_cnt_irq(n_port,cntirq,1);//設(shè)置中斷函數(shù)

        }

        //關(guān)閉串口函數(shù)

        void CSerialTestDlg::close_com(void)

        {

        if (SIO_OK!=sio_close(n_port))

        MessageBox(_T(“無(wú)法關(guān)閉串口”),_T(“WARNING”),MB_ICONWARNING);

        }

        為“打開(kāi)串口”按鈕添加事件處理程序,或者直接雙擊按鈕添加程序。若串口為關(guān)閉狀態(tài),則執(zhí)行打開(kāi)串口程序,否則執(zhí)行關(guān)閉串口程序。

        flag=!flag;

        if (flag==TRUE)

        CSerialTestDlg::open_com();

        else

        CSerialTestDlg::close_com();

        (3)接收過(guò)程

        數(shù)據(jù)的接收主要由聲明回調(diào)函數(shù)實(shí)現(xiàn),即 CALLBACK類(lèi)型的cntirq()事件處理函數(shù),CALLBACK類(lèi)型函數(shù)一般由程序員設(shè)計(jì),卻是Windows系統(tǒng)調(diào)用執(zhí)行的特殊函數(shù)[5]。與一般的成員函數(shù)不同,中斷回調(diào)函數(shù)并不寫(xiě)在類(lèi)里面,在調(diào)用過(guò)程中不通過(guò)任何對(duì)象,因此也并不屬于某一個(gè)具體對(duì)象,所以可以在對(duì)象未產(chǎn)生之前被調(diào)用。中斷回調(diào)函數(shù)的任務(wù)就是發(fā)送一個(gè)WM_PCOMM消息到窗口, GetMainWnd()函數(shù)功能是獲得主窗口,返回類(lèi)型是CWnd的指針,用AfxGetApp()->GetMainWnd()->m_hWnd語(yǔ)句就獲得了主窗口句柄。這樣,消息就可以發(fā)到主窗口了,每當(dāng)串口接收了數(shù)據(jù),就會(huì)發(fā)一個(gè)消息WM_PCOMM到窗體,WM_PCOMM是用戶自定義消息。

        void CALLBACK cntirq(int n_port)

        {

        CWnd *pgetwnd=new CWnd;

        pgetwnd=AfxGetApp()->GetMainWnd();//獲取主窗口

        if(pgetwnd)

        {

        if(AfxGetApp()->GetMainWnd()->m_hWnd)

        {

        ::PostMessage(AfxGetApp()->GetMainWnd()->m_hWnd,WM_PCOMM,0,0);}

        }

        }

        用戶自定義消息需要在CSerialTestDlg.h的宏定義后面加入定義

        #define WM_PCOMM WM_USER+50

        WM_USER是系統(tǒng)已經(jīng)定義好的消息地址,從這個(gè)地址開(kāi)始可以自定義消息地址,WM_USER+50表示自定義消息WM_PCOMM位于消息地址向后偏移50,自定義消息地址由用戶設(shè)置,且與消息的執(zhí)行先后無(wú)關(guān),但要注意不能與其他的用戶自定義消息地址相沖突。

        自定義消息處理afx_msg函數(shù),不同于VC6.0環(huán)境,在VS2010環(huán)境下afx_msg函數(shù)的類(lèi)型為L(zhǎng)RESULT。具體方法為右擊對(duì)話框類(lèi)打開(kāi)類(lèi)向?qū)砑臃椒?,函?shù)名定義為OnWmpcomm,并添加兩個(gè)參數(shù),函數(shù)聲明及函數(shù)體實(shí)現(xiàn)代碼如下。

        afx_msg LRESULT OnWmpcomm(WPARAM wParam, LPARAM lParam);

        afx_msg LRESULT CSerialTestDlg::OnWmpcomm(WPARA M wParam, LPARAM lParam)

        {

        char revBuff[200];//聲明字符串?dāng)?shù)組

        int n=sio_read(n_port,revBuff,100);//讀操作

        if(n)

        {

        int len=MultiByteToWideChar(CP_ACP,0,revBuff,n,NULL,0);

        TCHAR *buf=new TCHAR[len+1];

        MultiByteToWideChar(CP_ACP,0,revBuff,n,buf,len);

        buf[len]=’

        亚洲熟妇少妇任你躁在线观看| 久久亚洲精品中文字幕| 波多野结衣爽到高潮大喷| 国产成人久久精品77777综合| 成人午夜无人区一区二区| 国产麻豆成人精品av| 亚洲精一区二区三av| 午夜视频在线在免费| 国产精品一区二区在线观看99| 精品亚洲一区二区视频| 日韩av一区二区不卡| 久久99精品久久水蜜桃| 奇米影视久久777中文字幕| 亚洲精品一区二区三区播放| 亚洲精品久久蜜桃av| 亚洲av日韩综合一区二区三区| 国产精品女同一区二区| 91自国产精品中文字幕| 91成人黄色蘑菇视频| 亚洲精品久久| 亚洲美女影院| 国产大学生自拍三级视频| 二区三区三区视频在线观看| 国产激情久久久久影院老熟女| 国产丝袜在线精品丝袜不卡| 国内偷拍视频一区二区| 日韩亚洲精品中文字幕在线观看| 欧美在线 | 亚洲| 狠狠色狠狠色综合网老熟女| 美女视频在线观看一区二区三区| 无码人妻一区二区三区在线| 爽爽午夜影视窝窝看片| 女人被躁到高潮嗷嗷叫| 国模91九色精品二三四| 一区二区三区国产| 亚洲AV秘 无码二区在线| 国内精品女同一区二区三区| 97在线视频人妻无码| 色欲aⅴ亚洲情无码av蜜桃| 国产亚洲AV片a区二区| 精品国产三级a在线观看不卡|