那位高手做過用VB的COMM控件做通過串口接收短信息_第1頁
那位高手做過用VB的COMM控件做通過串口接收短信息_第2頁
那位高手做過用VB的COMM控件做通過串口接收短信息_第3頁
那位高手做過用VB的COMM控件做通過串口接收短信息_第4頁
那位高手做過用VB的COMM控件做通過串口接收短信息_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、那位高手做過用vb的comm控件做通過串口接收短信息?請(qǐng)指點(diǎn)!樓主redata(風(fēng)之子)2002-01-18 09:35:01 在 VB / 非技術(shù)類 提問我的源程序     Const   COM_IN_BUF_SIZE   =   1024     Dim   ComInBuffer(COM_IN_BUF_SIZE)   As   Variant,   ComInHeadPtr   As   Integer,   ComInTailPtr  

2、 As   Integer,   ComInBufCount   As   Integer     Dim   ComInTimerOut   As   Boolean             Private   Sub   InitPort()                         MSComm1

3、.CommPort   =   1   '選用com1串行口                         MSComm1.Settings   =   "9600,n,8,1"   '波特率9600,無奇偶校驗(yàn)位,8位數(shù)據(jù)位1位停止位                     &#

4、160;   MSComm1.InputLen   =   1   '讀取input接收緩沖區(qū)全部字節(jié)                         MSComm1.InBufferSize   =   1024   '設(shè)置接收緩沖區(qū)的字節(jié)長度                     

5、60;   MSComm1.InBufferCount   =   0   '清除發(fā)送緩沖區(qū)數(shù)據(jù)                         MSComm1.OutBufferCount   =   0   '清除接收緩沖區(qū)數(shù)據(jù)                       

6、60; MSComm1.InputMode   =   1   '輸入模式為binary                         MSComm1.RThreshold   =   1   '控件收到數(shù)據(jù)時(shí)將觸發(fā)OnComm事件                        

7、MSComm1.Handshaking   =   2   '握手協(xié)議      End   Sub     Private   Sub   InitComInBuf()                         ComInBufCount   =   0           

8、0; ComInHeadPtr   =   0             ComInTailPtr   =   0                         ComInTimer.Enabled   =   False             ComInTimer.Interval  

9、 =   5000             ComInTimerOut   =   False         End   Sub     Private   Sub   InitRecieve()             MSComm1.PortOpen   =   True         &#

10、160;       End   Sub         Private   Sub   RunComInHandle()                         Do   While   MSComm1.PortOpen   =   True             &

11、#160;                   If   ComInBufCount   >   0   Then                             ComInHandle                   &

12、#160; End   If                                         DoEvents                                 Loop    

13、            End   Sub         Private   Sub   ComInHandle()                         Dim   InByte   As   Byte             Dim  

14、; InPack(COM_IN_BUF_SIZE)   As   Byte,   InPackCount   As   Integer                                 Do   While   ComInByte(InByte)   =   True          

15、;               If   InByte   =   &HD   Then                             Call   InPackHandle(InPack(),   InPackCount)             &

16、#160;               Exit   Sub                     Else                             InPack(InPackCount)   =   InByte    

17、                         InPackCount   =   InPackCount   +   1                     End   If                     

18、60;                   Loop                 End   Sub     Private   Function   ComInByte(ByRef   InByte   As   Byte)   As   Boolean     '接收一個(gè)字節(jié)   &

19、#160;         If   ComInBufCount   >   0   Then                                 InByte   =   ComInBuffer(ComInTailPtr)              

20、       ComInBufCount   =   ComInBufCount   -   1                     ComInTailPtr   =   (ComInTailPtr   +   1)   Mod   COM_IN_BUF_SIZE               &

21、#160;     ComInByte   =   True                     p_addlist1   "收到回應(yīng)A->"   &   Hex(InByte)   &   ""                     

22、60;   Else                                 ComInTimer.Enabled   =   True                     ComInTimerOut   =   False        

23、;                                 Do   While   ComInTimerOut   =   False                             If   ComInBufCount  

24、; >   0   Then                                     If   ComInBufCount   >   COM_IN_BUF_SIZE   Then                      

25、;                       p_addlist1   "內(nèi)存緩沖區(qū)溢出"                                     End   If             &

26、#160;                       ComInTimer.Enabled   =   False                                     InByte   =   ComInBuffer(ComInTailPtr) &

27、#160;                                   ComInBufCount   =   ComInBufCount   -   1                                 &

