|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
很奇怪的通信問題 |
| 作者:云開霧散 欄目:驅(qū)動編程 |
做了一個(gè)單片機(jī)和PC機(jī)通信的程序,在WIN2000下可以正常通信,在XP下單片機(jī)可以接收到來自PC的控制字,并發(fā)出數(shù)據(jù),可是VB程序中卻收不到來自于單片機(jī)的數(shù)據(jù)。 把源程序發(fā)來大家?guī)兔纯,在最奇怪的是,在XP下我以前也能正常通信,可現(xiàn)在它死活沒反應(yīng) Option Explicit Private Sub CMDclose_Click() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If Label5.Caption = "串口關(guān)閉" MSComm1.InBufferCount = 0 End Sub Private Sub CMDclr_Click() TextPOW1.Text = "" TextPOW2.Text = "" TextPOW3.Text = "" TextPOW4.Text = "" End Sub Private Sub CMDquit_Click() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If End End Sub Private Sub Combo1_Click() Dim OldPort As Integer, NEWPORT As Integer On Error Resume Next OldPort = MSComm1.CommPort NEWPORT = Combo1.ListIndex + 1 If OldPort <> NEWPORT Then MSComm1.PortOpen = False End If MSComm1.CommPort = NEWPORT If MSComm1.PortOpen = 1 Then MsgBox "該串口已用,請選擇其它端口" End If End Sub Private Sub Form_Load() Dim i As Integer If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If Me.Show BackColor = RGB(55, 175, 0) ForeColor = RGB(0, 0, 255) FontName = "楷體_GB2312" FontSize = 15 FontBold = True CurrentX = 1300 CurrentY = 350 Print "MIC 數(shù)據(jù)采集系統(tǒng)" For i = 1 To 4 Combo1.AddItem "COM" & i Next i With MSComm1 .InputLen = 0 '一次讀完全部緩沖區(qū) .InBufferCount = 0 '清除接收緩沖區(qū) .OutBufferCount = 0 '清除發(fā)送緩沖區(qū) .SThreshold = 1 '發(fā)送緩沖區(qū)為空時(shí)發(fā)送 .RThreshold = 16 '每接到16個(gè)數(shù)據(jù)就觸發(fā)ONCOMM事件 Label4.Caption = MSComm1.Settings End With End Sub Private Sub Form_Unload(Cancel As Integer) End End Sub Private Sub CMDopen_Click() Dim outputhex(1) As Byte Dim outhex As Integer Dim outhex1 As Integer Dim i As Integer Dim j As Integer i = 0 j = 0 With MSComm1 If MSComm1.PortOpen = False Then MSComm1.PortOpen = True End If While i < Len(Trim(TextCMD.Text)) outhex = str_int(Mid(TextCMD.Text, i + 1, 1)) If outhex = -1 Then MsgBox "輸入錯(cuò)誤" End If outhex = outhex * 16 outhex1 = str_int(Mid(TextCMD.Text, i + 2, 1)) If outhex = -1 Then MsgBox "輸入錯(cuò)誤" End If outputhex(j) = outhex + outhex1 i = i + 2 j = j + 1 MSComm1.Output = outputhex() Wend .InBufferCount = 0 '清空接收緩沖區(qū) .RThreshold = 16 End With End Sub Function str_int(a As String) As Integer SELECT Case a Case "0" To "9" str_int = Asc(a) - Asc("0") '48 Case "A" To "F" str_int = Asc(a) - 55 ' 55 Case "a" To "f" str_int = Asc(a) - 87 ' 87 Case Else str_int = -1 End SELECT End Function Private Sub MSComm1_OnComm() Dim BYIN() As Byte Dim ds(16) As Integer Dim POSNEG(16) As Integer Dim R1 As SINGLE Dim R2 As SINGLE Dim R3 As SINGLE Dim R4 As SINGLE Dim R5 As SINGLE Dim R6 As SINGLE Dim R7 As SINGLE Dim R8 As SINGLE Dim bufPOW1$, bufPOW2$, bufPOW3$, bufPOW4$ bufPOW1 = "" bufPOW2 = "" bufPOW3 = "" bufPOW4 = "" With MSComm1 SELECT Case .CommEvent Case comEvReceive Label5.Caption = "端口打開" + vbCr + "正在接收---" On Error Resume Next Dim i As Integer BYIN = Trim(MSComm1.Input) POSNEG(0) = 1 POSNEG(1) = 1 POSNEG(2) = 1 POSNEG(3) = 1 POSNEG(4) = 1 POSNEG(5) = 1 POSNEG(6) = 1 POSNEG(7) = 1 POSNEG(8) = 1 POSNEG(9) = 1 POSNEG(10) = 1 POSNEG(11) = 1 POSNEG(12) = 1 POSNEG(13) = 1 POSNEG(14) = 1 POSNEG(15) = 1 For i = 0 To 15 ds(i) = BYIN(i) If ds(i) >= 240 Then ds(i) = ds(i) - 240 POSNEG(i) = -1 End If ds(i) = (ds(i) \ 16) * 10 + ds(i) - (ds(i) \ 16) * 16 Next i R1 = ds(0) + ds(1) / 100 R2 = POSNEG(2) * (ds(2) + ds(3) / 100) R3 = ds(4) + ds(5) / 100 R4 = POSNEG(6) * (ds(6) + ds(7) / 100) R5 = ds(8) + ds(9) / 100 R6 = POSNEG(10) * (ds(10) + ds(11) / 100) R7 = ds(12) + ds(13) / 100 R8 = POSNEG(14) * (ds(14) + ds(15) / 100) bufPOW1 = bufPOW1 + CStr(R1) + "MW" + " " + CStr(R2) + "DBM" + vbCrLf TextPOW1.Text = bufPOW1 bufPOW2 = bufPOW2 + CStr(R3) + "MW" + " " + CStr(R4) + "DBM" + vbCrLf & |
| 2樓: | >>參與討論 |
| 作者: bluefancy 于 2005/1/10 8:54:00 發(fā)布:
大致看了你的程序,有一點(diǎn)不太理解, 為什么你每次都要用 .InBufferCount = 0 清空接收緩沖區(qū),其實(shí)你設(shè)置.InputLen = 0 后,每次讀緩沖區(qū),就清空了,你如果.InBufferCount = 0 ,就說明接受緩沖區(qū)是空的,你把.InBufferCount 改成1024就應(yīng)該可以了, 還不行,還可以和我聯(lián)系! QQ:10509134 你說的那個(gè)程序不是什么串口調(diào)試串口的程序,是我臨時(shí)自己寫的一個(gè)簡單的小例子,只有三五行示范了一下。我重裝機(jī)器以后,沒裝VB,所以現(xiàn)在也沒法發(fā)給你,其實(shí)也沒什么用,你要想看也可以看看MISSWANG還有嗎 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |