在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

一種調用Win95 API完成串行通信的查詢辦法

一種調用Win95 API完成串行通信的查詢辦法

更新時間:2022-05-14 文章作者:未知 信息來源:網絡 閱讀次數:

     摘要 在Win95中,串行通信的機制相對Windows 3.x已作了改進和標準化。本文結合一個實例從調用API接口的角度,具體闡述了一種用簡單的串口查詢法來實現串行通信的思路。

關鍵詞 API、串行通信、Visual Basic、多線程、Win95

Visual Basic是一個Windows系統下流行的應用程序開發平臺。其方便的界面設計使程序員能節省大量時間,并把最大的精力集中在應用程序核心代碼的編寫上。VB4目前已成為Win95系統下一種最高效靈活的主流開發工具之一,而調用API應用程序接口則正是對VB4功能的強有力擴充,它使得VB4能夠直接控制和處理PC硬件資源,而不必依賴于MS-DOS系統服務?梢哉f,正是借助于API使得VB即能隱藏大部分Windows編程的難點,同時又提供了使用Windows環境的靈活性。

因而在串行通信中使用調用API接口的方法是實現在VB中直接控制串行口硬件的簡便可行的解決方案。

一、關于Win95的多線程及32位API的描述

微軟于95年推出的Win95操作系統是對其舊版本Windows性能的一次全面提升。它率先提出并實現了應用程序多線程的編程思想,這是Win95系統區別于其他系統最顯著和最重要的特征之一。進程是應用程序的執行實例,而線程則是進程內部執行的路徑,從根本上說,線程是可由系統調度的一個最簡單的代碼單元,每個線程有自己的一組CPU寄存器和堆棧。Win95為每個獨立的線程安排一些CPU時間,操作系統以輪轉方式向線程提供時間片,這樣每個線程從外觀上看就象都在同時運行一樣。一個多線程的應用程序實際上在其內部實現了多任務擴展,為代碼賦予了并行執行的特性。

多線程應用程序的主要優勢就是可以用盡量少的時間對用戶的要求作出響應。多線程并不代表代碼會運行得更快,準確地說,它僅僅意味著應用程序可以更好地利用系統資源(調度機制、內存和物理設備)。從而能建立一個非常靈活的應用程序,它能隨時接收用戶輸入,并得到滿意的效果。

因此為了在32位的Win95系統中建立更快速、可靠和健壯的代碼,多線程技術是必須掌握的關鍵技術之一。

API(即應用編程接口)是附帶在Win95內部的一個極其重要的組成部分。Win95的32位API主要是一系列很復雜的函數、消息的集合。它可以看作是Win95系統為在其下運行的各種開發系統提供的開放式通用功能增強接口。它使編程人員可以更容易地用不同類型的語言編制出運行在Win95系統上的應用程序。

與Windows 3.x的16位API相比,附帶在Win95中的Win32 API是API質量最顯著的一次提升。它正逐漸成為應用廣泛的一種目標平臺。Win32 API包括了1000多個API調用,加上API附帶的幾百種Windows常量、消息和數據類型結構,使用戶擁有了一系列用于Win95編程的復雜的而又有效的工具。

API接口是對VB功能的最重要的擴充。幾乎所有用VB的標準功能不能處理的問題都可以用調用API接口函數的方法來解決。API接口調用不僅給VB提供了大量可擴充的功能強勁的函數。更為重要的是,它提供了一種最切實地擴充VB功能的思路和方法。尤其在一些直接和硬件交互的低級操作中,調用API接口函數往往是唯一的可行辦法。

總之,調用API接口并結合多線程的編程技術已成了Win95環境下最流行的一種高級技術。大多數應用程序的代碼都不得不涉及到這個高級專題。

二、Win95串行通信的工作機理

常用的DOS系統主要是工作在響應中斷方式。PC機串行通信程序大多利用其BIOS塊的INT14H中斷,以查詢串口的方式完成異步串行通信。

