0
  1. mscomm ポート経由でデータを送受信しようとしていますが、データ型の不一致を受信して​​います。このエラーを回避するにはどうすればよいですか。データを整数として送信し、可能であれば文字列として受信する必要があります。最小限、整数として取得する必要があります。データ・タイプ。以下は私のコードです。この問題を解決するのを手伝ってください。

  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
4

1 に答える 1

0

主な問題は、送信制御を試みずに非同期でデータを送信していることだと思います。送信する文字が複数あるため、正しいオフセットを見つけられるように、新しい送信の開始位置を受信者に伝える必要があります。

あなたの場合、0..100 の範囲の値のみを送信したいと言っています。0 から 255 の範囲の 1 バイト値を使用することでアドレス指定できるため、この場合、送信する値ごとに 1 バイトを送信するだけで十分であり、1 文字の送信制御は必要ありません。

数値が 1 バイトに変換され、送信され、数値に再変換される例を次に示します。

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
于 2013-06-10T16:51:45.290 に答える