日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

當(dāng)前位置:機(jī)電之家首頁(yè) >> PLC技術(shù)>> PLC基礎(chǔ) >> PLC通信 >> 開發(fā)通信軟件的技術(shù)與技巧
開發(fā)通信軟件的技術(shù)與技巧

龔建偉評(píng)論:本文對(duì)MODEM編程結(jié)合MSComm控件作了較為詳細(xì)的說(shuō)明,想了解MODEM編程的讀者可以看看,文章后附實(shí)例程序。


【提要】隨著計(jì)算機(jī)應(yīng)用領(lǐng)域的不斷擴(kuò)展,計(jì)算機(jī)之間的遠(yuǎn)程通信用得也越來(lái)越廣泛,計(jì)算機(jī)間的遠(yuǎn)程通信所使用的通信軟件,在市面上可以買到,但是通用的通信軟件雖然能發(fā)送和接收文件,在許方情況下這些通信軟件并不能滿足實(shí)際工作的需要。本文就這一技術(shù)進(jìn)行了探討,介紹了有關(guān)的知識(shí)和技術(shù),并由實(shí)例分步驟說(shuō)明如何進(jìn)行通信軟件的開發(fā)。 

一、前言 
  本文將以VB5.0所帶的通信控件MSCOMM進(jìn)行通信軟件的開發(fā),它有約30個(gè)屬性和事件(可以從聯(lián)機(jī)幫助中找到其使用資料)。本文簡(jiǎn)述它的主要屬性及事件,并歸類整理。 
利用串行端口與調(diào)制解調(diào)器進(jìn)行連接時(shí),對(duì)于用MSCOMM控件編制通信軟件來(lái)說(shuō),只需了解以下五根線的代號(hào)及作用。以下五根線的高電平/低電平狀態(tài)分別對(duì)應(yīng)MScomm控件的相應(yīng)屬性的True/False值。 
  (1)DTR線:PC發(fā)往MODEM,表示PC機(jī)是否已準(zhǔn)備好。 
  (2)RTS線:PC發(fā)往MODEM,表示PC機(jī)是否允許modem發(fā)回?cái)?shù)據(jù). 
  (3)DSR線:MODEM發(fā)往PC,表示MODEM是否已做好操作準(zhǔn)備 
  (4)CTS線:MODEM發(fā)往PC,表示MODEM是否允許發(fā)送數(shù)據(jù) 
(5)CD線:MODEM發(fā)往PC,表示MOEDM已經(jīng)與呼叫的遠(yuǎn)方MODEM處于連結(jié)狀態(tài) 

二、MSCOMM控件的屬性 
用1,2,...表示串口COM1,COM2.... 
設(shè)置或返回聯(lián)接MODEM的串口的編號(hào) 
Settings 
例用"19200,N,8,1"表示傳輸速率為19200bps,沒(méi)有奇偶校驗(yàn)位,8位數(shù)據(jù)位,1位停止位。 
設(shè)置或返回通信參數(shù)。 
Handshaking 
0沒(méi)有握手協(xié)議,不考慮流量控制。 
1XON/XOFF,即在數(shù)據(jù)流中嵌入控制苻來(lái)進(jìn)行流控。 
2RTS/CTS,既由信號(hào)線RTS/CTS自動(dòng)進(jìn)行流量控制(常用)。 
3兩者皆可。 
設(shè)置或返回硬件握手協(xié)議,指的是PC機(jī)MODEM之間為了控制流速而約定的內(nèi)部協(xié)議。 
PortOpen 
True/False可以打開/關(guān)閉端口。 
打開或關(guān)閉端口。 
OutBufferSize 
傳輸緩沖區(qū)的字節(jié)數(shù),如選1024。 
設(shè)置或返回傳輸緩沖區(qū)大小。 
OutPut 
Variant型變量。 
向傳輸緩沖區(qū)寫數(shù)據(jù)流。 
傳輸文本數(shù)據(jù)時(shí),應(yīng)將bbbbbb型數(shù)據(jù)放入Variant變量,傳輸二進(jìn)制數(shù)據(jù)(即按字節(jié))時(shí),應(yīng)將Byte型數(shù)組數(shù)據(jù)放入Variant變量 
InBufferSize 
接收緩沖區(qū)的字節(jié)數(shù),如選1024。 
設(shè)置或返回接收緩沖區(qū)大小。 
bbbbbMode 
0用bbbbb屬性接收文本型數(shù)據(jù)。 
1用bbbbb屬性接收二進(jìn)制數(shù)據(jù)。 
設(shè)置或返回接收數(shù)據(jù)的數(shù)據(jù)類型。 
InBufferCount 
Integer型 
返回接收緩沖區(qū)中已傳到但還未取走的字符個(gè)數(shù)。 
bbbbb 
當(dāng)bbbbbMode屬性值為0(文本模式)時(shí),變量中含bbbbbb型數(shù)據(jù)。 
當(dāng)bbbbbMode屬性值為1(二進(jìn)制模式)時(shí),變量中含Byte型數(shù)組數(shù)據(jù)。 
將接收緩沖區(qū)中收到的數(shù)據(jù)讀入變量。 
DTREnabled 
RTSEnabled 
DSRHolding 
CTSHolding 
CDHolding 
均取值TRUE/FALSE 
用于讀取或控制pc機(jī)與modem之間的交互狀態(tài)。需運(yùn)用好。例如,應(yīng)在讀取到DSRHolding屬性值為TRUE時(shí)再向MODEM發(fā)出命令。應(yīng)當(dāng)在載波檢測(cè)到以后(CDHolding屬性為TRUE)時(shí)再向MODEM發(fā)送數(shù)據(jù)。 

三、MSCOMM控件的觸發(fā)事件 
  MSCOMM控件只使用一個(gè)事件OnComm,用屬性CommEvent的十七個(gè)值來(lái)區(qū)分不同的觸發(fā)時(shí)機(jī)。主要有以下幾個(gè): 
 ?。?)CommEvent=1時(shí):傳輸緩沖區(qū)中的字符個(gè)數(shù)已少于Sthreshold(可設(shè)置的屬性值)個(gè)。 
  (2)CommEvent=2時(shí):接收緩沖區(qū)中收到hreshold(可設(shè)置的屬性值)個(gè)個(gè)字符,利用此事件可編寫接收數(shù)據(jù)的過(guò)程。 
 ?。?)CommEvent=3時(shí):CTS線發(fā)生變化。 
 ?。?)CommEvent=4時(shí):DSR線發(fā)生變化。 
 ?。?)CommEvent=5時(shí):CD線發(fā)生變化。 
 ?。?)CommEvent=6時(shí):檢測(cè)到振鈴信號(hào)。 
  另外十種情況是通信錯(cuò)誤時(shí)產(chǎn)生,即錯(cuò)誤代碼。 

四、通信軟件程序?qū)崿F(xiàn) 
 ?。?、首先是通信參數(shù)設(shè)置,主要就是可以設(shè)置端口號(hào),波特率,數(shù)據(jù)位,停止位,奇偶校驗(yàn)位及設(shè)置硬件握手協(xié)議,這些設(shè)置較為簡(jiǎn)單。 
2、向MODEM發(fā)出DTR(已準(zhǔn)備好)信號(hào),如下例程: 
If MSComm1.PORTOPEN Then 
MSComm1.DTREnable=True 
Else 
MSComm1.DTREnable=False 
EndIf 
3、打開時(shí)向MODEM發(fā)出一些命令來(lái)設(shè)置參數(shù),其中S0=n(n>=1)自動(dòng)應(yīng)答.n為響鈴次數(shù);E0/E1關(guān)閉/打開命令字符回應(yīng);Q0/Q1modem返回/不返回結(jié)果碼;M0/M1關(guān)閉/打開MODEM揚(yáng)聲器,例程如下: 
If MSComm1.PORTOPEN Then 
Do While not MSComm1.CTSHolding : loop 
Outbbbbbb="ATS0=1E1Q0M0"+Chr(13) 
MSComm1.Output=Outbbbbbb 
End if 
4、進(jìn)行撥號(hào)設(shè)計(jì),需向MODEM發(fā)出ATDT命令,如下語(yǔ)句: 
MSComm1.Output="ATDT"+Trim(“電話號(hào)碼”)+Chr(13) 
5、撥號(hào)以后發(fā)送數(shù)據(jù)文件,程序要循環(huán)等待并隨時(shí)判定是否接通。如果MODEM向PC的回應(yīng)字符串中含有"Connect"或CDHolding屬性值變?yōu)門rue(檢測(cè)出載波),則表示已與遠(yuǎn)方MODEM連機(jī)了,此時(shí)可以傳輸數(shù)據(jù)。 
程序設(shè)計(jì)發(fā)送及接收程序時(shí),需要以下定義: 
S_FILENAME = "NAME" + Chr(5) + Chr(13) + Chr(10) 
S_FILELEN = "LENTH" + Chr(5) + Chr(13) + Chr(10) 
S_FILESEND = "BEGIN" + Chr(5) + Chr(13) + Chr(10) 

Sub OpenFileToSend() '打開一個(gè)欲發(fā)送的文件 
HSend = FreeFile 
Open SENDFN For Binary As hSend 'SENDFN中含有由用戶選定的要傳送的文件名。 
LF&=LOF(hSend) '文件長(zhǎng)度為L(zhǎng)F& 
'開始發(fā)送文件名,文件長(zhǎng)度,文件開始等信息字符串。 
Dim Data as Vrait 
Data = S_FILENAME 
MSComm1.Output=Data '發(fā)出"FILENAME"文件名字串的提示信息 
Data = SENDFN +Chr(13)+Chr(10) 
MSComm1.Output=Data '發(fā)出文件名 
Data = S_FILELEN 
MSComm1.Output=DATA '發(fā)出"FILELEN"提示字串 
Data = Trim(Str(LF&))+Chr(13)+Chr(10) 
MSComm1.Output=Data '發(fā)出文件大小 
Data = S_FILESTAR 
MSComm1.Output=Data '發(fā)出"FILESTART"提示信息,表示下面文件開始。 

Dim Sendarr() as byte '定義字節(jié)型數(shù)組 

[NextPage]
Sum=0 '記錄累計(jì)發(fā)送的字節(jié)數(shù) 
BSIZE=MSComm1.OutBufferSize '每次發(fā)送的塊大小 
ReDim Sendarr(1 To BSIZE) '重新定義讀取緩沖 
Do While Sum<LF& '循環(huán)發(fā)送 
If LF&-Loc(hSend)<BSIZE Then 
BSIZE=LF&-Loc(hSend) 
ReDim Sendarr(1 To BSIZE) 
End If 
Get hSend ,, SENDARR '從文件取字節(jié)放入字節(jié)數(shù)組 
Sendvar=Sendarr '轉(zhuǎn)放到Variant型變量 
'當(dāng)CTS線及CD線為高電平時(shí)才可發(fā)送,否則需等待。 
T=Timer+60 
L: 
If MSComm1.CTSHolding And MSComm1.CDHolding Then 
MSComm1.Output=Sendvar '發(fā)送 
Sum = Sum + BSIZE'累加計(jì)數(shù) 
Else 
If Timer < T Then 
Go To L '循環(huán)等待 
Else 
Go To CLOSEFILE '等待時(shí)間超過(guò)60秒則退出 
End If 
End If 
'等待系統(tǒng)處理完 
Do 
RET = DoEvents() 
Loop Until MSComm1.OutBufferCount = 0 
Loop '循環(huán)發(fā)送完畢。 

6、接收MODEM送回的信息和數(shù)據(jù)文件,該過(guò)程是編寫mscomm1控件的OnCOMM事件的處理程序來(lái)完成。為了接收文本類型的握手信號(hào),通常使bbbbbMode屬性為文本模式。當(dāng)發(fā)現(xiàn)接收到的字符串中有"FILESTAR"+Chr(5)+Chr(13)+Chr(10),則將bbbbbMode屬性改為二進(jìn)制模式。當(dāng)文件內(nèi)容接收完(由接收的字節(jié)數(shù)判斷)再將bbbbbMode屬性改為文本模式。例程如下: 
Private Static Sub MSComm1_OnComm() 
Select Case MSComm1.CommEvent 
Case comEvReceive '接收緩沖區(qū)收到Rthreshold個(gè)字符時(shí)觸發(fā) 
Dim DATA As Variant 
Dim N As Long 
Dim SJARR() As Byte 
N=MSComm1.InBufferCount '接收緩沖區(qū)字符總數(shù) 
If MSComm1.bbbbbMode=0 Then'文本模式時(shí),將收到的數(shù)據(jù)放到字符串變量。 
MSComm1.bbbbbLen=0 
DATA = Space(N) 
DATA = MSComm1.bbbbb 
Else '二進(jìn)制模式時(shí),將收到的數(shù)據(jù)放到字節(jié)數(shù)組。 
ReDim S JARR(1ToN) 
DATA=ARR 
MSComm1.bbbbbLen=N 
DATA=MSComm1.bbbbb 
End If 
'其它c(diǎn)ase情況略 
End Select 
End Sub 