與DOS響應中斷的工作方式不同,Windows是一個事件驅動的,并與設備無關的多用戶操作系統。同時Windows禁止應用程序直接和硬件交互,程序員只能通過Windows提供的各類驅動程序來管理硬件。在這種情況下,Windows系統充當了應用程序與硬件之間的中介。

Windows系統函數即包含了通信支持中斷功能。Win95系統為每個通信設備開辟了用戶定義的輸入輸出緩沖區(即讀/寫緩沖區),數據進出通信口均由系統后臺來完成。應用程序只需完成對輸入輸出緩沖區操作就可以了。實際過程是每接收一個字符就產生一個低級硬件中斷,Win95系統中的串行驅動程序就取得了控制權,并將接收到的字符放入輸入數據緩沖區。然后將控制權返還正在運行的應用程序。如果輸入緩沖區數據已滿,串行驅動程序用當前定義的流控制機制通知發送方停止發送數據。隊列中的數據按“先進先出”的次序處理。

Windows 3.x提供了COMM.DRV驅動程序以支持串行通信,而Win95已對這些串行通信的標準函數作了改進和標準化,并把對串口的支持與基本輸入輸出驅動程序集成為一體。Win95像對文件操作一樣來實現對串口的操作,兩者使用相同的打開、關閉及讀寫函數。

16位的API只提供了16個與通信相關的函數。與這些16位的通信函數相比,Win95提供的通信函數更為豐富,功能更為強大。

在Win95系統中,串行口和串行通信驅動程序是通過一個數據結構進行配置的,這個數據結構被稱為設備控制塊( Device Control Block ),簡稱DCB。Win95的DCB比Windows 3.x的DCB更復雜,對數據結構的定義更完善。

下面是Win95中設備控制塊數據結構的定義:

Type DCB ’在Win95 API中有詳細定義,可從VB4的API Text Viewer中得到
DCBlength As Long
BaudRate As Long
fBinary As Long
fParity As Long
……
EvtChar As Byte
End Type
Win95為獲取通訊端口的狀態提供了重要的GetCommState函數。函數把端口的配置信息裝入一個設備控制塊DCB,從而獲得端口的配置情況。

另一個重要的COMSTAT結構則通常被用來描述串口當前的狀態。其定義如下:

Type COMSTAT ’在Win95 API中有詳細定義,可從VB4的API Text Viewer中得到
fCtsHold As Long
fDsrHold As Long
……
cbInQue As Long
cbOutQue As Long
End Type
通?砂匆韵滤牟綄崿F串行通信:

(1) 按協議的設置初始化并打開串行口,這樣做就是通知Windows本應用程序需要這個串口,
并封鎖其他應用程序使它們不能使用此串口。
(2) 配置這個串行口。
(3) 在串口上往返地傳輸數據,并在傳輸過程中進行校驗。
(4) 不需要此串口時,關閉串口。即釋放串口以供其它應用程序使用。
在這四個步驟中,主要的程序代碼集中在第(3)步。

三、VB串口查詢法的實現方法

(1)串口查詢法的機理

VB的串口查詢法是一種主要工作在查詢方式下的實現方法。當通信程序工作在“查詢”方式時,可以不考慮Win95的進程和線程的問題。僅在串口有數據時,去讀串口緩沖區就可以了。這種方法下確定串口讀取的時機、握手協議及軟件糾錯的實現是程序員應考慮的主要問題。

由于這種方法主要工作在查詢方式。程序員必須完成相當一部分通信狀態的檢測工作,許多細節(甚至包括通信過程中的字符屬性的轉換)也必須通過程序代碼完成。因而相比較通信控件方法而言,這種查詢方法對通信雙方協議的依賴性尤其大。雙方通信協議的約定對程序實現的難易程度影響很大。

值得注意的一點是,此方法下協議的約定必須滿足以下條件:即甲方發送時,乙方必須在甲方發送動作之前進入循環接收狀態,直到接收到字符后通過對串口讀取函數ReadFile返回值的判斷跳出循環狀態。

同時,一般為了不使系統因循環等待接收而進入“死循環”狀態,可以人為設置讀取串口的循環次數,一般1000~10000次即可。

