串口通信籍17部-visual自動化系統(tǒng)監(jiān)控_第1頁
串口通信籍17部-visual自動化系統(tǒng)監(jiān)控_第2頁
串口通信籍17部-visual自動化系統(tǒng)監(jiān)控_第3頁
串口通信籍17部-visual自動化系統(tǒng)監(jiān)控_第4頁
串口通信籍17部-visual自動化系統(tǒng)監(jiān)控_第5頁
免費預(yù)覽已結(jié)束,剩余571頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

2章VisualBasic.NET及WindowsDOS操作環(huán)境看起來非常不一樣,概念對象界 數(shù)據(jù)DimPatternAsShort=192'DimPatternAsShort=192'0000000011000000DimResult1Result2Result3Result4,Result5AsShortResult1Pattern0'Result=192(0000000011000000)Result2Pattern4'Result=3072(0000110000000000)4Result3Pattern2'Result=48(0000000000110000)2Result4Pattern17'Result=384(0000000110000000)1基礎(chǔ)的信息DimRetAs Ret=MessageBox.Show("信息框例子Ret=MessageBox.Show("信息框例子","抬頭-系統(tǒng)信息",IfRet=DialogResult.YesThen 框是InputBox,在 PublicPublicFunctionInputBox(_ByValPromptAsString,OptionalByValTitleAsString="",OptionalByValDefaultResponseAsString="",_OptionalByValXPosAsInteger=-1,_OptionalByValYPosAsInteger=-1)As 位置,方便使用直接按Enter輸入。XPos、YPos:此輸 框出現(xiàn)在畫面上位置里的Optional關(guān)鍵字表示這些參數(shù)可輸入也可不輸入,如果不輸入的話,系統(tǒng)就 中的默認值填入(例如Title默認為空字符串)。以下是應(yīng)用實例。DimDimRetStrAsRetStrInputBox("請輸入控制步驟步驟項目字符串類型及VisualBasic.NETString關(guān)鍵字表示,程序中如果欲使用字符串,則必須使用""將其括住,例如DimDimS1AsS1="ThisisaDimDimS1AsS1=TextBox1.Text取得字符串TextBox2.Text=S1指定給另一個文字框TextBox1.TextS1.Empty'將字符串清空CharsTextBox1S1DimDimS1AsDimS1,S2AsS1TextBox1.TextDimS1,S2AsS1TextBox1.Text取得字符串S2TextBox2.Text取得字符串MsgBox("兩組字符串比較結(jié)果:"&pare(S1,DimS1,S2AsS1TextBox1.Text取得字符串S2TextBox2.Text取得字符串MsgBox("兩組字符串比較結(jié)果:"&S1=TextBox1.TextS1=TextBox1.Text取得字符串,例如"TomCat"TextBox3.TextS1.Chars(2)'取得字符串中的字符,將取得"m"示出此字符串的長度(字符數(shù))。圖2.3.7是可能結(jié)果之一。DimDimS1AsS1TextBox1.Text符串以S2記錄,并以Compare方法比較兩個字符串是否相等;若相當(dāng)返回0,若不相當(dāng)返回1或-1。圖2.3.8是可能結(jié)果之一。圖2.3.7Length范例結(jié) 圖2.3.8Compare執(zhí)行結(jié)若不相當(dāng)返回1或-1。圖2.3.9是可能結(jié)果之一。S2Concat2.3.10是其可能的執(zhí)DimDimS1,S2AsS1TextBox1.Text取得字符串S2TextBox2.Text取得字符串MsgBox("兩組字符串的組合結(jié)果:"&S1.Concat(S1,S2),MsgBoxStyle.InformationOrMsgBoxStyle.OKOnlyConcateEx") 圖2.3.9ComapreTo執(zhí)行結(jié) 圖2.3.10Conat執(zhí)行結(jié)此字符串。圖2.3.11是其執(zhí)行結(jié)果。DimDimS1AsS1=TextBox1.Text'取得字符串 CopyTo:以下的程序?qū)extBox1中的內(nèi)容指定到S1變量,而S2是一個動態(tài)字符數(shù)組,在程序里重新指定其范圍。使用CopyTo方法指定S1中由索引1開始的3個字符,圖2.3.12是這個例子的執(zhí)行結(jié)果。程序中的CType是為了將原本字符數(shù)組的S2轉(zhuǎn)換成字符串類型。DimS1DimS1AsString,S2()AsS1TextBox1.Text取得字符串,輸入"TextBox1"ReDimS2(2)'重訂數(shù)組范圍0~2,3個元素S1.CopyTo(1,S2,0,3)'將字符 結(jié)果顯示出來(得到 MsgBoxStyle.OKOnly,"CopyTo圖2.3.11Copy方法執(zhí)行結(jié) 圖2.3.12CopyTo方法的執(zhí)行結(jié)符串的最后一個字符是否為"E",圖2.3.13是這個例子的執(zhí)行結(jié)果。DimDimS1AsS1TextBox1.Text取得字符串,輸入"ABCDE"MsgBox("字符串結(jié)尾檢查結(jié)果:&Format:以下的程序?qū)1I2兩個整數(shù)相加V1中,使Format方個變量的序數(shù)排列,圖2.3.14是這個例子的執(zhí)行結(jié)果。VisualBasic.NET及常用組件簡 DimDimI1I2V1AsIntegerI1=3設(shè)置整數(shù)值I2=8另一個整數(shù)值V1I1I2數(shù)值計算'利用Format將結(jié)果顯示MsgBox(String.Format("{0}+{1}={2}I1I2MsgBoxStyle.InformationOrMsgBoxStyle.OKOnly,"Format圖2.3.13結(jié)尾字符串檢查結(jié) 圖2.3.14Format執(zhí)行結(jié)小數(shù)點的方式表示此值(例中是V1)。格式化字符及其意如表2.3.12所示。2.3.12C數(shù)值將轉(zhuǎn)換為表示貨幣數(shù)量的字符串。轉(zhuǎn)換由用以格式化數(shù)值的 DE科學(xué)(指數(shù)的數(shù)字會轉(zhuǎn)換為"-d.ddd...E+ddd"或"-d.ddd...e+ddd"型式的字符串,其中"d"表F或..."GN數(shù)字會轉(zhuǎn)換為"-d,ddd,ddd.ddd..."型式的字符串,其中"d"表示數(shù)字(0~9)P或.PatternNumberFormatInfo.PercentPositivePattern屬性所定義R或XInsertTextBox1S1Insert方法將"INT"S1字符串中(S12開始加入)2.3.15是這個例DimDimS1AsS1TextBox1.Text原來是字符串是”Demo2”'利用Insert將結(jié)果顯示出來MsgBox("Insert后的結(jié)果為"&S1.Insert(2,"INT"),JoinS14個元素;S2變量則DimS1(DimS1(AsString"ABC"123"This"Original"原始數(shù)組DimS2AsString'使用Join,將結(jié)果顯示MsgBoxStyle.OKOnly,"Join圖2.3.15Insert執(zhí)行結(jié) 圖2.3.16Join執(zhí)行結(jié)由于輸入的字符串是"DemoDemo",最后符合的"m"7個位置,故其索引值6。DimDimS1AsS1TextBox1.TextDemoDemo'Join,將結(jié)果顯示出來除原始字符串中,第兩個索引位置開始的3個字符。由于輸入的字符串是。圖DimDimS1AsS1TextBox1.TextDemoDemo'Remove,將結(jié)果顯示出來VisualBasic.NET及常用組件簡 圖2.3.17LastIndexOf執(zhí)行結(jié) 圖2.3.18Remove執(zhí)行的結(jié)PadLeftTextBox1S1Padleft方法,S1字符串靠右,在字符串左邊填入"."10。由于輸入的字符串是"Demo",移除后的結(jié)果是"…Demo"。圖2.3.19是執(zhí)行的結(jié)果。DimDimS1AsS1TextBox1.TextDemo'PadLeft,將結(jié)果顯示出來MsgBox("PadLeft的結(jié)果為"&S1.PadLeft(10,"."),Replace:以下的程序?qū)extBox1的內(nèi)容指定給S1變量,并利用Replace方法,S1ex替換。由于輸入的字符串是"DemoReplace",移除后的結(jié)果是"DxmoRxplacx"。圖2.3.20是執(zhí)行的結(jié)果。DimDimS1AsS1TextBox1.TextDemoReplace'Replace,將結(jié)果顯示出來MsgBox("Replace的結(jié)果為&S1.Replace("exSplit:以下的程序設(shè)置S1字符串,并通過Split方法將此字符串中指定的字符(逗號及)當(dāng)成是分隔字符,將S1字符串分成字符串?dāng)?shù)組,并將此數(shù)組中的第0個元素顯示出來。圖2.3.21是執(zhí)行的結(jié)果。DimDimS1AsString,DelmAsStringDimDelArr()AsCharDelm=",."'DelArrDelm.ToCharArray分離成字符數(shù)組S1="Thisis,One.Two.Three,"'使用Split取得分離后的第0個元素,將結(jié)果顯示MsgBox("Split的結(jié)果為&MsgBoxStyle.InformationOrMsgBoxStyle.OKOnly,"Split圖2.3.19PadLeft執(zhí)行結(jié) 圖2.3.20Replace執(zhí)行結(jié) 圖2.3.21Split執(zhí)行結(jié) 事件中的程序由于事件處理函數(shù)可以通過后方Handles關(guān)鍵字決定所欲處理的對象的事件程序,故PrivatePrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_Button2.Click,_Button3.Click,_'按鈕的處理程序?qū)懺贗f(CType(sender,Button)IsButton1)Then'其他的程序EndIf(CType(sender,Button)IsButton2)Then'其他的程序EndIf(CType(sender,Button)IsButton3)Then'其他的程序EndIf(CType(sender,Button)IsButton4)Then'其他的程序End程序中通過同一個事件函數(shù),但在Handles后面加上欲處理的對象事件,即可在程序Button3、Button4ButtonCType轉(zhuǎn)換其類型,以便進行比傳值(ByVal)的方式,另一種則是傳址(ByRef)。VisualBasicNET中默認的方式是傳值,它實際上是一份復(fù)本給函數(shù),于函數(shù)中運算完畢后,并不會改變原先的數(shù)值;傳址的方VisualBasic.NETVisualBasic.NET及常用組件簡 3章串行通信程序及 Windows串行通信程序及 程序Decalre語[[<attrlist>][Public|Private|Protected|Friend|ProtectedFriend][Shadows]Declare[Ansi|Unicode|Auto][Sub]nameLib"libname"[Alias"aliasname"][([arglist])][[<attrlist>][Public|Private|Protected|Friend|ProtectedFriend][Shadows]Declare[Ansi|Unicode|Auto][Sub]nameLib"libname"[Alias"aliasname"][([arglist])][Astype][[<attrlist>][Optional][ByVal|ByRef][ParamArray]varname[()][type3.1.2項目 選擇項。套用至這個自變量的特征項(Attribute)列表。特征項之間以逗號來分 擇項,并使用Optional關(guān)鍵字來。如果使用ParamArray,則任何自變量都無法使用 選擇項。表示自變量是由傳值方式傳遞,默認值是ByVal ParamArray選擇項。只用來當(dāng)arglistObjectOptional數(shù)組。ParamArray關(guān)鍵字允許提供任意數(shù)目的自變量。ParamArray關(guān)鍵字不能和ByVal、ByRef或Optional一起使用 數(shù)組變量的必要項。表示varname 選擇項。傳遞至程序的自變量數(shù)據(jù)類型,可以是項項 說VisualBasic.NET組件(Assembly)的中繼數(shù)據(jù)一起描述與機器碼相互操作時如何封送處理方法參數(shù),這將使用MarshalAsAttribute類別。通用語言運行庫(CommonLanguageRuntime)BStr,但所函數(shù)中的字符串處理方式可能不是BStr,這種情形下,可以使用MarshalAsAttribute特征項封送處理字符串為LPStr、LPWStr、LPTStrBStr其中的一種。這樣就可符合函數(shù)的原始定BStr是固定長度雙字節(jié)的Unicode字符字符串;LPStr是單一字節(jié)Null字符結(jié)束Windows98ANSIWindowsNT和WindowsXP上Unicode。DllImportAttributeUnmanaged程序代碼。這部分在下一小節(jié)說明。則指定為Auto(表示自動轉(zhuǎn)換)DeclareDeclareAutoFunctionMBoxLib"user32.dll"Alias"MessageBox"(ByValhWndAsInteger,ByValtxtAsString,ByValTextAsString,ByValTypAsInteger)AsInteger數(shù)給API函數(shù)。DeclareDeclareFunctionLiblpDCBAsDCB)AsIntegerDllImport方CharSet:=CharSet.Unicode,ExactSpelling:=True,_CallingConvention:=CallingConvention.StdCall)>_串行通信程序及 PublicPublicSharedFunctionMoveFile(ByValsrcAsString,ByValdstAsString)AsEnd常數(shù)VisualBasic.NET中也必須先將會使用到的常數(shù)加以,以便在調(diào)用API時使用這些數(shù)值。在串行通信的場合中經(jīng)常用到的常數(shù),其如下:PublicConstPURGE_RXABORTAsInteger=&H2PublicConstPURGE_RXABORTAsInteger=&H2PublicConstPURGE_RXCLEARAsInteger=&H8PublicConstPURGE_TXABORTAsInteger=&H1PublicConstPURGE_TXCLEARAsInteger=&H4PublicConstGENERIC_READAsInteger=&H80000000PublicConstGENERIC_WRITEAsInteger=&H40000000PublicConstOPEN_EXISTINGAsInteger=3PublicConstINVALID_HANDLE_VALUEAsInteger=-1PublicConstIO_BUFFER_SIZEAsInteger=1024PublicConstFILE_FLAG_OVERLAPPEDAsInteger=&H40000000PublicConstERROR_IO_PENDINGAsInteger=997Public PLETEAsInteger=常數(shù)的定義會使用比較容易了解的字符串,例如上方程序代碼中的PURGE_枚舉舉的以Enum開始,而以EndEnum作為結(jié)束,其格式如下:EndEndEnum<Flags()>EnumEndEnum上述枚舉中的第三種,<Flags()>特征項代表一種特殊的枚舉類型,稱為位字段(Bit''極性位PublicEnumDataParityParity_None=0EndEnumPublicEnumDataStopBitStopBit_1=0StopBit_2=2EndEnum'緩沖區(qū)清除PublicEnumPurgeBuffersRXAbort=&H2RXClear=&H8TxAbort=&H1TxClear=&H4EndPublicEnumLinesSetRts=ClearRts=SetDtr=ClearDtr=ResetDev=SetBreak=ClearBreak=9EndEnum'調(diào)制解調(diào) 狀態(tài)位設(shè)<Flags()>PublicEnum串行通信程序及 ClearToSeClearToSendOn=&H10DataSetReadyOn=&H20RingIndicatorOn=&H40CarrierDetect=&H80End'事 位設(shè)<Flags()>PublicEnumEventMasksRxChar=&H1RXFlag=&H2TxBufferEmpty=&H4ClearToSend=&H8DataSetReady=&H10ReceiveLine=&H20Break=&H40StatusError=&H80Ring=&H100EndiRciRc m(mhRS,iRciRcmMask(mhRS,EventMasks.BreakOr_EventMasks.ClearToSendOr_EventMasks.DataSetReadyOr_EventMasks.ReceiveLineOr_結(jié)構(gòu)為了將大量的參數(shù)傳入被調(diào)用的函數(shù),結(jié)構(gòu)是常見的方法。VisualBasic.NET的結(jié)構(gòu)API中所的結(jié)構(gòu)VisualBasic.NET中的不同,它里面只有數(shù)據(jù)類型的排列,其余的屬性、事件、方法均不含在內(nèi),由于和現(xiàn)在的VisualBasic.NET結(jié)構(gòu)不同,當(dāng)有必要結(jié)構(gòu),并將結(jié)構(gòu)值填入,傳給被調(diào)用的函數(shù)時,必須針對結(jié)構(gòu)做適當(dāng)?shù)男拚?,而以下僅使用在API中的結(jié)構(gòu)??梢岳肧tructure表達式來開始結(jié)構(gòu)的,并利用EndStructure表達式結(jié)束,在兩個表達式之間至少要一個成員。結(jié)構(gòu)的格式如下:<<StructLayout特征項PublicStructureSNamePublicField1AsIntegerPublicField2AsShortPublicField3AsBytePublicField4AsLongEndField2、Field3、Field4表示該結(jié)構(gòu)所擁有的成員,此例中的成員之類型各不相同。括號()將內(nèi)容填入即可。例如,在結(jié)構(gòu)特征項中,會使用到<StructLayout(LayoutKind.Sequential,Pack:=1)>LayoutKind.Sequential用來表示此結(jié)構(gòu)中的成員必須依順序傳入(針對數(shù)值類型而言);而Pack:=1LayoutKind.Sequential被指定后,用來控上一節(jié)已經(jīng)介紹了WindowsAPI在使用上可以使用的方式,也簡要說明常數(shù)定義及結(jié)構(gòu)的定義。通過規(guī)定的方式,可以使用Win32API所提供的各項功能,而現(xiàn)在就串行通信相關(guān)CreateFile/CloseHandle(打開/關(guān)閉通信端口Windwos將串口當(dāng)成文件,所以打開串口也就順理成章地使用打開文件的函數(shù)了。打開文件的CreateFile函數(shù)如下:PublicPublicDeclareAutoFunctionCreateFileLib"kernel32.dll"(_ByVallpFileNameAsString,_ByValdwDesiredAccessAsInteger,_ByValdwShareModeAsInteger,_ByVallpSecurityAttributesAsInteger,_ByValdwCreationDispositionAsInteger,_ByValdwFlagsAndAttributesAsInteger,_ByValhTemplateFileAsInteger)AslpFileName:欲打開的文件名稱。以串行通信端口來說,就是、2GENERIC_READGENERIC_WRITE常數(shù)(此常數(shù)已事先定義好了,可以直接因此這個參數(shù)要設(shè)是為0。串行通信程序及 lpSecurityAttributesSecurityAttributeHandle是否可以被子程序所繼承。在此設(shè)置NULL,表示不可繼承。須被指定為OPEN_EXISTING,并且會忽略lpSecurityAttribute及hTemplate兩個參數(shù),故該兩個參數(shù)需設(shè)置為NULL或0。flagOverlapped用于決定是否此時本項設(shè)置須0。HandleHandle值進行相關(guān)的串行通信端口操作先返回的Handle傳入函數(shù)中,執(zhí)行關(guān)閉文件的操作,CloseHandle函數(shù)如下:PublicPublicDeclareAutoFunctionCloseHandleLib"kernel32.dll"_(ByValhCommAsInteger)AsIntegerCreateFileHandle值。當(dāng)此函數(shù)返回True時,表示關(guān)閉操作完成。自此以后即不能再使用串行通信端口。mState(取得通信端口參數(shù)mState函數(shù),其如下PublicPublicDeclareAutoib"kernel32.dll"(ByValhCommAsInteger,ByReflpDCBAsDCB)AshComm:串行端口的Handle值,即為使用CreateFileByRefByVal。此結(jié)構(gòu)含有和設(shè)備相關(guān)的參數(shù),在此是<<StructLayout(LayoutKind.Sequential,Pack:=1)PublicStructureDCBPublicDCBlengthAsInteger'結(jié)構(gòu)長度PublicBaudRateAsInteger'通信速度PublicBits1AsInteger'包括很多的控制旗標,詳看Publicw AsShort'保留,尚未使用PublicXonLimAsShort'緩沖區(qū)最小保留數(shù)PublicXoffLimAsShort'緩沖區(qū)最小保留數(shù)PublicByteSizeAsByte'數(shù)據(jù)位數(shù)PublicParityAsByte PublicPublicStopBitsAsByte'停止位PublicXonCharAsByte'Xon字符PublicXoffCharAsByte'Xoff字符PublicErrorCharAsByte'錯誤發(fā)生時的替換字符PublicEofCharAsByte'輸入的結(jié)尾字符PublicEvtCharAsByte'收到的事件字符Publicw 2AsShort'保留,尚未使用End上述的各項參數(shù)加上不使用的其他部分,都可用類似列舉中的Flag()特征項的方是0),以下就是依次將上述的各項設(shè)為成立(1或非零值)時的枚舉狀況:<Flags()>Public<Flags()>PublicEnumBitDefdcb_Binary=&H1dcb_ParityCheck=&H2dcb_OutxCtsFlow=&H4dcb_OutxDsrFlow=&H8dcb_DtrControlMask=&H30dcb_DtrControlDisable=&H0dcb_DtrControlEnable=&H10dcb_DtrControlHandshake=&H20dcb_DsrSensivity=&H40dcb_TXContinueOnXoff=&H80dcb_OutX=&H100dcb_InX=&H200dcb_ErrorChar=&H400dcb_NullStrip=&H800dcb_RtsControlMask=&H3000dcb_RtsControlEnable=&H1000dcb_RtsControlHandShake=&H2000dcb_RtsControlToggle=&H3000dcb_AbortOnError=&H4000 s=End在上述的結(jié)構(gòu)中,Bit1Integer4個字節(jié),以位表示的話,就有32個位,故在上述的dcb_s以&HFFFF8000表示,其中就含有32個位。此枚舉時,將設(shè)置1的部分相加后,填入Bits1的位置即可設(shè)置相對參數(shù)。XonChar:XONXoffChar:設(shè)置XOFF串行通信程序及 mState(設(shè)置通信端口參數(shù)WriteFile(輸出數(shù)據(jù)至通信端口函數(shù)WriteFile,其函數(shù)如下:PublicPublicDeclareAutoFunctionWriteFileLib"kernel32.dll"_(ByValhCommAsInteger,_ByValBufferAsByte(),ByValnNumberOfBytesToWriteAsInteger,_ByReflpNumberOfBytesWrittenAsInteger,_ByReflpOverlappedAsOVERLAPPED)AshComm:串行端口的Handle值,此值即為使用CreateFileBuffer:指向欲傳送的數(shù)據(jù)數(shù)組(類型是字節(jié))nNumberOfBytesToWrite:寫入的字節(jié)數(shù)一般的情形下也是設(shè)置為NULL。ReadFile(自通信端口數(shù)據(jù)件函數(shù)ReadFile,其函數(shù)如下:PublicPublicDeclareAutoFunctionReadFileLib"kernel32.dll"_(ByValhCommAsInteger,_ByValBufferAsByte(),ByValnNumberOfBytesToReadAsInteger,_ByReflpNumberOfBytesReadAsInteger,_ByReflpOverlappedAsOVERLAPPED)AshComm:串行端口的Handle值,此值即為使用CreateFileBuffer:指向被數(shù)據(jù)的字節(jié)數(shù)組nNumberOfBytesToRead:欲的數(shù)據(jù)字節(jié)數(shù)lpNumberOfBytesRead:被的總字節(jié)數(shù)lpOverlappedOverlappedI/OmError(清除通信端口錯誤狀況清除串行端口錯誤或串行當(dāng)前狀態(tài)時,可 PublicPublicDeclareAutomErrorLib"kernel32.dll"(ByValhCommAsInteger,_ByVallpErrorsAsInteger,_ByReflpCSAsCOMSTAT)AshComm:串行端口的Handle值,此值即為使用CreateFilelpError:返回錯誤數(shù)值,錯誤常數(shù)的舉定義如下<Flags()>Public<Flags()>PublicEnumCommErrorCE_BREAK&H10'檢測到信號中斷CE_DNS&H800'Windows CE_FRAME&H8'CE_IOE&H400'CE_MODE=&H8000'設(shè)置模式錯誤,或是hFile值錯誤。CE_OOP&H1000Windows95項目,并行端口發(fā)生缺紙錯誤。CE_OVERRUN=&H2'暫存區(qū)容量不足,數(shù)據(jù)將遺失。CE_PTO=&H200'Windows95 CE_RXOVER&H1'接收區(qū)滿溢或在文件結(jié)尾被接收到后仍有數(shù)據(jù)傳送過來。CE_RXPARITY=&H4'暫存區(qū)容量不足,數(shù)據(jù)將遺失。CE_TXFULL&H100'Windows End如果采用列舉的方式檢查這些參數(shù)的話,可以將改ByVallpErrorsAsCommError就更方便了。lpStat:指向通信端口狀態(tài)的結(jié)構(gòu)變量。此結(jié)構(gòu)的原始如下<<StructLayout(LayoutKind.Sequential,Pack:=1)>_PublicStructureCOMSTATPublicStateFlagAsIntegerPubliccbInQueAsIntegerPubliccbOutQueAsIntegerEnd<Flags()>Public<Flags()>PublicEnumCommErrorLinefCtsHold=&H1'等待CTS信號準備傳送fDsrHold=&H2'等待DSR信號準備傳送fRlsdHold=&H4'等待RLSD信號準備傳送fXoffHold=&H8'收到XOFF字符,停止傳送fXoffSent=&H10'已送出XOFF字符,停止傳送fEof=&H20 'EOF字符已送出fTxim=&H40 EndEnum串行通信程序及 ◆m(清除通信端口 m,其如下:PublicDeclareAutoFunction PublicDeclareAutoFunction mLib"kernel32.dll"_(ByValhCommAsInteger,_ByValdwFlagsAsInteger)AshComm:串行端口的Handle值,此值即為使用CreateFiledwFlags:指定執(zhí)行的工作,由常數(shù)數(shù)值組成,可用枚舉表示如PublicPublicEnumPurgeBuffersTxAbort=&H1RXAbort=&H2TxClear=&H4RXClear=&H8EndTxAbortRxAbort:終止目前所有的的工作,立即返回,不管是否完成的操作mFunction(要求特定控制工作 線路的控制,其函數(shù)如下:PublicPublicDeclareAutomFunctionLib"kernel32.dll"(ByValhCommAsInteger,ByValifuncAsLong)AshComm:串行端口的Handle值,此值即為使用CreateFileiFunc:指定串行端口必須完成的工作,由以下枚舉值的常數(shù)數(shù)值PublicPublicEnumSetXoff1Xoff字符時啟動傳輸操作。SetXon=2'Xon字符時啟動傳輸操作。SetRts=3RTS線路升成高電位。ClearRts4RTS線路降SetDtr5DTR線路升ClearDtr6DTR線路降ResetDevResetDev7EndmMask(信息 mMask的如下:PublicPublicDeclareAuto(ByValhCommAsInteger,mMaskLib"kernel32.dll"ByVallpEvtMaskAsEventMasks)AshComm:串行端口的Handle值,此值即為使用CreateFileFlags()>Flags()>PublicEnumEventMasksRxChar=&H1RXFlag=&H2TxBufferEmpty=&H4ClearToSend=&H8DataSetReady=&H10ReceiveLine=&H20Break=&H40StatusError=&H80Ring=&H100ndRxChar:輸入緩沖區(qū)已收到一個字RXFlag:使用 mState函數(shù)設(shè)置的DCB結(jié)構(gòu)中的等待字符已被傳入TxBufferEmpty:在輸出緩沖區(qū)中的數(shù)據(jù)已被完全送StatusError:線路狀態(tài)錯誤,包括了CE_FRAMECE_OVERRUNRing:檢測到響鈴信號串行通信程序及 mEvent(檢測事件是否已發(fā)生使用mMask函數(shù)設(shè)置所要檢測的事件后,當(dāng)此事件發(fā)生時,就可以用mEventTrue,表示設(shè)置的信息已發(fā)生。mEvent函數(shù)的如下:PublicPublicDeclareAutomEventLib"kernel32.dll"(ByValhCommAsInteger,_ByRefMaskAsEventMasks,_ByRef OVERLAPPED)AshComm:串行端口的Handle值,此值即為使用CreateFile lpOverlappedOverlapped開文件時應(yīng)給定的結(jié)構(gòu),在串行通信中若不采用Overlapped的情形下,若已設(shè)置了信息mModemStatus(電位狀態(tài)檢測 PublicPublicDeclareAutomModemStatusLib"kernel32.dll"(ByValhCommAsInteger,ByReflpModemStatusAsInteger)AshComm:串行端口的Handle值,此值即為使用CreateFile<Flags()><Flags()>PublicEnumModemStatusBitsClearToSendOn=&H10DataSetReadyOn=&H20RingIndicatorOn=&H40CarrierDetect=&H80EndDataSetReadyOn:DSRRingIndicatorOn:RI一般使用mEvent函數(shù)可得知線路狀態(tài)發(fā)生改變,但無法確定確切的狀態(tài),而使用檢查通信回路2.TextBox組件中,相ImportsSystem.Text接著一個模塊區(qū)段。一個模塊區(qū)段是以ModuleRS232及EndModule作為起始,PublicmhRSAsInteger1PublicmiPortAsInteger=1'默認通信端口為COM1PublicmiBaudRateAsInteger= PublicmeStopBitAsDataStopBit1'

'NonePublicmiDataBitAsPublicmiDataBitAsInteger88PublicmiBufferSizeAsInteger512512PublicEnumDataParityParity_None=0EndEnumPublicEnumDataStopBitStopBit_1=0StopBit_2=2EndEnum'緩沖區(qū)清除PublicEnumPurgeBuffersRXAbort=&H2RXClear=&H8TxAbort=&H1TxClear=&H4End PublicEnumLinesSetXoff1Xoff字符時啟動傳輸操作。SetXon=2'Xon字符時啟動傳輸操作。SetRts=3RTS線路升成高電位。ClearRts4RTS線路降成低電位。SetDtr=5DTR線路升成高電位。ClearDtr6DTR線路降成低電位。ResetDev=7'重置設(shè)備SetBreak8設(shè)置通信狀態(tài)為中斷(Break信號)End'調(diào)制解調(diào) 狀態(tài)位設(shè)<Flags()>PublicEnumModemStatusBitsClearToSendOn=&H10DataSetReadyOn=&H20RingIndicatorOn=&H40CarrierDetect=&H80End'事 位設(shè)<Flags()>PublicEnumRxChar&H1'RXFlag=&H2'使用 TxBufferEmpty=&H4在輸出緩沖區(qū)中的數(shù)據(jù)已被完全送出。ClearToSend=&H8'CTS(ClearToSend)線路發(fā)生變化。DataSetReady=&H10'DSR(DataSetReady)線路發(fā)生變化。ReceiveLine&H20'CD(CarrierDetect)線路信號發(fā)生變化。Break=&H40'Break信號StatusError&H80CE_FRAME、CE_OVERRUN、CE_RXPARITY三種錯誤。Ring&H100檢測到響鈴信號。EndEnum'DCB設(shè)置<Flags()>PublicEnumBitDefdcb_Binary=&H1dcb_ParityCheck=&H2dcb_OutxCtsFlow=&H4dcb_OutxDsrFlow=&H8dcb_DtrControlMask=&H30dcb_DtrControlDisable=&H0dcb_DtrControlEnable=&H10dcb_DtrControlHandshake=&H20dcb_DsrSensivity=&H40dcb_TXContinueOnXoff=&H80dcb_OutX=&H100dcb_InX=&H200dcb_ErrorChar=&H400dcb_NullStrip=&H800dcb_RtsControlMask=&H3000dcb_RtsControlEnable=&H1000dcb_RtsControlHandShake=&H2000dcb_RtsControlToggle=&H3000dcb_AbortOnError=&H4000 s=&HFFFF8000EndEnum'通信端口錯<Flags()>PublicEnumCommErrorCE_BREAK=&H10CE_DNS=&H800CE_FRAME=&H8CE_IOE=&H400CE_MODE=&H8000CE_OOP=&H1000CE_OVERRUN=&H2CE_PTO=&H200CE_RXOVER=&H1End'通信端口線路狀態(tài)檢測<Flags()>PublicEnumCommErrorLinefCtsHold=&H1'等待CTS信號準備傳送fDsrHold=&H2'等待DSR信號準備傳送fRlsdHold=&H4'RLSD信號準備傳送fXoffHold&H8XOFF字符,停止傳送串行通信程序及 fEof EOFfTxim=&H40 EndEnum#End串行通信的函數(shù)調(diào)用時會使用的設(shè)置或,而且這些數(shù)值都是從Win32API的常數(shù)聲明中出來的。#Region#Region<StructLayout(LayoutKind.Sequential,Pack:=1)PublicStructureDCBPublicDCBlengthAsInteger結(jié)構(gòu)長度PublicBaudRateAsIntegerPublicBits1AsIntegerPublicw AsShortPublicXonLimAsShortPublicXoffLimAsShortPublicByteSizeAsBytePublicParityAsBytePublicStopBitsAsBytePublicXonCharAsBytePublicXoffCharAsBytePublicErrorCharAsBytePublicEofCharAsBytePublicEvtCharAsBytePublicw 2AsShortEndPublicStateFlagAsIntegerPubliccbInQueAsIntegerPubliccbOutQueAsIntegerEnd<StructLayout(LayoutKind.Sequential,Pack:=1)>PublicStructurePublicReadIntervalTimeoutAsIntegerPublicReadTotalTimeoutMultiplierAsIntegerPublicReadTotalTimeoutConstantAsIntegerPublicWriteTotalTimeoutMultiplierAsIntegerPublicWriteTotalTimeoutConstantAsIntegerEnd<StructLayout(LayoutKind.Sequential,Pack:=1)>PublicStructurePublicdwSizeAsIntegerPublicwVersionAsPublic AsPublicdwProviderSubTypeAsPublicPublicdwProviderOffsetAsIntegerPublicdwProviderSizeAsIntegerPublicwcProviderDataAsByteEnd<StructLayout(LayoutKind.Sequential,Pack:=1)>PublicStructurePublicInternalAsIntegerPublicInternalHighAsIntegerPublicOffsetAsIntegerPublicOffsetHighAsIntegerPublichEventAsIntegerEnd#End#Region#RegionPublicConstGENERIC_READAsInteger=&H80000000PublicConstGENERIC_WRITEAsInteger=&H40000000PublicConstOPEN_EXISTINGAsInteger=3#End PublicPublicOverloadsDimuDcbAsDCB,iRcAsIntegerDimiModeAsInteger=0DimsDCBStateAsStringIfmiPort>0Then'打開通信mhRS=CreateFile("COM"&miPort.ToString,GENERICREAD ENERICWRITE,0,0,OPENEXISTING,iMode,IfmhRS1ThenDimlpErrCodeAsiRc'清除緩iRcmError(mhRS,lpErrCode,m(mhRS,PurgeBuffers.RXClear'設(shè)置輸出入緩沖區(qū)的iRcm(mhRS,miBufferSize,'取得通信端口設(shè)置值,并填入DCB結(jié)iRc mState(mhRS,串行通信程序及 uDcb.BaudRatemiBaudRateuDcb.ByteSize=miDataBituDcb.Parity=meParityuDcb.StopBits=meStopBitiRc mState(mhRSuDcb)'DCBIfiRc0ThenDimlCodeAslCodeGetLastError()'MsgBox("DCB結(jié)構(gòu)創(chuàng)建發(fā)生錯誤,錯誤代碼&lCode.ToString)'打開EndAPImiPort是代表通信號碼的變量,由于必須將其指定給字符串,故使用整數(shù)類型的ToString方法將其轉(zhuǎn)換為字符串,再和“COM”字符串結(jié)合起mError用來清除現(xiàn)在通信端口的所有錯誤,其第三個參數(shù)Nothing的原因是不需要在此時得知目前通信端口的其他狀態(tài),只要單純地將其清除即可。mOr語句連接兩個枚舉值,m用來設(shè)置輸出入緩沖區(qū)所使用的大小,一般使512個字節(jié)就已經(jīng)足夠了。使用mState取得現(xiàn)在通信端口的相關(guān)設(shè)置參數(shù),再使用mState將參數(shù)得知該結(jié)構(gòu)的內(nèi)容,那么也就只要填入Nothing,表示這個參數(shù)不使用。關(guān)閉通信的PublicPublicIfmhRS<>-1ThenmhRS=-1EndIfEndSubPublicPublicOverloadsSubWrite(ByValBufferAsDimDimiBytesWritten,iRcAsIntegerIfmhRS=-1TheniRcWriteFile(mhRSBufferBuffer.LengthiBytesWritten,Nothing)'輸出數(shù)組IfiRc=0ThrowNewApplicationException("傳輸失敗-已傳輸"&EndCatchExAsExceptionEndIfEndPublicOverloadsSubWrite(ByValBufferAsString)DimoEncoderAsNewSystem.Text.UTF8EncodingDimaByteAsByteoEncoder.GetBytes(Buffer)Write(aByte)'調(diào)用另一個傳輸?shù)闹剌d函數(shù)EndAPIWriteFile所傳送的是字節(jié)的數(shù)據(jù),如果欲傳送的數(shù)據(jù)是字符串,必須先將數(shù)據(jù)System.TextUTF8Encoding類編碼處理(4章再詳細說明),并轉(zhuǎn)換為數(shù)組,才能經(jīng)由WriteFile傳送。充當(dāng)多個參數(shù)類型的函數(shù)(例如這里所建的Write函數(shù))在重載時必須在函數(shù)名稱之前加上不同的名稱,卻又不免讓人感到這是兩個不同的操作,因此,僅使用一個Write的函數(shù)名DimiReadCharsiRclpErrorsAsIntegerDimmabtRxBufAsByte() IfmhRS=-1 DimcsAsmError(mhRSlpErrorscs)'取得緩沖區(qū)內(nèi)的字節(jié)iReadChars=串行通信程序及 ReDimReDimmabtRxBuf(iReadChars-iRc=ReadFile(mhRS,mabtRxBuf,cs.cbInQue,iReadChars,IfiRc0Then ThrowNewApplicationException(" &iRc.ToString)Bytes2Read=iReadCharsInputByte=mabtRxBufEndCatchExAsException ThrowNewApplicationException(" &Ex.Message,Ex)EndTryEndSubPublicOverloadsSubRead(ByRefChar2ReadAsInteger,ByRefInputStringAsDimiReadCharsiRclpErrorsAsIntegerDimmabtRxBufAsByte()'接收緩沖區(qū) IfmhRS=-1 DimcsAsmError(mhRSlpErrorscs)'取得緩沖區(qū)內(nèi)的字節(jié)iReadChars=ReDimmabtRxBuf(iReadChars-iRc=ReadFile(mhRS,mabtRxBuf,cs.cbInQue,iReadChars,IfiRc0Then ThrowNewApplicationException(" &iRc.ToString)Char2ReadiReadCharsDimoEncoderAsNewSystem.Text.UTF8EncodingInputString=oEncoder.GetString(mabtRxBuf)EndCatchExAsException ThrowNewApplicationException(" &Ex.Message,Ex)EndTryEndEnd使用API函數(shù)中的ReadFile可以串行端口的數(shù)據(jù),但其進來的數(shù)據(jù)是字節(jié)的要經(jīng)過System.Text的UTF8Encoding的類處理,才能得到正確的字符串。因此數(shù)據(jù)的函數(shù)也是使用重載創(chuàng)建的兩個程序,以便字節(jié)和字符串都可以順利。使用重載的方式創(chuàng)建兩個函數(shù)也就是為了可以將進來的數(shù)據(jù)區(qū)分為字節(jié)或是字符串,重載的說明見上述Write函數(shù)部分內(nèi)容。ByRef,也就是傳送其內(nèi)存地址給函數(shù),如此一來,函雙擊【打開通信端口】按鈕,隨即會出現(xiàn)該組件默認的Click事件程序,寫入IfIffPortOpenbtnOpen.Text打開通信端口"fPortOpen=FalseEndIf 1.CheckedThenmiPort1COM1miPort2COM2EndIfmiBaudRate9600miDataBit=meParity=mRS232.DataParity.Parity_NonemeStopBit=()'使用默認值打開通信端口 btnOpen.Text="關(guān)閉通信端口"執(zhí)行關(guān)閉通信端口操作。而通過RadioButton的Checked屬性可以判斷兩個COM是哪一個至于真正的打開通信端口的程序是一個函數(shù)應(yīng)用,此函數(shù)放在模塊中,請參雙擊【送出字符串】按鈕,在其Click事件程序?qū)慖fIfNotfPortOpenMsgBox("必須先打開通信端口,才能進行傳輸工作MsgBoxStyle.CriticalOrMsgBoxStyle.OKOnly,"尚未打開通信端口")EndIf Write函數(shù)將字符串輸出到串行端口。在此所輸出的是字符串類型的數(shù)據(jù),應(yīng)特別注意到API的中,數(shù)據(jù)必須被成數(shù)組類型,這里的模塊中也特別將Write函數(shù)重載了兩個函數(shù),一個處理字節(jié)的傳入?yún)?shù)一個處理字符串的傳入?yún)?shù)因此在重載Write函數(shù)使用了System.Text命串行通信程序及 雙擊【接收字符串】按鈕,在其Click事件程序編輯窗口中寫DimS1AsStringDimS1AsString接收的字符串DimSNoAsInteger接收的字符數(shù)IfNotfPortOpenThenMsgBoxStyle.OKOnly,"尚未打開通信端口")ExitSubEndIfRead(SNoS1 txtReceive.TextS1分在第4章還會詳加。雙擊【結(jié)束系統(tǒng)】按鈕,在其事件程序編輯窗口中寫入以下程序IfIffPortOpenThenEnd結(jié)束程序做此實驗時,可以使用自己的計算機,將RS-232上的2、3針腳短路(如圖3.3.2),便置跳線(如圖3.3.1)連接兩部計算機,使這兩部計算機同時運行本節(jié)的程序。TextBox組件中輸入字符串,單擊【送出字符串】按鈕,數(shù)由輸入緩沖區(qū)讀入。圖3.3.4是程序運行的結(jié)果。PublicPublicClassDimfPortOpenAsBoolean'先判斷那一個RadioButton被選擇,再打開該通信'程序中給定一些初始化的PrivateSubbtnOpen_Click(ByValsenderAsSystem.Object,ByVale3.3.4IfIffPortOpenbtnOpen.Text打開通信端口"fPortOpen=FalseExitSubEndIf 1.CheckedmiPort1COM1miPort2EndIfmiBaudRate=miDataBit=meParity=mRS232.DataParity.Parity_NonemeStopBit=()'使用默認值打開通信端口 btnOpen.Text="關(guān)閉通信端口"End'以End結(jié)束程序

串行通信程序及 PrivateSubbtnEnd_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnEnd.ClickIffPortOpen End結(jié)束程序EndSub'調(diào)用Write送出字符串PrivateSubbtnSend_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnSend.ClickIfNotfPortOpenOrMsgBoxStyle.OKOnly,"尚未打開通信端口")ExitSubEndIf End'以Read函數(shù)取得RS-232返回的字符串PrivateSubbtnReceive_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnReceive.ClickDimS1AsStringDimSNoAsInteger接收的字符數(shù)IfNotfPortOpenThenOrMsgBoxStyle.OKOnly,"尚未打開通信端口")ExitSubEndIfRead(SNoS1 txtReceive.TextS1顯示到文本框中EndSubEndImportsSystem.TextModulePublicmhRSAsInteger=-1 '串口的handlePublicmiPortAsInteger=1 '默認通信端口為COM1PublicmiBaudRateAsInteger=9600 PublicmeParityAsDataParity= 'NonePublicmeStopBitAsDataStopBit=1 '停止位為1PublicmiDataBitAsInteger=8 PublicmiBufferSizeAsInteger512'512PublicEnumDataParityParity_None=0EndEnumPublicEnumDataStopBitStopBit_1=0StopBit_2=2EndEnum'緩沖區(qū)清除PublicEnumPurgeBuffersRXAbort=&H2RXClear=&H8TxAbort=&H1TxClear=&H4End PublicEnumLinesSetXoff1Xoff字符時啟動傳輸操作。SetXon=2'Xon字符時啟動傳輸操作。SetRts=3RTS線路升成高電位。ClearRts4RTS線路降成低電位。SetDtr=5DTR線路升成高電位。ClearDtr6DTR線路降成低電位。ResetDev=7'重置設(shè)備SetBreak8設(shè)置通信狀態(tài)為中斷(Break信號)End'調(diào)制解調(diào) 狀態(tài)位設(shè)<Flags()>PublicEnumModemStatusBitsClearToSendOn=&H10DataSetReadyOn=&H20RingIndicatorOn=&H40CarrierDetect=&H80End'事 位設(shè)<Flags()>PublicEnumRxChar&H1'RXFlag=&H2'使用 TxBufferEmpty&H4串行通信程序及 ClearToSend=&H8'CTS(ClearToSend)線路發(fā)生變化。DataSetReady=&H10'DSR(DataSetReady)線路發(fā)生變化。ReceiveLine&H20'CD(CarrierDetect)線路信號發(fā)生變化。Break=&H40'Break信號StatusError&H80CE_FRAME、CE_OVERRUN、CE_RXPARITY三種錯誤。Ring&H100檢測到響鈴信號。EndEnum'DCB設(shè)置<Flags()>PublicEnumBitDefdcb_Binary=&H1dcb_ParityCheck=&H2dcb_OutxCtsFlow=&H4dcb_OutxDsrFlow=&H8dcb_DtrControlMask=&H30dcb_DtrControlDisable=&H0dcb_DtrControlEnable=&H10dcb_DtrControlHandshake=&H20dcb_DsrSensivity=&H40dcb_TXContinueOnXoff=&H80dcb_OutX=&H100dcb_InX=&H200dcb_ErrorChar=&H400dcb_NullStrip=&H800dcb_RtsControlMask=&H3000dcb_RtsControlEnable=&H1000dcb_RtsControlHandShake=&H2000dcb_RtsControlToggle=&H3000dcb_AbortOnError=&H4000 s=&HFFFF8000EndEnum'通信端口錯<Flags()>PublicEnumCommErrorCE_BREAK=&H10CE_DNS=&H800CE_FRAME=&H8CE_IOE=&H400CE_MODE=&H8000CE_OOP=&H1000CE_OVERRUN=&H2CE_PTO=&H200CE_RXOVER=&H1End'通信端口線路狀態(tài)檢測<Flags()>PublicEnumCommErrorLinefCtsHold=&H1'等待CTS信號準備傳送fDsrHold=&H2'等待DSR信號準備傳送fRlsdHold=&H4'RLSD信號準備傳送fXoffHold=&H8'XOFF字符,停止傳送fXoffSent&H10XOFF字符,停止傳送fEof EOFfTxim=&H40 EndEnum#End#Region<StructLayout(LayoutKind.Sequential,Pack:=1)PublicStructureDCBPublicDCBlengthAsInteger結(jié)構(gòu)長度PublicBaudRateAsIntegerPublicBits1AsIntegerPublicw AsShortPublicXonLimAsShortPublicXoffLimAsShortPublicByteSizeAsBytePublicParityAsBytePublicStopBitsAsBytePublicXonCharAsBytePublicXoffCharAsBytePublicErrorCharAsBytePublicEofCharAsBytePublicEvtCharAsBytePublicw 2AsShortEndPublicStateFlagAsIntegerPubliccbInQueAsIntegerPubliccbOutQueAsIntegerEnd<StructLayout(LayoutKind.Sequential,Pack:=1)>PublicStructurePublicReadIntervalTimeoutAsIntegerPublicReadTotalTimeoutMultiplierAsIntegerPublicReadTotalTimeoutConstantAsIntegerPublicWriteTotalTimeoutMultiplierAsIntegerPublicWriteTotalTimeoutConstantAsIntegerEnd<StructLayout(LayoutKind.Sequential,Pack:=1)>PublicStructurePublicdwSizeAsIntegerPublicwVersionAsShortPublicw AsShortPublicdcbxAsDCBPublicdwProviderSubTypeAsIntegerPublicdwProviderOffsetAsIntegerPublicdwProviderSizeAsIntegerPublicwcProviderDataAsByteEnd串行通信程序及 PublicInternalAsIntegerPublicInternalHighAsIntegerPublicOffsetAsIntegerPublicOffsetHighAsIntegerPublichEventAsIntegerEndStructure#EndRegionPublicConstGENERIC_READAsInteger=PublicConstGENERIC_WRITEAsInteger=&H40000000PublicConstOPEN_EXISTINGAsInteger=3#End#Region"Win32API"'//Win32APIPublicDeclareAutoFunction ib"kernel32.dll"(ByValhCommDevAsInteger,ByReflpDCBAsDCB)AsIntegerPublicDeclareAutoFunction ib"kernel32.dll"(ByValhCommDevAsInteger,ByReflpDCBAsDCB)AsIntegerPublicDeclareAutoFunction AsString,ByReflpDCBAsDCB)AsIntegerPublicDeclareAutoFunction mLib"kernel32.dll"(ByValhFilePublicDeclareAutoFunction mTimeoutsLib"kernel32.dll"(ByValhFileAsInteger,ByRef mTimeoutsAsCOMMTIMEOUTS)AsIntegerPublicDeclareAutoFunction mTimeoutsLib"kernel32.dll"(ByValhFileAsInteger,ByRef mTimeoutsAsCOMMTIMEOUTS)AsIntegerPublicDeclareAutoFunction mErrorLib"kernel32.dll"(ByValPublicDeclareAutoFunction mLib"kernel32.dll"(ByValhFileAsInteger,ByValdwFlagsAsInteger)AsPublicDeclareAutoFunction hFileAsInteger,ByValifuncAsLong)AsBooleanPublicDeclareAutoFunction AsInteger,ByRefMaskAsEventMasks,ByReflpOverl OVERLAPPED)AsIntegerPublicDeclareAutoFunctionWriteFileLib"kernel32.dll"(ByValhFileAsInteger,ByValBufferAsByte(),ByValnNumberOfBytesToWriteAsInteger,AsPublicDeclareAutoFunctionReadFileLib"kernel32.dll"(ByValhFileAsIntege

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論