7、關(guān)于接收到的數(shù)據(jù)的處理例程: 
Public Static Sub HandleData (Disp As Control,N As Long,DATA As Variant) 
'參數(shù):Disp(文本框,用于顯示接受數(shù)據(jù)) 
'N為本次接收到的字節(jié)數(shù) 
'DATA(接收到的數(shù)據(jù).Variant型) 
If not mscomm1.bbbbbMode=0 Then '接收的是字符串 
Go To L2 
End If 
Disp.SelStart = Len ( Disp.Text) 
Disp.SelLength = 0 
Disp.SelText = DATA '顯示字符數(shù)據(jù) 
If InStr(1,Disp.Text,S_FILESTAR,0)=0 Then '若沒(méi)有開始標(biāo)志就結(jié)束此過(guò)程 
ExitSub 
EndIf 
V_FILENAME = InStr(1,Disp.Text,S_FILENAME,0) '找文件名及文件長(zhǎng)度 
V_FILELEN = InStr(1,Disp.Text,S_FILELEN,0) 
FN = Mid(Disp.Text,V_FILENAME+11,(V_FILELEN-V_FILENAME-13)) 
HJS = FreeFile'打開接收文件 
JSFN = Pathc+"\SJFILE\S"+Trim(Str(NO))+"_"+FN 

Open JSFN For Binary As HJS 
V_FILENAME = InStr(1,Disp.Text,S_FILENAME,0) 
V_FILELEN = InStr(1,Disp.Text,S_FILELEN,0) 
FN = Mid(Disp.Text,V_FILENAME+11,(V_FILELEN-1)-(V_FILENAME+11)) 
FL = Mid(Disp.Text,V_FILELEN+11,V_FILESTAR-(V_FILELEN+10)) 
SENDLEN = Val(FL) '應(yīng)收總字節(jié)數(shù)SENDLEN 

ReDim JSARR(0 To N-1) 
JSARR=DATA '將字節(jié)流放入字節(jié)型數(shù)組 
Puth JS , , JSARR ' 寫入已打開的接收文件 
JSLEN=JSLEN+N '本次已累計(jì)收到的字節(jié)數(shù) 
Close HJS 
End Sub 

作者:未知 點(diǎn)擊:706次 [打印] [關(guān)閉] [返回頂部]
本文標(biāo)簽:開發(fā)通信軟件的技術(shù)與技巧
* 由于無(wú)法獲得聯(lián)系方式等原因,本網(wǎng)使用的文字及圖片的作品報(bào)酬未能及時(shí)支付,在此深表歉意,請(qǐng)《開發(fā)通信軟件的技術(shù)與技巧》相關(guān)權(quán)利人與機(jī)電之家網(wǎng)取得聯(lián)系。
電子樣本

SN系列樣冊(cè)
:鞏經(jīng)理
:13915946763
:南京塞姆泵業(yè)有限公司
個(gè)人求購(gòu)

于蓬 【求購(gòu)】  HPV-S...  2025-12-29
張俊杰 【求購(gòu)】  縫紉線自動(dòng)...  2025-12-25
易賽群 【求購(gòu)】  NANOC...  2025-12-25
張經(jīng)理 【求購(gòu)】  浪涌保護(hù)器  2025-12-25
陳蓮 【求購(gòu)】  日本住友閥  2025-12-24
簡(jiǎn) 【求購(gòu)】  氣動(dòng)扳手  2025-12-24
倪高純 【求購(gòu)】  超聲波液位...  2025-12-24
戴先生 【求購(gòu)】  美孚s-2...  2025-12-23
VIP公司推薦