999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于VS2010的PComm多類型數據串口通信軟件設計

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

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

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

關鍵字:Pcomm;VS2010;串口通信;多類型數據

0 引言

串口通信程序設計方法多樣且靈活,可適應于不同的應用環境。在VC++平臺下實現串口數據傳輸通常有三種方式,最常用的方式是在程序中直接調用或使用類封裝的Windows API(Application Program Interface)函數,通過對設備驅動程序的底層控制實現串口操作,API函數種類較多、功能分散,且使用串口較多時,需要編輯繁瑣的線程同步[1]。第二種方法是使用MSComm串口通信控件[3],在VS2010中使用,需要對控件進行安裝和注冊,并且要將串口通信控件添加到工具箱中。數據類型轉換比較復雜,并且使用時需要將控件拖入對話框中,不能滿足復雜情況下的通信要求[2],例如Ribbon風格下使用就會受到限制。本文使用另外一種方法,由第三方廠商MOXA公司提供的PComm(Professional Comm Tool for PC)串口通信。PComm提供了一套封裝的API函數動態鏈接庫,可滿足處理多進程/多線程等復雜情況下的串口通信,并且功能強大、傳輸速率高、使用方便靈活[4]。基于以上分析,在Win64位操作系統中,采用VS2010平臺下的MFC進行多類型數據串口通信軟件的設計和編程實現,并解決PComm模塊難以在64位Windows環境中使用及不能傳輸多類型數據的問題。

1 PComm函數庫

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

表1 PComm函數列表

2 軟件設計與實現

2.1 窗體設計

啟動VS2010,新建一個基于對話框的MFC應用程序SerialTest。MFC程序界面框架如圖1所示。

圖1 MFC程序界面框架

設置對話框的Caption屬性為“PCOMM串口通信”,增加2個編輯框控件(Edit Control)分別用來顯示接收數據和輸入發送數據,3個按鈕控件(Button)分別表示“清空”,“發送”和“打開串口”,并用于執行相關操作,1個組合框控件(Combo Box)顯示串口號,將其Type屬性設置為DropList,2個編組框控件(Group Box)表示接收和發送功能區域,1個靜態字符控件。與控件相對應的成員變量[6]如表2所示。

表2 與控件對應成員變量

2.2 函數聲明

在VS2010環境下使用PComm函數庫必須將其引用到工程中。PComm函數庫中包含三個文件,PCOMM.H、PCOMM.dll和PCOMM.lib。PCOMM.H為頭文件、PCOMM.dll為動態鏈接庫,而PCOMM.lib則是靜態庫文件。h文件包含了函數聲明,lib文件用于指定dll中各功能函數的入口及地址,真正的函數在dll中。需要注意的是,如果Windows操作系統是64位,就需要專門下載64位動態鏈接庫。將三個文件都復制到當前工程的目錄下。

打開解決方案資源管理器,在頭文件中右擊添加現有項PCOMM.H頭文件。或者是添加工程的頭文件目錄,具體方法為:點擊菜單項目-SerialTest屬性-配置屬性-C/C++-常規-附加包含目錄,編輯輸入頭文件的存放目錄。然后打開類視圖,在SerialTestDlg.cpp中加入串口頭文件引用,輸入#include“PCOMM.h”。

除引入頭文件之外,還需要在鏈接過程中將lib加入,即添加附加依賴項和附加庫目錄,否則只有函數聲明,沒有函數實現過程。具體方法為:點擊菜單項目-SerialTest屬性-配置屬性-鏈接器-輸入-附加依賴項,編輯輸入PCOMM.lib,點擊鏈接器-輸入-附加庫目錄,編輯輸入lib所在目錄,對當前項目有效,這樣就為PCOMM.dll動態庫添加了靜態鏈接,實現了動態庫的靜態調用。加入了動態庫的函數聲明,就可以直接使用dll中的函數。

2.3 程序設計

(1)初始化

在類視圖面板的CSerialTestDlg類中添加bool型變量flag用于標記串口狀態,添加int型變量表示串口號。在初始化函數OnInitDialog()中對表示串口號的組合框控件的列表框添加列表項。

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

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

……

m_port.SetCurSel(0);//默認選擇串口號為1

(2)串口配置

在CSerialTestDlg類中添加兩個函數:打開串口函數和關閉串口函數。sio_ioctl()函數為串口設置波特率、位數據位、位停止位、無奇偶校驗等參數。sio_cnt_irq用于設置中斷回調函數,每當串口收到指定字節數據時,系統就會自動調用這個中斷回調函數,這里的回調函數名為cntirq。程序代碼如下:

//打開串口函數

void CSerialTestDlg::open_com(void)

{

n_port=m_port.GetCurSel()+1;//真正的串口從索引號加1開始

if (SIO_OK!=sio_open(n_port))

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

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

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

}

