欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
VC實(shí)現串行通信的動(dòng)態(tài)鏈接庫(DLL)
VC實(shí)現串行通信的動(dòng)態(tài)鏈接庫(DLL)
作者: 劉建武
出處: 開(kāi)發(fā)高手
責任編輯: 方舟
[ 2005-06-27 09:37 ]


 

  本文是作者根據工程中的實(shí)踐經(jīng)驗,以實(shí)例方式介紹了用VC++編寫(xiě)DLL實(shí)現串行通信的方法,并給出了用其它語(yǔ)言調用該DLL的范例。

  一、引言

  串行通訊口作為計算機與外部串行設備進(jìn)行數據傳輸的重要端口,因其使用簡(jiǎn)單、方便,在業(yè)界的各種計算機系統中得到了廣泛的應用。由于應用范圍很廣,軟件人員在串行通信方面也積累了豐富的編程經(jīng)驗。關(guān)于串行通信的文章不時(shí)見(jiàn)于報端,并且還有一些專(zhuān)門(mén)討論
串行通訊編程的書(shū)籍,為軟件人員提供了豐富的資源,同時(shí)對初次涉足串口編程的軟件開(kāi)發(fā)者提供很好的范例幫助。

  雖然關(guān)于串口編程的資料很多,但由于工程上需求多種多樣,需要根據不同的條件對串口進(jìn)行靈活控制,在實(shí)際應用中,常用的方法有:

  (1)用匯編或標準通訊函數,往指定端口直接讀寫(xiě)數據;

  (2)利用Visual Studio提供的MSComm控件;

  (3)使用Windows提供的API函數。

  本文是作者在工程實(shí)踐中根據實(shí)際需要,在Visual C++環(huán)境中,直接使用Windows提供的API函數實(shí)現一個(gè)串行通信動(dòng)態(tài)鏈接庫(DLL)的完整實(shí)例,實(shí)例既給出了DLL函數的編寫(xiě)方法,又包括一份用其它編程工具(VB)對此DLL進(jìn)行聲明及調用的范例。為了使讀者一目了然,并減少代碼量,本例作了簡(jiǎn)化,但完全可以運行。希望對需要進(jìn)行串行通信編程的同行以及需要學(xué)習編寫(xiě)DLL的編程愛(ài)好者提供一點(diǎn)幫助。

  二、準備知識

  1、DLL基本概念

  動(dòng)態(tài)鏈接庫(DLL) 是Windows操作系統的基礎,Windows API中的所有函數就是包含在DLL中,它有眾多優(yōu)點(diǎn),如:簡(jiǎn)化軟件項目管理以便分工合作,有助于節省內存,便于資源共享并且可以用多種語(yǔ)言來(lái)編寫(xiě)。

  用VC++ 編寫(xiě)動(dòng)態(tài)鏈接有以下四種類(lèi)型:Win32 DLL、MFC常規DLL(動(dòng)態(tài)鏈接MFC)、MFC常規DLL(靜態(tài)鏈接MFC)、MFC擴展DLL等,關(guān)于它們之間的區別,在此不一一介紹,可參閱相關(guān)文檔。本程序的編寫(xiě)為Win32 DLL。

  2、串行通信基礎知識

  在Windows系統,系統通過(guò)一個(gè)叫DCB(Device Control Block)的結構對串行口進(jìn)行配置,通過(guò)Windows API GetCommState函數可以得到串行通訊口的狀態(tài)信息,使用SetCommState函數可以對串行通訊口進(jìn)行設置,實(shí)現串行通信一般需按以下四步進(jìn)行:

  (1) 打開(kāi)串口。由于串口是獨占性資源,因此應用程序打開(kāi)串口后,別的應用程序就不能再打開(kāi)此串口了。

  (2)配置串口。利用GetCommState函數獲取串口當前配置,根據需要更改DCB 結構中的參數,然后用SetCommState函數設置串口通訊參數。

  (3)數據傳送。在串口上進(jìn)行數據發(fā)送接收,并根據需要進(jìn)行校驗,觸發(fā)一些事件等等。這個(gè)串口通訊DLL的目的就是收發(fā)數據。

  (4)關(guān)閉串口。不需要此串口時(shí),關(guān)閉串口,供其它的應用程序使用。

  3、CALLBACK函數

  在微軟的官方手冊中是這樣定義CALLBACK函數的:“CALLBACK函數是由應用程序定義而由操作系統調用的函數”。在我們編寫(xiě)DLL時(shí),就是由應用程序定義而由此DLL執行的函數,這一機制在被調用者(DLL)和調用者(應用程序)之間進(jìn)行信息傳遞是非常有用的。這一特性,讓初學(xué)者較難理解,但是它卻是編寫(xiě)串行通信程序者的福音,正是由于使用這一特性,才可很方便地在動(dòng)態(tài)鏈接庫中實(shí)現MSComm控件中的OnComm 事件,并且可根據需要進(jìn)行靈活控制。

  三、串行通訊動(dòng)態(tài)鏈接庫的編寫(xiě)

  以上將一些基礎知識進(jìn)行了適當的介紹,下面再著(zhù)重討論怎樣編寫(xiě)一個(gè)動(dòng)態(tài)鏈接庫(DLL)。

  1、從VC++ 6.0的File菜單中選擇New命令,并在列表框中選擇Win32 Dynamic-Link Library項,創(chuàng )建一個(gè)工程。

  2、往工程中添加頭文件

  根據需要,我們在頭文件中定義此DLL提供給外部調用的五個(gè)輸出函數,其定義方法如下:

//com.h
#ifndef _COM_DLL_H
#define _COM_DLL_H
#ifdef MyComDll
#else
#define MyComDll extern "C" __declspec(dllimport)
#endif
MyComDll int FAR PASCAL ComOpen(int port);
MyComDll int FAR PASCAL ComClose();
MyComDll int FAR PASCAL SetCallback(void (CALLBACK* fun)(int port));
MyComDll int FAR PASCAL GetComData(LPBYTE buf);
MyComDll BOOL FAR PASCAL SendDataToCom(LPBYTE Cmd,int CmdLen);
#endif

  DLL的源代碼模塊需要包含該頭文件,若要編寫(xiě)調用該動(dòng)態(tài)鏈接庫函數的C/C++應用程序,也需要包含此頭文件。另外,你會(huì )發(fā)現,MyComDll中包含了extern "C"鏈接指示符,這是因為在用C++編寫(xiě)動(dòng)態(tài)鏈接庫時(shí),通常在經(jīng)C++編譯器編譯后,其函數名稱(chēng)會(huì )改變,如
ComOpen編譯后,展現給調用者的名字是:_ComOpen@8之類(lèi),這樣應用程序在調用時(shí),鏈接程序就會(huì )抱怨找不到指定的函數。加上extern“C”后,就告訴編譯器不要改變變量名或函數名。__declspec(dllimport)是告訴編譯器,應用程序將從這個(gè)DLL 模塊引入這些函數,__declspec(dllexport) 是告訴編譯器這些函數是從產(chǎn)生的DLL模塊輸出給別的應用程序調用。

  3、往工程中添加C/C++源代碼模塊

  在C++源代碼模塊中,首先應包含如下頭文件,及定義相關(guān)變量:

#include <windows.h>
#define MyComDll extern "C" __declspec(dllexport)
#include "com.h"

  然后就定義本動(dòng)態(tài)鏈接庫的五個(gè)輸出函數:

 ?。?)ComOpen(int port)

  此函數用來(lái)打開(kāi)指定的串行通訊口,其參數port即為通訊口號。打開(kāi)端口后,通過(guò)API函數GetCommState得到該端口的配置;根據實(shí)際需要,更改其波特率、數據位、停止位等,以及設置觸發(fā)信號事件的字符(即設置BCB的EvtChar字段);然后通過(guò)調用SetCommState設置端口。

  串口打開(kāi)成功后,創(chuàng )建一個(gè)線(xiàn)程ComThreader,在ComThreader中,循環(huán)監控串行口是否收到有效數據,若收到則觸發(fā)回調函數。

 ?。?)GetComData (LPBYTE buf)

  此函數是將串口接收緩沖區中的數據放到指針變量buf中。

 ?。?)SendDataToCom(LPBYTE Cmd,int CmdLen)

  此函數是將指定長(cháng)度的數據發(fā)送到串行口中。其長(cháng)度由于變量CmdLen指定,發(fā)送的數據即為變量Cmd中的內容。發(fā)送數據時(shí),需要將線(xiàn)程ComThreader暫時(shí)掛起,以避免與接收數據的線(xiàn)程沖突,產(chǎn)生紊亂。

 ?。?)ComClose()

  此函數將打開(kāi)的串行口關(guān)閉,無(wú)參數。通過(guò)事件觸發(fā)以及WaitForSingleObject 、WaitForMultipleObjects函數,中斷線(xiàn)程,關(guān)閉創(chuàng )建的各種事件、文件,釋放相應資源,因為采用了多線(xiàn)程技術(shù),因此需要特別注意主線(xiàn)程和子線(xiàn)程的相互同步。

 ?。?)SetCallBack(int controlport,void (CALLBACK *outfunc)(int controlport))

  此函數的功能是設置回調函數,controlport為指定的端口,outfunc是外部應用程序傳過(guò)來(lái)的函數指針,其主要目的是將應用程序的函數指針傳給DLL中的一個(gè)指針函數,DLL在特定的時(shí)刻(本程序是當串行端口接收到有效數據時(shí))通過(guò)內部的指針函數,調用外部的應用
