2013-04-20 33 views
0
  1. 我想通過MSComm控件端口來發送和接收數據,但我收到的數據類型mismatch.so我應該怎麼做才能避免這個錯誤,我需要發送數據作爲整數,並儘可能接收它作爲字符串,至少我應該把它作爲整數數據類型。以下是我的代碼,請幫我解決這個問題。我要發送數據和接收數據的字符串,如果可能的,或者至少是整數

  2. 獨立運行時,發送和接收代碼正在工作。

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Private Sub Command1_Click() 
    If (MSComm1.PortOpen = False) Then 
     MSComm1.PortOpen = True 
    End If 
    Command1.Enabled = False 
    Command2.Enabled = True 
    Text3.Text = "COM1, Baud - 9600, Databit - 8, Parity - None, Stopbit - 1....CONNECTED." & Text3.Text 
End Sub 

Private Sub Command2_Click() 
    If (MSComm1.PortOpen = True) Then 
     MSComm1.PortOpen = False 
    End If 
    Command1.Enabled = True 
    Command2.Enabled = False 
    Text3.Text = "DISCONNECTED" & Text3.Text 
End Sub 

Private Sub Command3_Click() 
    Text1.Text = " " 
    Text2.Text = " " 
    Text3.Text = "CLEARED" & Text3.Text 
End Sub 

Private Sub Command4_Click()  
    MSComm1.Output = Text2.Text 
    Text3.Text = "SENDING" & Text3.Text 
End Sub 

Private Sub Command5_Click() 
    Text3.Text = " " 
End Sub 

Private Sub Form_Load() 
    MSComm1.CommPort = 1 
    MSComm1.Settings = "9600,N,8,1" 
    MSComm1.DTREnable = True 
    MSComm1.Handshaking = comRTS 
    MSComm1.InBufferSize = 2 
    MSComm1.RThreshold = MSComm1.InBufferSize 
    MSComm1.RTSEnable = True 
    MSComm1.InputLen = 2 
    MSComm1.InputMode = comInputModeText 
    MSComm1.NullDiscard = True 
    MSComm1.OutBufferSize = 2 
    MSComm1.SThreshold = MSComm1.OutBufferSize  
    MSComm1.PortOpen = True 
End Sub 

Private Sub Form_Unload(Cancel As Integer) 
    If (MSComm1.PortOpen = True) Then 
     MSComm1.PortOpen = False 
    End If 
End Sub 

Private Sub MSComm1_OnComm() 
    Dim Buffer As String 
    Select Case MSComm1.CommEvent 
     Case comEvReceive 
      'Text1.Text = " " 
      Buffer = Cstr(MSComm1.Input) 
      Text1.Text = Buffer 
    End Select 
End Sub 
+0

ATLEAST告訴我如何不dataype不匹配運行的代碼,以便在接收和發送代碼運行模擬 – user1963933 2013-04-21 04:53:24

+0

我很好,如果我可以發送數據作爲整數,並收到它作爲整數 – user1963933 2013-04-21 04:56:22

+1

哪條線給你的錯誤? – djv 2013-04-22 03:34:24

回答

0

我認爲主要的問題是,你沒有任何企圖傳輸控制asynchroniously發送數據。由於有多個字符需要傳輸,因此您需要告訴接收器新的傳輸在哪裏開始,以便找到正確的偏移量。

在你的情況下,你說你只想發送0到100範圍內的值。通過使用0到255範圍內的單個字節值,可以解決這個問題,因此在這種情況下,每發送一個值發送一個字節就足夠了,而對於單個字符,不需要交換控制。

這裏該號碼轉換爲一個字節,發送和再轉化爲若干個例子:

Option Explicit 
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Private Sub cmdOpen_Click() 
    If (MSComm1.PortOpen = False) Then 
     MSComm1.PortOpen = True 
    End If 
    cmdOpen.Enabled = False 
    cmdClose.Enabled = True 
    txtState.Text = "COM1, Baud - 9600, Databit - 8, Parity - None, Stopbit - 1....CONNECTED." & txtState.Text 
End Sub 

Private Sub cmdClose_Click() 
    If (MSComm1.PortOpen = True) Then 
     MSComm1.PortOpen = False 
    End If 
    cmdOpen.Enabled = True 
    cmdClose.Enabled = False 
    txtState.Text = "DISCONNECTED" & txtState.Text 
End Sub 

Private Sub cmdClear_Click() 
    txtReceived.Text = " " 
    txtSend.Text = " " 
    txtState.Text = "CLEARED" & txtState.Text 
End Sub 

Private Sub cmdSend_Click() 
Dim Number As Byte 
    'some checking - needed depending on source of data 
    If Not IsNumeric(txtSend.Text) Then 
     MsgBox "only numbers (from 0 to 255)" 
     Exit Sub 
    End If 
    If Val(txtSend.Text) < 0 Or Val(txtSend.Text) > 255 Then 
     MsgBox "out of range (from 0 to 255)" 
     Exit Sub 
    End If 

    Number = CByte(Val(txtSend.Text)) 
    MSComm1.Output = Chr(Number) 
    txtState.Text = "SENDING" & txtState.Text 
End Sub 

Private Sub cmdClearState_Click() 
    txtState.Text = " " 
End Sub 

Private Sub Form_Load() 
    MSComm1.CommPort = 1 
    MSComm1.Settings = "9600,N,8,1" 
    MSComm1.DTREnable = True 
    MSComm1.Handshaking = comNone 'comRTS i only got a 3-wire connection - so no handshaking 
    MSComm1.InBufferSize = 1024 'not 2 we don't want a buffer overflow THAT fast 
    MSComm1.RThreshold = 1 'Raise OnComm-Event if 1 character is in Rx-buffer 
    MSComm1.RTSEnable = True 
    MSComm1.InputLen = 1 'get one character at a time 
    MSComm1.InputMode = comInputModeText 'the Binary mode never worked out for me - even when transmitting binary data 
    MSComm1.NullDiscard = False 'also NULL-Characters will be received 
    MSComm1.OutBufferSize = 512 'again we don't want overflow 
    MSComm1.SThreshold = 0 'don't hold back data - blow them out directly 
    MSComm1.PortOpen = True 
End Sub 

Private Sub Form_Unload(Cancel As Integer) 
    If (MSComm1.PortOpen = True) Then 
     MSComm1.PortOpen = False 
    End If 
End Sub 

Private Sub MSComm1_OnComm() 
    Dim Buffer As String 
    Select Case MSComm1.CommEvent 
     Case comEvReceive 
      'txtReceived.Text = " " 
      Buffer = MSComm1.Input 
      txtReceived.Text = Asc(Buffer) 
      txtState.Text = "RX" + txtState.Text 
    End Select 
End Sub 
相關問題