//關閉串口函數

void CSerialTestDlg::close_com(void)

{

if (SIO_OK!=sio_close(n_port))

MessageBox(_T(“無法關閉串口”),_T(“WARNING”),MB_ICONWARNING);

}

為“打開串口”按鈕添加事件處理程序,或者直接雙擊按鈕添加程序。若串口為關閉狀態,則執行打開串口程序,否則執行關閉串口程序。

flag=!flag;

if (flag==TRUE)

CSerialTestDlg::open_com();

else

CSerialTestDlg::close_com();

(3)接收過程

數據的接收主要由聲明回調函數實現,即 CALLBACK類型的cntirq()事件處理函數,CALLBACK類型函數一般由程序員設計,卻是Windows系統調用執行的特殊函數[5]。與一般的成員函數不同,中斷回調函數并不寫在類里面,在調用過程中不通過任何對象,因此也并不屬于某一個具體對象,所以可以在對象未產生之前被調用。中斷回調函數的任務就是發送一個WM_PCOMM消息到窗口, GetMainWnd()函數功能是獲得主窗口,返回類型是CWnd的指針,用AfxGetApp()->GetMainWnd()->m_hWnd語句就獲得了主窗口句柄。這樣,消息就可以發到主窗口了,每當串口接收了數據,就會發一個消息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是系統已經定義好的消息地址,從這個地址開始可以自定義消息地址,WM_USER+50表示自定義消息WM_PCOMM位于消息地址向后偏移50,自定義消息地址由用戶設置,且與消息的執行先后無關,但要注意不能與其他的用戶自定義消息地址相沖突。

自定義消息處理afx_msg函數,不同于VC6.0環境,在VS2010環境下afx_msg函數的類型為LRESULT。具體方法為右擊對話框類打開類向導添加方法,函數名定義為OnWmpcomm,并添加兩個參數,函數聲明及函數體實現代碼如下。

afx_msg LRESULT OnWmpcomm(WPARAM wParam, LPARAM lParam);

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

{

char revBuff[200];//聲明字符串數組

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]=’

主站蜘蛛池模板: 国产精品区网红主播在线观看| 福利在线免费视频| 国产美女主播一级成人毛片| 全午夜免费一级毛片| 99久久这里只精品麻豆| 无码精品国产VA在线观看DVD| 成人福利在线观看| 国产精品亚洲αv天堂无码| 99视频国产精品| 免费国产好深啊好涨好硬视频| 成人在线观看不卡| 亚洲人成日本在线观看| 久久久久国产一级毛片高清板| 亚洲中文字幕在线观看| 国产区人妖精品人妖精品视频| 国产91久久久久久| www.精品视频| 精品少妇三级亚洲| 久久夜色精品国产嚕嚕亚洲av| 日韩高清中文字幕| 另类专区亚洲| 狂欢视频在线观看不卡| 99久久精彩视频| 亚洲免费福利视频| www.狠狠| 伊人久久大线影院首页| 毛片网站免费在线观看| 成人福利在线视频| 无码 在线 在线| 狠狠亚洲五月天| 国产精品污污在线观看网站| 不卡色老大久久综合网| 亚洲国产精品成人久久综合影院 | 手机在线国产精品| 日韩黄色大片免费看| 日韩在线影院| 国产美女丝袜高潮| 久久精品只有这里有| 亚洲美女久久| 精品人妻无码区在线视频| 在线不卡免费视频| 伊人狠狠丁香婷婷综合色| 91小视频在线观看免费版高清| 色综合成人| 欧美特级AAAAAA视频免费观看| 72种姿势欧美久久久大黄蕉| 免费不卡视频| 91娇喘视频| 无码专区国产精品一区| 国产偷倩视频| 欧美精品啪啪| 高清无码一本到东京热| 亚洲三级片在线看| 精品少妇三级亚洲| 亚洲福利一区二区三区| 囯产av无码片毛片一级| 亚洲国产日韩在线观看| 91亚瑟视频| 99久久国产综合精品女同| 亚洲国产一成久久精品国产成人综合| 99热这里只有精品2| 亚洲午夜福利精品无码不卡| 免费无码又爽又黄又刺激网站| 天天综合网亚洲网站| 亚洲欧洲一区二区三区| 韩日免费小视频| 就去吻亚洲精品国产欧美| 色婷婷天天综合在线| 天堂亚洲网| 久久精品视频亚洲| 亚洲一区二区精品无码久久久| 成人无码区免费视频网站蜜臀| 91麻豆国产精品91久久久| 日韩亚洲高清一区二区| 久久 午夜福利 张柏芝| 免费国产高清视频| 中文字幕亚洲电影| 色综合成人| 在线日韩日本国产亚洲| 色婷婷在线播放| 久久久久国产精品嫩草影院| 国产一级小视频|