VB4是一種極為靈活的高級語言,因而在這種方法下可以方便地引入匯編語言的思維,利用其GoTo轉向語句方便地控制程序的流程。非常靈活方便。

(2)與通信線程法的比較

通信線程法通過在應用程序的主線程外再創建一個通信線程來監視通信設備,其最大優點是程序對接收數據具有自主覺察能力。一旦通信線程查詢到數據已發送到串口上,線程自動向應用程序發送一個數據接收到的消息,應用程序可用該消息來讀取通信設備傳來的數據。并且使用通信線程還不占用CPU時間。這樣系統實際上具有了同時控制多個通信設備(如MODEM)的能力。

通信線程法在C++的開發系統中用得較多,這與C++的特點和優勢密切相關。

由于VB自身的特點,創建通信線程的方法對VB而言,實現上有相當的難度。而且這樣做,也無異于犧牲VB的簡單方便性而去遷就程序的復雜性,很不經濟。串口查詢法容易地引入了匯編語言的一些思維,實現了最精簡的程序代碼。它不一定是最完善,但對一般VB程序員來說,這種方法確實達到了簡化思路和降低難度的目的。因而實現簡單。

四、串口查詢法的程序實例

現約定甲方是PC機,乙方是單片機系統(如電卡電度表系統的讀卡器)。通信格式設置為2400波特率,8位數據位,1位停止位,無奇偶校驗。

以下是甲方(PC機)的幾個子函數的程序實例。
Private Function OpenThePort(cPort as String,cBaud as String,cParity as String,cData as String,tStops as String)As Boolean
Dim lResult as Long
Dim lHandle as Long
Dim DCB_COMM as DCB
Dim cDCBConfig as String
lHandle = CreateFile(cPort,GENERIC_READ Or GENERIC_WRITE,0&,0&,OPEN_EXISTING,0&,0&)
If lHandle = -1 Then ’打開串口失敗
OpenThePort = False
MsgBox “串口可能正被其他應用程序占用!”
lResult = CloseHandle(lHandle) ’先關閉串口后再打開
If lResult = 0 Then
OpenThePort
Exit Function
End If
End If
cDCBConfig.band = 2400 ’設置DCB
cDCBConfig.parity = None
cDCBConfig.data = 8
cDCBConfig.stop = 1
lResult = BuildCommDCB(cDCBConfig,DCB_COMM) ’按用戶設定配置一個DCB結構
If lResult = 0 Then
OpenThePort = False
MsgBox “無法建立DCB設備控制塊”
Exit Function
End If
lResult = SetCommState(lHandle,DCB_Comm) ’實際設置一個串口的DCB
If lResult = 0 Then
OpenThePort = False
MsgBox “無法建立DCB設備控制塊”
Exit Function
End If
OpenThePort = True
End Function

Private Sub SendHand ( ) ’發送握手信號的子過程
Dim Nchars As Long
Static Readbuff As String * 1
Static Writebuff As String * 1
Dim lpDCB As DCB
Dim lRet As Long
Dim lHandle As Long
Dim lpOverlapped As OVERLAPPED
Dim RNum As Integer

MsgBox “請把電卡讀卡器插在串口2上!”,48,“提示窗口”
lHandle = OpenThePort(COMM1,2400,None,8,1)
lRet = PurgeComm( lHandle,1 ) ’清輸出緩沖區
lRet = PurgeComm( lHandle,0 ) ’清輸入緩沖區
lRet = GetCommState ( lHandle,lpDCB ) ’獲得通訊口的狀態
Shand:
Writebuff$ = Chr$(&H8F)
lRet = WriteFile ( lHandle,Writebuff$,1,Nchars,lpOverlapped ) ’送握手信號入串口緩沖區
If lRet <= 0 Then
MsgBox “發送操作出錯,電卡握手信號未發送成功”, 16
GoTo Shand ’不成功則重發
Else
GoTo Qtest
End If
GoTo Shand
Qtest:
Readbuff$ =“ ” ’清除緩沖區為空
Do While lHandle ’循環查詢串口
RNum = 0 ’設置讀串口次數的指針為0
ReadAgain:
lRet = ReadFile( lHandle,Readbuff$,1,Nchars,lpOverlapped )
If lRet < 0 Then
MsgBox “讀取應答信號時出錯”, 16
End If
If lRet = 0 Then
If RNum > 1000 Then ’只讀1000次串口,以免陷入死循環
MsgBox "電卡沒有插接好或電卡沒有接在串口上!"
GoTo CloseP
End If
RNum = RNum + 1
GoTo ReadAgain
End If
If Hex$(Asc(Readbuff)) <> Hex$(&HFF) Then
GoTo Shand ’回送碼不正確則返回繼續發送握手信號
Else
Label1.Caption = “握手信號是:”+Hex$(Asc(Readbuff$))
Msgbox “握手信號正確,已正確聯機”
GoTo CloseP
End If
Loop
CloseP: lRet = CloseHandle( lHandle )
If lRet = 0 Then
MsgBox “串行通訊口關閉成功”,48,“提示窗口”
End If
End Sub

