王文娟,李緒凱 ,王欣 ,邢娜
(1.陸軍工程大學石家莊校區,河北石家莊,053000;2.中國電子科技集團公司第五十四研究所,河北石家莊,050081)
關鍵字:Pcomm;VS2010;串口通信;多類型數據
串口通信程序設計方法多樣且靈活,可適應于不同的應用環境。在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環境中使用及不能傳輸多類型數據的問題。
PComm函數庫中包含了多種功能的函數,包括串口設置(Port Control)、輸入數據(Input Data)、輸出數據(Output Data)、狀態查詢(Port Status Inquiry)、文件傳輸(File Transfer)及其他特殊設定函數(Miscellaneous),能夠滿足幾乎所有的串口通信需求。PComm所提供的函數均以sio_開頭命名,其中本軟件中涉及的PComm函數如表1所示。

表1 PComm函數列表
啟動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 與控件對應成員變量
在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中的函數。
(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]=’ 主站蜘蛛池模板: 欧美色香蕉| 亚洲动漫h| 国产91精品最新在线播放| 曰AV在线无码| 日本一区二区三区精品国产| 亚洲视频色图| 国产视频欧美| 亚洲日韩AV无码一区二区三区人| 一级一级一片免费| 伊人福利视频| 欧美成人区| 久久精品波多野结衣| 国产人前露出系列视频| 国产精品99一区不卡| 日本道综合一本久久久88| 免费不卡在线观看av| 中文字幕亚洲精品2页| 日韩国产综合精选| 中文字幕亚洲精品2页| 亚洲swag精品自拍一区| 白浆免费视频国产精品视频| 72种姿势欧美久久久久大黄蕉| 手机在线免费毛片| 欧美日韩中文国产va另类| 国产福利微拍精品一区二区| 免费人成视频在线观看网站| 人妖无码第一页| 91福利免费视频| 色悠久久久久久久综合网伊人| 亚洲男人的天堂久久香蕉网| 国产熟睡乱子伦视频网站| 亚州AV秘 一区二区三区| 国产精品林美惠子在线播放| 国产男人的天堂| 亚洲第一极品精品无码| 无码精品国产dvd在线观看9久| 超薄丝袜足j国产在线视频| 欧美一级色视频| 麻豆国产精品一二三在线观看| 91蜜芽尤物福利在线观看| 少妇极品熟妇人妻专区视频| 欧美一级在线看| 永久免费无码成人网站| 国产一区亚洲一区| 亚洲欧洲美色一区二区三区| 欧美日韩国产在线观看一区二区三区| 亚洲成aⅴ人片在线影院八| 国产精品永久不卡免费视频| 亚洲日韩日本中文在线| 亚洲色图欧美在线| 天堂网国产| 久久精品中文字幕少妇| 国产网站黄| 免费人成网站在线高清| 最新国产高清在线| 色欲国产一区二区日韩欧美| 色综合天天操| 成人免费视频一区| 中国国产A一级毛片| 国产精品一线天| 国产特级毛片aaaaaaa高清| 无码精品福利一区二区三区| 国产人成网线在线播放va| 免费观看国产小粉嫩喷水| 丁香亚洲综合五月天婷婷| 国产在线小视频| 国产亚洲高清视频| 亚洲制服丝袜第一页| 理论片一区| 国产色婷婷| 福利姬国产精品一区在线| 日韩性网站| 亚洲人成在线精品| 国产精品久久久精品三级| 91精品伊人久久大香线蕉| 在线视频一区二区三区不卡| 国产69精品久久久久孕妇大杂乱| 国产对白刺激真实精品91| 中文国产成人精品久久| 久久永久视频| 毛片手机在线看| WWW丫丫国产成人精品|