程序,從而實(shí)現“回調”功能。

//com.cpp
void (CALLBACK* infunc) (int port);
int FAR PASCAL SetCallBack(int controlport, void (CALLBACK*
outfunc)(int controlport))
{
if(outfunc!=NULL)
infunc=outfunc;
return 1;
}

  4、往工程中添加模塊定義文件

  模塊定義文件(module-definition)文件是以.def為擴展名的文本文件,為了能被其他開(kāi)發(fā)工具如Visual Basic、Delphi等使用,創(chuàng )建的DLL文件必須要有模塊定義文件,否則在應用程序調用ComOpen時(shí)會(huì )出現“Can’t find DLL entry point ComOpen in Comdll.dll”的
錯誤提示。Exports節和extern“C”的作用一樣,告訴編譯器不要改變輸出的函數名。

LIBRARY COMDLL
DESCRIPTION ’COM Communication Demo’
EXPORTS
ComOpen @ 1
ComClose @ 2
SendDataToCom @ 3
SetCallBack @ 4
GetComData @ 5

  四、動(dòng)態(tài)鏈接庫函數的VB 調用示范

  1、VB測試程序

  以下程序示范了在VB中如何調用由VC++編寫(xiě)的動(dòng)態(tài)鏈接庫中的函數。因為動(dòng)態(tài)鏈接庫中使用了回調函數,在VB代碼中必須將回調函數放到標準的.BAS模塊中,不可放在窗體模塊中,也不能將其附加到類(lèi)模塊中。CALLBACK函數只是觸發(fā)同一工程中一個(gè)窗體上的定時(shí)器控件,對串口數據進(jìn)行采集,其定義如下:

Sub CallBackFunc(ByVal port As Long) Form1.Timer1.Interval = 1
Form1.Timer1.Enabled = True
End Sub

  在標準的.BAS模塊中,還需定義該DLL函數的調用方式,具體如下:

Option Explicit
Public Declare Function ComOpen Lib "Comdll.dll" (ByVal
port As Long) As Long
Public Declare Function ComClose Lib "Comdll.dll" () As
Long
Public Declare Function SendDataToCom Lib "Comdll.dll"
(ByRef Cmd As Byte, ByVal CmdLen As Long) As Long
Public Declare Function SetCallBack Lib "Comdll.dll" (ByVal
port As Long, ByVal func As Long) As Long
Public Declare Function GetComData Lib "Comdll.dll" (ByRef
buf As Byte) As Long

  在窗體程序中,當打開(kāi)串口時(shí),調用DLL的SetCallBack函數設置回調函數,調用方式如下:

SetCallBack (comport, AddressOf CallBackFunc);

  關(guān)鍵字AddressOf是將CallBackFunc的函數地址傳遞給DLL中的指針函數void (CALLBACK* infunc) (int port)。

  2、調試方法

  串行通訊的調試相對來(lái)說(shuō)是比較麻煩,在實(shí)踐中,可以在同一臺具有兩個(gè)串行通訊口的機器上進(jìn)行調試,只需要將兩個(gè)串口的RXD和TXD交叉連接,并將5腳對等連接,就可以進(jìn)行調試了;當然,也可用一個(gè)串口進(jìn)行調試,只需將同一串口的2、3連接。

  在調試過(guò)程中,需提醒讀者注意的一點(diǎn)是:動(dòng)態(tài)鏈接庫與執行文件應在同一目錄下,否則出現找不到動(dòng)態(tài)鏈接庫的問(wèn)題;由于Windows操作系統本身的原因,在對動(dòng)態(tài)鏈接庫的第一次使用時(shí),須將其拷貝至系統安裝目錄的system32子目錄中才能避免上述問(wèn)題。

  五、結束語(yǔ)

  此DLL是本人在工作中的一點(diǎn)經(jīng)驗積累,去除工程實(shí)踐中的繁瑣枝葉,只涉及串行通訊的關(guān)鍵代碼,目的是展示以DLL實(shí)現串行通信的方法,希望本文能對讀者起到拋磚引玉的作用。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
基于VC的接收機串口程序設計
CMScomm中的函數則么用?CMScomm的介紹太少
用VC 6.0實(shí)現串行通信的三種方法
串口驅動(dòng)概述
單片機與PC機之間的通信
Windows平臺幾種串口編程方法 - hcorecore的日志 - 網(wǎng)易博客
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久