這里,要注意的是:當PC機與單片機系統通信時,單片機數據存儲區( RAM )內的數據是十六進制,在信號線上傳輸的是十六進制數的ASCII碼的二進制形式;而Windows系統下使用的是ANSI碼,ANSI碼僅在前126個與ASCII碼相同。即在Win95下接收到的是十六進制數的ASCII碼的字符串,可先轉換為ANSI碼后再在Win95下還原為十六進制數。

具體如下:Code$ = Hex$( Asc ( Readbuff$ ) )

另外,由于32位API函數參數的數據類型的變化,所有整形參數都被換為長整型(Long)以支持32位的處理,這一點在設置返回值尤其如此。

同時,這些API函數、類型及常量在調用之前,必須先聲明再使用。

五、結束語

由上可見,調用API接口的VB串口查詢法具有實現簡便、難度低、代碼精簡的突出優點。很適合一般VB程序員在編寫通信程序時使用。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • www.99riav| 日本www在线视频| 人妻夜夜添夜夜无码av| 北条麻妃在线视频| 免费看日b视频| 九九视频精品在线观看| 91国在线高清视频| 久热精品在线观看视频| 日韩人妻精品无码一区二区三区| 热这里只有精品| 91亚洲免费视频| 97xxxxx| 黑人巨茎大战欧美白妇| 性猛交ⅹ×××乱大交| 欧美v在线观看| 久久av高潮av| 最新av网址在线观看| 国产福利精品一区二区三区| 国产天堂在线播放| 虎白女粉嫩尤物福利视频| 欧美这里只有精品| 午夜大片在线观看| 男女污污视频网站| 肉色超薄丝袜脚交| 一区二区三区欧美精品| 校园春色 亚洲色图| 日本成人在线免费视频| 欧美精品第三页| 人妻内射一区二区在线视频| 亚洲熟妇av日韩熟妇在线| www污在线观看| 精品无码国产一区二区三区av| 男人添女人荫蒂免费视频| 欧美中文字幕在线观看视频 | 熟妇人妻无乱码中文字幕真矢织江| 国产黄色一级网站| 欧美色图另类小说| 激情网站五月天| 久久久国产欧美| 色播五月激情五月| 久久精品视频在线观看免费| 天天操天天干天天玩| 日本黄网站色大片免费观看| av片在线免费| 欧美aⅴ在线观看| 欧美日韩大尺度| 久久久一二三四| 久久av综合网| 91蝌蚪视频在线观看| 天堂在线一区二区三区| 久久免费视频2| 黄网站欧美内射| 欧美成年人视频在线观看| 三级在线免费观看| 国产黄色一级网站| 午夜激情av在线| 青青草综合视频| 可以免费在线看黄的网站| 奇米777在线| 免费无码av片在线观看| 欧美午夜aaaaaa免费视频| eeuss中文| 国产精品99久久免费黑人人妻| 在线观看日本www| 久在线观看视频| 天天成人综合网| 国产精品无码专区av在线播放| 精品久久免费观看| 韩国日本在线视频| 国产精品久久成人免费观看| 91视频 -- 69xx| 中文字幕第50页| 日本成人中文字幕在线| www.国产在线播放| 中文字幕 欧美日韩| 黄色动漫在线免费看| 欧美爱爱视频网站| 日韩手机在线观看视频| 99中文字幕在线观看| 亚洲人辣妹窥探嘘嘘| 欧美交换配乱吟粗大25p| 亚洲 欧美 日韩系列| 人妻久久久一区二区三区| 日日夜夜精品视频免费观看| 日韩 欧美 高清| 免费高清一区二区三区| 艳母动漫在线观看| 成人不卡免费视频| 中文字幕第36页| 一本久道中文无码字幕av| 黄色一级片在线看| 国产香蕉一区二区三区| 成人不卡免费视频| 网站一区二区三区| 成年人在线看片| 北条麻妃69av| 国产91在线视频观看| 欧美午夜小视频| 男人日女人视频网站| 四虎4hu永久免费入口| 亚洲高清在线不卡| 日日噜噜噜夜夜爽爽| 国产九九九视频| 300部国产真实乱| 久久99久久久久久| 国产v片免费观看| 国产免费黄视频| www黄色av| 欧美日韩亚洲一二三| 国产一级片黄色| 午夜精品免费看| 2021狠狠干| 青青青在线视频播放| 99999精品视频| aaaaaa亚洲| 日本人69视频| 午夜久久久久久久久久久| 成人免费看片视频在线观看| 黄色a级在线观看| 精品丰满人妻无套内射| 美女福利视频在线| 成人午夜激情av| 手机在线免费毛片| 婷婷五月综合缴情在线视频| 大肉大捧一进一出好爽动态图| 天天干天天综合| 国产精品一区在线免费观看| 欧美深夜福利视频| 中文久久久久久| 成人在线观看www| 两根大肉大捧一进一出好爽视频| 一路向西2在线观看| 天堂а√在线中文在线| 日韩av在线综合| 美女黄色片网站| 凹凸日日摸日日碰夜夜爽1| 日本在线观看视频一区| 成人av在线播放观看| 大香煮伊手机一区| 男女激烈动态图| 日日噜噜噜噜久久久精品毛片| 伊人久久在线观看| 国产精品少妇在线视频| 欧美性受xxxx黑人猛交88| 激情综合在线观看| 天天爱天天做天天操| 麻豆传传媒久久久爱| 成人国产在线看| 亚洲欧美国产中文| 国产免费一区二区三区视频| 永久免费网站视频在线观看| 性猛交ⅹ×××乱大交| 国产乱子伦农村叉叉叉| 国产免费内射又粗又爽密桃视频| 欧美第一页浮力影院| 日韩精品一区二区三区久久| 干日本少妇视频| 国产xxxxhd| 久久婷婷中文字幕| 亚洲一级片免费| 男人插女人下面免费视频| 国产91对白刺激露脸在线观看| 成人免费性视频| 国产手机免费视频| 国产av人人夜夜澡人人爽麻豆| 水蜜桃在线免费观看| 99精品一级欧美片免费播放| 三日本三级少妇三级99| 激情在线观看视频| 亚洲美女性囗交| 国产福利精品一区二区三区| www.午夜av| 欧美日韩一区二区三区电影| 黑人巨大国产9丨视频| 天天干天天操天天干天天操| 亚洲午夜激情影院| 在线a免费观看| 成人免费黄色av| 干日本少妇视频| 日本黄大片在线观看| 日本阿v视频在线观看| 久久av综合网| 成人免费在线小视频| 成人小视频在线看| 天堂在线资源视频| 中文字幕一区二区在线观看视频 | 欧美精品一区二区三区免费播放| 欧美 国产 日本| 亚洲五月天综合| 久久久一二三四| 日韩日韩日韩日韩日韩| 漂亮人妻被中出中文字幕| 国产又粗又长又大的视频| 午夜视频在线网站| 日本女人高潮视频| 99在线精品免费视频| 污污视频网站免费观看| 免费不卡av网站| 成品人视频ww入口| 青青青在线视频免费观看|