28、#160;   ComInTailPtr   =   (ComInTailPtr   +   1)   Mod   COM_IN_BUF_SIZE                                     ComInByte   =   True          

29、                           p_addlist1   "收到回應(yīng)B->"   &   Hex(InByte)   &   ""                             

30、0;       Exit   Function                             Else                                     DoEvents     

31、60;                       End   If                     Loop                                     

32、0;   ComInTimer.Enabled   =   False                     ComInByte   =   False             End   If     End   Function         Private   Sub   Com

33、InTimer_Timer()             ComInTimeOut   =   True     End   Sub                 Private   Sub   MSComm1_OnComm()             Dim   InVar   As   Vari

34、ant             Dim   InArr()   As   Byte                         If   MSComm1.CommEvent   =   comEvReceive   Then   '   事件信息          

35、          Do   While   MSComm1.InBufferCount   >   0                             InVar   =   MSComm1.Input                   &#

36、160;         InArr   =   InVar                             ComInBuffer(ComInHeadPtr)   =   InArr(0)                          

37、   ComInBufCount   =   ComInBufCount   +   1                             ComInHeadPtr   =   (ComInHeadPtr   +   1)   Mod   COM_IN_BUF_SIZE           &

38、#160;         Loop             End   If     End   Sub     Private   Sub   InPackHandle(InPack()   As   Byte,   ByVal   InPackCount   As   Integer)     Dim   InPackSt

