




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、需要和客戶的產(chǎn)品通訊,但波特率是非常規(guī)的,MScomm無法實(shí)現(xiàn),原有的軟件框架和條件又不能轉(zhuǎn)用VC開發(fā)底層,于是用VB6調(diào)用API實(shí)現(xiàn)了這個(gè)通訊功能,雖然在VB6下這個(gè)程序還是單進(jìn)程的,但實(shí)現(xiàn)了異步非阻塞的通信,性能相當(dāng)穩(wěn)定,下面是測試程序代碼 Private Sub cmdSend_Click()Sub cmdSend_Click() '定義文件讀寫屬性結(jié)構(gòu) Dim sa As SECURITY_ATTRIBUTES '定義串口狀態(tài)結(jié)構(gòu)
2、; Dim typCommStat As COMSTAT '定義串口狀態(tài)錯(cuò)誤 Dim lngError As Long '*打開串口* Dim hCF As Long hCF = CreateFile("COM4", _
3、60; GENERIC_READ Or GENERIC_WRITE, 0, sa, _ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, 0)
4、 Debug.Print "打開串口:" & hCF '*獲取出錯(cuò)信息* Dim errNum As Long errNum = GetLastError() Debug.Print "出錯(cuò)信息:" & errNum '定義標(biāo)志值
5、60; Dim flag As Long '定義設(shè)備控制塊 Dim typDCB As DCB '*獲取設(shè)備控制塊* flag = GetCommState(hCF, typDCB) Debug.Print "
6、獲取串口DCB:" & flag typDCB.BaudRate = 2500 '定義波特率 typDCB.Parity = NOPARITY '無校驗(yàn)位 typDCB.ByteSize = 8 '數(shù)據(jù)位 typDCB.
7、StopBits = 0 '停止位 0/1/2 = 1/1.5/2 '*設(shè)置串口參數(shù)* flag = SetCommState(hCF, typDCB) Debug.Print "設(shè)置串口參數(shù):" & flag
8、60; '*設(shè)置緩沖區(qū)大小* flag = SetupComm(hCF, 1024, 1024) 'Debug.Print "設(shè)置緩沖區(qū):" & flag '*清空讀寫緩沖區(qū)* flag = PurgeComm(hCF, PURGE_RXABORT Or PURGE_RXCLEAR Or PURGE_TXABORT Or PURGE_TXCLEAR) &
9、#160; 'Debug.Print "強(qiáng)制清空緩沖區(qū):" & flag '定義超時(shí)結(jié)構(gòu)體 Dim typCommTimeouts As COMMTIMEOUTS typCommTimeouts.ReadIntervalTimeout = 0 '相鄰兩字節(jié)讀取最大時(shí)間間隔(為0表示不使用該超時(shí)間隔) ty
10、pCommTimeouts.ReadTotalTimeoutMultiplier = 0 '一個(gè)讀操作的時(shí)間常數(shù) typCommTimeouts.ReadTotalTimeoutConstant = 0 '讀超時(shí)常數(shù) typCommTimeouts.WriteTotalTimeoutMultiplier = 0
11、9;一個(gè)寫操作的時(shí)間常數(shù)(為0表示不使用該超時(shí)間隔) typCommTimeouts.WriteTotalTimeoutConstant = 0 '寫超時(shí)常數(shù)(為0表示不使用該超時(shí)間隔) '*超時(shí)設(shè)置* flag = SetCommTimeouts(hCF, typCommTimeouts) &
12、#160; 'Debug.Print "超時(shí)設(shè)置:" & flag '*發(fā)送數(shù)據(jù)* '定義要發(fā)送字節(jié)數(shù) Dim lngNumberofBytesToWrite As Long '定義實(shí)際發(fā)送字節(jié)數(shù) Dim lngNumberofBytesToWritten As Long&
13、#160; '定義重疊結(jié)構(gòu)體 Dim typOverLapped As OVERLAPPED '定義發(fā)送數(shù)據(jù) Dim arrbytTest(0 To 23) As Byte '載波收發(fā)器同步頭 arrbytTest(0) = CByte(&H53) arrbytTest(1) = CByt
14、e(&H4E) arrbytTest(2) = CByte(&H44) '后續(xù)數(shù)據(jù)包長度 arrbytTest(3) = CByte(&H14) '載波表預(yù)同步頭 arrbytTest(4) = CByte(&HFF) arrbytTest(5) = CByte(&HFF) arrbytTe
15、st(6) = CByte(&HFF) arrbytTest(7) = CByte(&HFF) arrbytTest(8) = CByte(&HFF) arrbytTest(9) = CByte(&HFF) '載波表幀同步頭 arrbytTest(10) = CByte(&H9) arrbytTest(11) = CByte(&
16、;HAF) '載波表地址 arrbytTest(12) = CByte(&H59) arrbytTest(13) = CByte(&H20) arrbytTest(14) = CByte(&H0) '控制碼 arrbytTest(15) = CByte(&H1) '數(shù)據(jù)長度
17、60; arrbytTest(16) = CByte(&H5) '功能碼 arrbytTest(17) = CByte(&H10) arrbytTest(18) = CByte(&H90) '集中器地址 arrbytTest(19) = CByte(&HBB) arrbytTest(20) = CByte(&HBB
18、) arrbytTest(21) = CByte(&HBB) '校驗(yàn)和 arrbytTest(22) = CByte(&H50) arrbytTest(23) = CByte(&H3)'獲取要發(fā)送字節(jié)數(shù) lngNumberofBytesToWrite = UBound(arrbytTest) + 1
19、39;聲明等待開始時(shí)間、結(jié)束時(shí)間值 Dim writeStarTime, writeEndTime As Long writeStarTime = GetTickCount() Debug.Print "發(fā)送開始時(shí)間:" & writeStarTime '定義發(fā)送循環(huán)步長值 Dim i As Integer
20、 '定義累計(jì)發(fā)送字節(jié)數(shù) Dim intTotalNumberOfBytesToWritten As Integer '定義發(fā)送間隔時(shí)間(毫秒) Dim intIntervalTime As Integer intIntervalTime = 0 '發(fā)送數(shù)據(jù) For i = 0 To U
21、Bound(arrbytTest) flag = WriteFile(hCF, arrbytTest(i), 1, lngNumberofBytesToWritten, typOverLapped) '獲取出錯(cuò)碼 errNum = GetLastErro
22、r() 'Debug.Print "發(fā)送操作出錯(cuò)碼:" & errNum'若返回值不是IO異步操作未決,則關(guān)閉串口 If (errNum <> ERROR_IO_PENDING) And (errNum <> 0) Then GoTo closeComm'異步IO事件獲?。ǚ祷刂禐?0 表示出錯(cuò))
23、; flag = WaitForSingleObject(typOverLapped.hEvent, 0) 'Debug.Print "異步IO事件獲取:" & flag'判斷異步IO事件獲取是否成功 If flag <> 0 Then
24、0; '異步IO操作結(jié)果獲取(等待標(biāo)記值,必須為true ,否則需要事件激活返回結(jié)果) flag = GetOverlappedResult(hCF, typOverLapped, lngNumberofBytesToWritten, 1) 'Debug.Print "異步IO操作獲?。?quot
25、; & flag'判斷異步IO操作結(jié)果獲取是否成功 If flag <> 0 Then intTotalNumberOfBytesToWritten = intTotalNumberOfBytesToWritten + _ &
26、#160; lngNumberofB
27、ytesToWritten End IfEnd If '間隔時(shí)間(用于需要設(shè)定每字節(jié)間間隔時(shí)間的發(fā)送協(xié)議) Sleep (intIntervalTime) Next
28、60; writeEndTime = GetTickCount() Debug.Print "發(fā)送結(jié)束時(shí)間:" & writeEndTime Debug.Print "發(fā)送總時(shí)間:" & (writeEndTime - writeStarTime) Debug.Print "串口發(fā)送操作:" & flag D
29、ebug.Print "實(shí)際發(fā)送字節(jié)數(shù):" & intTotalNumberOfBytesToWritten '*清空緩沖區(qū)等待數(shù)據(jù)接收* flag = FlushFileBuffers(hCF) 'Debug.Print "清空緩沖區(qū):" & flag
30、39;*設(shè)置串口事件* '監(jiān)聽數(shù)據(jù)接收事件' flag = SetCommMask(hCF, EV_ERR Or EV_RXCHAR)' Debug.Print "監(jiān)聽事件設(shè)置:" & flag flag = SetCommMask(hCF, 0) Debug.Print "監(jiān)聽事件設(shè)置:" & flag
31、; '*等待串口接收事件* '聲明等待開始時(shí)間、結(jié)束時(shí)間值 Dim sngStarTime, sngEndTime As Long '事件掩碼 Dim lngEventMask As Long '定義接收字節(jié)數(shù)變量 Dim tempReceive As Long &
32、#160; tempReceive = 0 Debug.Print "監(jiān)聽開始" '生成開始時(shí)間 sngStarTime = GetTickCount() Debug.Print "開始監(jiān)聽時(shí)間:" & sngStarTime
33、'定義等待步驟參數(shù) Dim n As Integer n = 1 ' '監(jiān)聽串口事件' flag = WaitCommEvent(hCF, lngEventMask, typOverLapped)' Debug.Print "監(jiān)聽操作:" & flag' '獲取出
34、錯(cuò)碼' errNum = GetLastError()' Debug.Print "監(jiān)聽操作出錯(cuò)碼:" & errNum'' '若返回值不是IO異步操作未決,則關(guān)閉串口' If (errNum <> ERROR_IO_PENDING) And (errNum <> 0) Then GoTo closeComm'定義讀取間隔時(shí)間(毫秒)
35、 Dim intReadIntervalTime As Integer intReadIntervalTime = 1 Do ' '異步IO事件獲?。ǚ祷刂禐?0 表示出錯(cuò))' flag =
36、 WaitForSingleObject(typOverLapped.hEvent, 0)' Debug.Print "異步IO事件獲取:" & flag' '獲取出錯(cuò)碼' errNum = GetLastError()'
37、; Debug.Print "IO事件獲取出錯(cuò)碼:" & errNum '清除錯(cuò)誤標(biāo)志函數(shù),獲取串口設(shè)備狀態(tài) flag
38、 = ClearCommError(hCF, lngError, typCommStat) Debug.Print "獲取串口設(shè)備狀態(tài):" & flag'若獲取狀態(tài)成功 If (flag <> 0) And (typCommStat.cbInQue > 0) ThenDebug.Print "已接收字節(jié)數(shù):" & typCommStat.cbInQ
39、ue'判斷接收緩沖區(qū)內(nèi)的數(shù)據(jù)是否等于需要接收的字節(jié)數(shù) If typCommStat.cbInQue >= 22 Then '跳出循環(huán) &
40、#160; Debug.Print "跳出循環(huán)" Exit Do End IfEnd If'生成結(jié)束時(shí)間 sngEndTime = GetT
41、ickCount() Debug.Print "第" & n & "次監(jiān)聽事件時(shí)間:" & sngEndTime n = n + 1
42、60; '讀時(shí)間間隔 Sleep (intReadIntervalTime) Loop Until (sngEndTime - sngStarTime) > 1000 '生成結(jié)束時(shí)間 sngEndTime = GetTickCount() Debug.Print "結(jié)束監(jiān)聽時(shí)間:"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二年級下冊1-8單元語文園地知識歸納
- 2025年教育信息化0時(shí)代教學(xué)工具在智慧教育平臺中的創(chuàng)新發(fā)展報(bào)告
- 政務(wù)信息培訓(xùn)
- 公司培訓(xùn)模式分析
- 中班禮儀:參加他人活動規(guī)范
- 肢體離斷傷的護(hù)理
- 2025年教育培訓(xùn)行業(yè)前景分析
- 中班健康《可愛的小腳丫》
- 皮膚口腔肛周護(hù)理
- 冶煉三級安全教育培訓(xùn)
- 切口感染護(hù)理查房
- 高二語文選擇性必修下冊理解性默寫及其答案
- 備考2024四川省安全員之C2證(土建安全員)通關(guān)提分題庫(考點(diǎn)梳理)
- 品管圈QCC成果匯報(bào)提高患者健康教育知曉率
- 高標(biāo)準(zhǔn)農(nóng)田建設(shè)項(xiàng)目工程建設(shè)進(jìn)度計(jì)劃與措施
- 西方經(jīng)濟(jì)學(xué)-馬工程重點(diǎn)教材-第16章
- 人工智能安全ppt
- 綜述論文(腸內(nèi)營養(yǎng)的臨床應(yīng)用及護(hù)理進(jìn)展)
- 北京市工傷保險(xiǎn)醫(yī)療費(fèi)用手工報(bào)銷申報(bào)表
- 2022-2023學(xué)年四川省成都市高新區(qū)八年級(下)期末語文試卷(含解析)
- 2023年職業(yè)技能-配網(wǎng)不停電帶電作業(yè)考試參考題庫(高頻真題版)附答案
評論
0/150
提交評論