




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 新能源企業(yè)股權(quán)轉(zhuǎn)讓及技術(shù)轉(zhuǎn)化擔(dān)保合同范本
- 股票質(zhì)押貸款合同示范文本
- 上市公司股份大宗轉(zhuǎn)讓與合規(guī)性審查合同
- 購買二手車過戶手續(xù)辦理合同
- 油田優(yōu)化措施方案模板
- 車床設(shè)備故障排除方案
- 瓶裝燃?xì)獗ㄕ{(diào)查方案
- 燃?xì)獗ǚ课葙r償方案
- 房屋托管養(yǎng)護(hù)方案(3篇)
- 臨時(shí)店面拆遷補(bǔ)償方案
- 《SLT 582-2025水工金屬結(jié)構(gòu)制造安裝質(zhì)量檢驗(yàn)檢測(cè)規(guī)程》知識(shí)培訓(xùn)
- 【百強(qiáng)?!俊竞诩|卷】黑龍江省哈爾濱市第三中學(xué)2025年高三學(xué)年第一次模擬考試(哈三中一模)語文試卷
- 水廠維修工程施工方案
- 西藏幼教筆試題庫及答案
- 2025年人教遼寧版八年級(jí)語文下冊(cè) 第二學(xué)期 期末測(cè)試卷
- DB12T 1379-2024生豬規(guī)模養(yǎng)殖場(chǎng)消毒技術(shù)規(guī)范
- 統(tǒng)編版語文一年級(jí)上冊(cè)新教材解讀及教學(xué)建議 課件
- 醫(yī)學(xué)教材 ACAF技術(shù)手術(shù)器械的準(zhǔn)備與圍手術(shù)期處理
- 《核輻射防護(hù)原理》課件
- 托養(yǎng)中心培訓(xùn)
- 2025年山西晉能控股裝備制造集團(tuán)招聘筆試參考題庫含答案解析
評(píng)論
0/150
提交評(píng)論