39、r   As   String     '#             InPackStr   =   InPack             List2.AddItem   InPackStr             'InPackStr   =   StrConv(MidB(InPack,   1, &

40、#160; InPackCount),   vbUnicode)             'Call   AddRecieveToList(ListRecieve,   InPackStr)             'Call   AddRecieveToDb(InPackStr)     End   Sub         Private  

41、; Sub   p_addlist1(str   As   String)             If   List1.ListCount   >   500   Then                     List1.RemoveItem   0             End &#

42、160; If               List1.AddItem   Format(LineCount,   "0")   &   "."   &   str               LineCount   =   LineCount   +   1      

43、        List1.Selected(List1.ListCount   -   1)   =   True     End   Sub     Private   Sub   Form_Load()             InitPort             InitComInBuf    

44、        InitRecieve             RunComInHandle                 End   Sub     Private   Sub   Form_Unload(Cancel   As   Integer)             MSCom

45、m1.PortOpen   =   False             End     End   Sub   If   MSComm1.PortOpen   Then   MSComm1.PortOpen   =   False                             &

46、#160;                           MSComm1.CommPort   =   1     '假定是用COM1口                                        

47、                 '   設(shè)定傳輸速率等,可依照您的需求更改                             MSComm1.Settings   =   "9600,N,8,1"                 &#

48、160;                 MSComm1.PortOpen   =   True                             '-初始化Modem-                   MSComm1.Output   =

49、  "ATZ"                   MSComm1.Output   =   "AT&F"                   MSComm1.Output   =   "ATE0"               &#

50、160;   MSComm1.Output   =   "ATM1"                   MSComm1.Output   =   "ATQ0"                   MSComm1.Output   =   "ATV0"     

51、0;   '-撥號(hào)-     MSComm1.Output   ="ATDT163"       '撥163     '-接通后     MSComm1.Output   ="SDFJDKSJLKFA"       '發(fā)送字符串         '-     Private   Sub  

52、 MSComm1_OnComm()               '用串口事件捕捉數(shù)據(jù).             If   MSComm1.InBufferCount   Then                           '   通訊埠中假如有資料的話,   則讀取進(jìn)來 &

53、#160;                       InStringB   =   InStringB   &   MSComm1.Input                         '   如果資料中有   Chr(13)   和   Chr(10) 

54、0; 的話,   則顯示出來                                   If   InStr(InStringB,   vbCrLf)   Then                               &#

55、160;           instring   =   instring   &   InStringB                                                        

56、                            AddText   Text3,   InStringB,   False                                           &#

57、160;                                         InStringB   =   ""                                 

58、0; End   If                           End   If     END   SUB         '-掛斷-     MSComm1.PortOpen   =   False         '這個(gè)掛斷方法不能適用所有MODEM,我正在研究.通

59、用辦法實(shí)現(xiàn)16進(jìn)制接收實(shí)質(zhì)就是按2進(jìn)制接收 設(shè)置MSComm控件的屬性InputMode = comInputModeBinary '二進(jìn)制接收 接收后由HEX函數(shù)轉(zhuǎn)為16進(jìn)制字符串形式顯示 Option Explicit Dim strData As String Dim bytInput() As Byte Private Sub MsComm1_OnComm() Dim intInputLen As Integer Select Case Me.MSComm2.CommEvent Case comEvReceive '此處添加處理接收的代碼 MSComm1.InputMo

60、de = comInputModeBinary '二進(jìn)制接收 intInputLen = MSComm1.InBufferCount ReDim bytInput(intInputLen) bytInput = MSComm1.Input jieshou End Select End Sub Public Function jieshou() '接收數(shù)據(jù)處理為16進(jìn)制 Dim i As Integer For i = 0 To UBound(bytInput) If Len(Hex(bytInput(i) = 1 Then strData = strData & &qu

61、ot;0" & Hex(bytInput(i) Else strData = strData & Hex(bytInput(i) End If Next Text1 = strData End Function Private Sub Form_Load() MSComm1.CommPort = 1 MSComm1.InBufferSize = 1024 MSComm1.OutBufferSize = 512 MSComm1.Settings = "9600,n,8,1" MSComm1.PortOpen = True Text1 = "

62、" End Sub接受 Buffer = MSComm1.Input ' 接收一個(gè)二進(jìn)制數(shù)據(jù) Arr(0) = AscB(Buffer) '存入到二進(jìn)制數(shù)組數(shù)組中 Receive_Count_Byte = Receive_Count_Byte + 1 Real_Receive = Arr(0) ' Text1.Text = Text1.Text & Real_Receive & " " '接收的數(shù)據(jù)顯示到文本框中一個(gè)server端 Private Sub Command1_Click() End End Sub Pr

63、ivate Sub Command2_Click() Winsockserver.SendData Text4.Text + ":" + textsend.Text textget.Text = textget.Text + vbCrLf + Text4.Text + ":" + textsend.Text + " " + Str(Time) textsend.Text = "" End Sub Private Sub Form_Load() Command2.Visible = False textsend.Vi

64、sible = False Text4.Visible = False textget.Visible = False Label1.Visible = False Winsockserver.LocalPort = 1001 Winsockserver.Listen End Sub Private Sub textsend_Change() 'Winsockserver.SendData textsend.text End Sub Private Sub textsend_KeyPress(KeyAscii As Integer) 'If KeyAscii = 13 Then

65、 'Winsockserver.SendData textsend.text 'textsend.text = "" If KeyAscii = 13 Then Winsockserver.SendData textsend.Text ' Text1.text = Text1.text + vbCrLf + Text4.text + ": " + Text2.text + " " + Str(Time) textsend.Text = "" End If End Sub Private Su

66、b Timer1_Timer() If Text4.Text = "" Then Text4.Text = "no name" End Sub Private Sub Winsockserver_Close() Winsockserver.Close End End Sub Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long) Command2.Visible = True textsend.Visible = True textget.Visible = True Te

67、xt4.Visible = True Label1.Visible = True If Winsockserver.State <> sckClosed Then Winsockserver.Close Winsockserver.Accept requestID End Sub Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As String Winsockserver.GetData tmpstr 'textget.text = textget + tmpstr +

68、textsend textget.Text = textget.Text + vbCrLf + tmpstr + " " + Str(Time) End Sub '(1)Command1:退出按鈕; '(2)textsend:發(fā)送數(shù)據(jù)文本框; '(3)Winsockserver: 服務(wù)器Winsock; '(4)textget :接收數(shù)據(jù)文本框。 一個(gè)client端 Private Sub Command1_Click() End End Sub Private Sub Command2_Click() On Error Resume Nex

69、t Winsockclient.RemoteHost = Text1.Text Winsockclient.Connect End Sub Private Sub Command3_Click() Winsockclient.SendData Text4.Text + ":" + textsend.Text textget.Text = textget.Text + vbCrLf + Text4.Text + ":" + textsend.Text + " " + Str(Time) textsend.Text = "&qu

70、ot; End Sub Private Sub Form_Load() Command3.Visible = False textsend.Visible = False Text4.Visible = False textget.Visible = False Label2.Visible = False Label3.Visible = False Command2.Enabled = True Winsockclient.RemoteHost = "11" Winsockclient.RemotePort = 1001 Winsockclient

71、.RemoteHost = "sccdsz" End Sub Private Sub Text1_Change() Command2.Enabled = True 'Winsockclient.RemoteHost = Text1.Text End Sub Private Sub textsend_Change() 'Winsockclient.SendData textsend.Text End Sub Private Sub textsend_KeyPress(KeyAscii As Integer) 'If KeyAscii = 13 Then

72、 'Winsockclient.SendData textsend.Text 'textsend.Text = "" If KeyAscii = 13 Then Winsockclient.SendData Text4.Text + ":" + textsend.Text textsend.Text = "" 'End If End If End Sub Private Sub Timer1_Timer() On Error Resume Next Winsockclient.Connect Winsockcl

73、ient.RemoteHost = Text1.Text End Sub Private Sub Winsockclient_Close() Winsockclient.Close End End Sub Private Sub winsockclient_Connect() textsend.Visible = True textget.Visible = True Label2.Visible = True Label3.Visible = True Text4.Visible = True Command2.Enabled = True Command2.Visible = True C

74、ommand3.Visible = True End Sub Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long) Dim tmpstr As String Winsockclient.GetData tmpstr textget.Text = textget.Text + vbCrLf + tmpstr + " " + Str(Time) End Sub '(1)Command1:退出按鈕; '(2)Command2:連接按鈕; '(3)Winsockclient:客戶Win

75、sock; '(4)Text1:主機(jī)名文本框; '(5)Textsend:發(fā)送數(shù)據(jù)文本框; '(6)Textget:接收數(shù)據(jù)文本框; 客戶機(jī)程序的界面如圖所示。送數(shù)據(jù),然后在另外一個(gè)過程里實(shí)時(shí)檢測(cè)此串行口以便一旦此串行口的發(fā)送緩沖區(qū)有數(shù)據(jù)就顯示消息,如果發(fā)送空數(shù)據(jù)就會(huì)顯示 "無數(shù)據(jù)的字樣 "。界面如下: <IMG onerror= "this.src='/book/UploadPic/2007-1/20071122959301.jpg' " hspace=3 src= "/book/UploadPi

76、c/2007-1/20071122959301.jpg " align=center vspace=1 border=1> 主要核心代碼如下: Private Sub Command1_Click() If Text1.Text = " " Then List1.AddItem "發(fā)送緩沖區(qū)無數(shù)據(jù) " Exit Sub End If MSComm1.Output = Text1.Text End Sub Private Sub Command2_Click() Unload Me End Sub '主要進(jìn)行串口的初始化 Priva

77、te Sub Form_Load() '選擇com1 MSComm1.CommPort = 1 '設(shè)置波特率為9.6kpbs,沒有奇偶校驗(yàn),8位數(shù)據(jù)位,1位結(jié)束位 MSComm1.Settings = "9600,N,8,1 " '讀取全部的輸入緩沖區(qū) MSComm1.InputLen = 0 '端口打開 MSComm1.PortOpen = True MSComm1.RThreshold = 10 MSComm1.SThreshold = 10 '以下就可以進(jìn)行數(shù)據(jù)的發(fā)送了 End Sub '所有的通訊事件都可以激發(fā)MSCo

78、mm1控件的OnComm事件 Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent Case comEvReceive '此處的代碼可以進(jìn)行當(dāng)串口的接受緩沖區(qū)里有RThreshold個(gè)字符的處理 Case comEvSend '此處的代碼可以進(jìn)行當(dāng)串口的發(fā)送緩沖區(qū)里有SThreshold個(gè)字符的處理 List1.AddItem "發(fā)送緩沖區(qū)有數(shù)據(jù) " End Select End Sub急!求助:vb串口通信我的串口數(shù)據(jù)傳送顯示總是有問題:提示數(shù)據(jù)類型不匹配或者就沒有數(shù)據(jù)顯示出來請(qǐng)各位大俠幫幫忙

79、??!Dim var As VariantPrivate Sub Comm1_OnComm()Select Case Comm1.CommEventCase comEvReceive  var = Hex(Asc(Comm1.Input) Text1.Text = Text1.Text + var + " "End SelectEnd SubPrivate&#

80、160;Sub Form_Load()'a = 123 Text2.Text = "Comm1.CommPort = 1"Comm1.CommPort = 1Comm1.Settings = "1200,N,8,1"Comm1.InputMode = comInputModeBinaryComm1.InputLen = "0"Comm1.InBufferSize

81、0;= 1024Comm1.OutBufferSize = 512Comm1.PortOpen = TrueComm1.SThreshold = 0Comm1.RThreshold = 1Comm1.InBufferCount = 0Comm1.OutBufferCount = 0End Sub   回復(fù)內(nèi)容【zdingyun】:Private Sub MSComm1_OnComm()  

82、;  On Error Resume Next    Dim BytesReceived() As Byte    Dim buffer As String    Dim HData As String    Dim i As Integer  &#

83、160; Select Case MSComm1.CommEvent        Case comEvReceive               '接收十六進(jìn)制數(shù)據(jù)。并以十六進(jìn)制顯示           

84、60;MSComm1.InputLen = 0            buffer = MSComm1.Input                  '接收數(shù)據(jù)至字符串中       

85、;     BytesReceived() = buffer                '將數(shù)據(jù)轉(zhuǎn)入Byte數(shù)組中            For i = 0 To UBound(Bytes

86、Received)      '顯示結(jié)果以十六進(jìn)制顯示                If Len(Hex(BytesReceived(i) = 1 Then              

87、60;     HData = HData & "0" & Hex(BytesReceived(i)                Else             

88、;       HData = HData & Hex(BytesReceived(i)                End If               

89、 Text1.Text = HData                '最后將結(jié)果后入Text1中                MSComm1.OutBufferCount = 0   &#

90、160;  '清除發(fā)送緩沖區(qū)                MSComm1.InBufferCount = 0       '清除接收緩沖區(qū)            Next  

91、;  End SelectEnd Sub【snowwindrainbow】:這位大俠太謝謝了!不過我還有些問題不大明白:BytesReceived這個(gè)數(shù)組是用來限制接收到的數(shù)據(jù)的個(gè)數(shù)的嗎? Len(Hex(BytesReceived(i) = 1 是用來做什么的???為何我只能接收到前面?zhèn)€數(shù)據(jù)呢后面的就沒有顯示了啊?【zdingyun】:16進(jìn)制顯示是按00-FF顯示的,當(dāng)Byte數(shù)值在0-15時(shí),得到16進(jìn)制數(shù)為0-F,采用下句判斷:Len(Hex(BytesReceived(i) = 1使得到

92、的0-F變?yōu)?0-0F為何我只能接收到前面?zhèn)€數(shù)據(jù),檢查下位機(jī)一次發(fā)送數(shù)據(jù)字節(jié)長度.將MSComm控件屬性RThreshold 設(shè)置為下位機(jī)一次發(fā)送數(shù)據(jù)字節(jié)長度【of123】:Dim var As VariantDim tmp() As Byte, i As LongPrivate Sub Comm1_OnComm()  Select Case Comm1.CommEvent    Case

93、0;comEvReceive       var = Comm1.Input       tmp = var       For i = 0 To Ubound(tmp)         Text1.Text&

94、#160;= Text1.Text + Right("0" & Hex(tmp(i), 2) + " "       Next i  End SelectEnd Sub【of123】:Comm1.InputLen = 0    '"0"為何我只能接收到前

95、面?zhèn)€數(shù)據(jù)呢后面的就沒有顯示了?。恳?yàn)槟阍O(shè)置了 Comm1.RThreshold = 1,在接收到第一個(gè)字節(jié)時(shí)事件就觸發(fā)了。PC 的處理速度遠(yuǎn)大于串口傳輸速度,后面的數(shù)據(jù)還沒有傳過來。解決的方法:1 如果你的下位機(jī)傳輸?shù)臄?shù)據(jù)長度固定,可以將 Comm1.RThreshold 按樓上所述設(shè)置。2 如果數(shù)據(jù)長度不確定,可以延時(shí)足夠長度再取數(shù)據(jù)。缺點(diǎn)是短數(shù)據(jù)也要等較長時(shí)間。3 更改你的傳輸協(xié)議,數(shù)據(jù)打包,也就是在數(shù)據(jù)前附加包起始標(biāo)志和包長度字段(包頭)。接收端 InputLen 先設(shè)置為包頭長度,得到數(shù)據(jù)長度后,重新設(shè)置 InputLen 并循環(huán)檢查接收緩沖區(qū)當(dāng)前接收到的數(shù)據(jù)長度 InBufferCount,達(dá)到預(yù)期值后開始從 Input 取數(shù)據(jù)。比較完備的還要設(shè)置超時(shí),防止死循環(huán);以及協(xié)議包尾校驗(yàn)碼,檢查數(shù)據(jù)傳輸錯(cuò)誤?!緎nowwindrainbow】:另外還有一個(gè)問題,我從串口接收到的數(shù)據(jù)怎樣轉(zhuǎn)存到一個(gè)數(shù)組里面去啊然后在另外一個(gè)窗體里面顯示出來啊【snowwindrainbow】:我接收到的數(shù)據(jù)是11位的,那Comm1.RThreshold

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論