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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

用VC开发串口通信dll控件

發布時間:2025/3/21 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用VC开发串口通信dll控件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
VC串口通信技術網《VC串口上位機編程方法簡介》介紹了串口編程的常見方法,其中就有使用串口dll控件的方法,dll是一種動態鏈接庫,使用起來非常方便。  

  本文利用VC編程工具,對Windows提供的API函數進行封裝,實現了一個串行通信動態鏈接庫dll的完整實例,實例既給出了DLL函數的編寫方法,又包括一份用其它編程工具(VB)對此DLL進行聲明及調用的范例。為了使大家能看得懂,本例作了簡化。希望對需要進行串行通信編程的網友及需要學習編寫DLL的編程愛好者提供一點幫助。

  一、有關dll的常識

  1、什么是dll

  DLL是動態鏈接庫Dynamic Link Library 的簡稱, DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬于其可執行代碼的函數。函數的可執行代碼位于一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數。DLL 還有助于共享數據和資源。多個應用程序可同時訪問內存中單個DLL 副本的內容。DLL 是一個包含可由多個程序同時使用的代碼和數據的庫。Windows API中的所有函數就是包含在DLL中,它有眾多優點,如:簡化軟件項目管理以便分工合作,有助于節省內存,便于資源共享并且可以用多種語言來編寫。

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

  如何沒有dll編寫基礎,請查閱相關文檔,進一步學習dll開發。

  2、串口通信一般步驟

  在Windows系統,用CreateFile函數來打開串口設備,在打開之前,應該對串口相關參數進行配置,系統通過一個叫DCB(Device Control Block)的結構對串行口進行配置,通過Windows API GetCommState函數可以得到串行通訊口的狀態信息,使用SetCommState函數可以對串行通訊口進行設置,配置好后即可打工串口,打開串口后可以通過ReadFile和WriteFile讀寫串口。實現串行通信一般需按以下四步進行:

  (1) 打開串口。由于串口是獨占性資源,因此應用程序打開串口后,別的應用程序就不能再打開此串口了,所以在使用CreateFile打開串口時相關參數要注意,應使用獨點方式。

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

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

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

  3、有關CALLBACK函數

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

  二、串口通信動態鏈接庫dll的編寫

  下面演示了如何用VC縮寫串口通信dll過程。

  1、從VC++ 6.0的File菜單中選擇New命令,并在列表框中選擇Win32 Dynamic-Link Library項,創建一個工程,如下圖所示:

  2、往工程中添加頭文件

  在新建一個com.h文件,里加入對外提供的函數接口,如要有5個,如下所示:

  • //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的源代碼模塊需要包含該頭文件,而且用戶應用程序在使用此串口dll時也要包含com.h。另外,你會發現,MyComDll中包含了extern "C"鏈接指示符,這是因為在用C++編寫動態鏈接庫時,通常在經C++編譯器編譯后,其函數名稱會改變,如ComOpen編譯后,展現給調用者的名字是:_ComOpen@8這種形式,這樣應用程序在調用時,鏈接程序就會提示找不到指定的函數。加上extern“C”后的作用就告訴編譯器不要改變變量名或函數名。__declspec(dllimport)是告訴編譯器,應用程序將從這個DLL 模塊引入這些函數,__declspec(dllexport) 是告訴編譯器這些函數是從產生的DLL模塊輸出給別的應用程序調用。

      3、往工程中添加C/C++源代碼文件

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

  • #include?<windows.h>? ?
  • #define?MyComDll?extern?"C"?__declspec(dllexport)? ?
  • #include?"com.h"?
  •   然后實現本動態鏈接庫的五個輸出函數:

      (1)ComOpen(int port)

      此函數接口功能是用來打開指定的串行通訊端口,參數port即為通訊口號(不用在前面加com了)。打開端口后,通過API函數GetCommState得到該端口的配置;根據需要更改其波特率、數據位、停止位等,以及設置觸發信號事件的字符(即設置BCB的EvtChar字段);然后通過調用SetCommState設置端口。

      串口打開成功后,將創建一個ComThreader線程,在ComThreader中,循環監控串行口是否收到有效數據,若收到則觸發回調函數。

      (2)GetComData (LPBYTE buf)

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

      (3)SendDataToCom(LPBYTE Cmd,int CmdLen)

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

      (4)ComClose()

      此函數用來關閉已打開的串口,無參數。通過事件觸發以及WaitForSingleObject 、WaitForMultipleObjects函數,中斷線程,關閉創建的各種事件、文件,釋放相應資源,因為采用了多線程技術,因此需要特別注意主線程和子線程的相互同步。

      (5)SetCallBack(int controlport,void (CALLBACK *outfunc)(int controlport))

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

  • //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為擴展名的文本文件,為了能被其他開發工具如Visual Basic、Delphi等使用,創建的DLL文件必須要有模塊定義文件,否則在應用程序調用ComOpen時會出現“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?
  •   四、動態鏈接庫函數的VB 調用示范

      1、VB測試程序

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

  • 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?
  •   在窗體程序中,當打開串口時,調用DLL的SetCallBack函數設置回調函數,調用方式如下:

  • SetCallBack?(comport,?AddressOf?CallBackFunc);?
  •   關鍵字AddressOf是將CallBackFunc的函數地址傳遞給DLL中的指針函數void (CALLBACK* infunc) (int port)。

      2、調試方法

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

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

    總結

    以上是生活随笔為你收集整理的用VC开发串口通信dll控件的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 67194午夜| 污污视频在线免费看 | 久久久久久亚洲中文字幕无码 | 欧美男女交配视频 | 欧美激情第1页 | 欧美日韩亚洲国产另类 | av午夜在线 | 极品探花在线 | 久久久精品免费看 | 外国黄色网址 | 打开免费观看视频在线播放 | 在线播放亚洲 | 欧美中文一区 | 免费成人av在线播放 | 涩五月婷婷 | av大全在线播放 | 欧美在线一级视频 | 欧美成人免费在线观看 | 一区二区精品在线观看 | 久久黄色影视 | 麻豆出品 | 午夜影院一区二区三区 | 性xxxx视频 | 国产av一区二区不卡 | 能看的av网站 | 色版视频在线观看 | 国产丰满果冻videossex | 精品国产乱码久久久 | 精品人妻一区二区三区麻豆91 | 亚洲成在人 | 精品在线第一页 | 亚洲精品传媒 | 香蕉视频日本 | 日韩欧美一区二区免费 | v片在线看 | 日韩少妇一区二区三区 | 亚洲乱妇老熟女爽到高潮的片 | 亚洲国产精品成人综合色在线婷婷 | 日本中文字幕在线看 | 日本丰满熟妇bbxbbxhd | 国产精品51麻豆cm传媒 | 精品久久久久久久中文字幕 | 天天操天天干天天舔 | 蜜桃网站 | 97超级碰碰| 男人的天堂一区二区 | 免费看大片a | 欧美黄色性生活 | 全部免费毛片在线播放高潮 | 免费观看已满十八岁 | 成人影片网址 | 免费一级黄色片 | 青青色在线观看 | 一本综合久久 | 老妇高潮潮喷到猛进猛出 | 一二三区免费 | 幸福宝在线观看 | 中文字幕免费在线看线人动作大片 | 久久精彩视频 | 成人免费黄色小视频 | 国产成人免费片在线观看 | 日韩网站免费观看高清 | 成人国产在线视频 | 色综合综合色 | 伦理一级片| 91在线播放国产 | 黄页免费视频 | 99re视频在线 | 我爱我色成人网 | 成人xxx | 天堂网在线最新版www中文网 | 波多野结衣视频免费在线观看 | 中文字幕av一区二区三区人妻少妇 | 人人叉人人 | 国产a级网站 | 久久久一级黄色片 | 亚洲国内精品 | 上原亚衣av一区二区三区 | 色一情一乱一伦一区二区三区 | 男人草女人 | 国产在线一区二区视频 | 亚洲天堂av在线免费观看 | 欧美性做爰免费观看 | 超碰在线97观看 | 中国老熟女重囗味hdxx | 亚洲av无码国产在丝袜线观看 | 日本老小玩hd老少配 | 国产无套精品一区二区 | 麻豆乱码国产一区二区三区 | 96精品视频在线观看 | 乱老熟女一区二区三区 | 亚洲午夜久久久久久久久 | 天天色视频| 久久久久久久穴 | 欧美在线黄 | 亚洲精品电影在线观看 | 国产免费自拍视频 | 五月天国产 | 欧美日韩免费在线 |