Vb6 如果可能的话,我希望以字符串的形式发送和接收数据,或者至少以整数的形式发送和接收数据

Vb6 如果可能的话,我希望以字符串的形式发送和接收数据,或者至少以整数的形式发送和接收数据,vb6,port,mscomm32,Vb6,Port,Mscomm32,我试图通过mscomm端口发送和接收数据,但接收到的数据类型不匹配。因此,我应该如何避免此错误,我需要以整数形式发送数据并以字符串形式接收数据(如果可能),至少我应该以整数数据类型获取数据。下面是我的代码,请帮我解决这个问题 发送和接收代码在独立运行时工作 我认为主要的问题是,您正在异步发送数据,而没有尝试传输控制。由于要传输多个字符,您需要告诉接收器新传输从何处开始,以使其找到正确的偏移量 在您的情况下,您说您只希望发送范围为0..100的值。通过使用0到255范围内的单字节值可以寻址,因此在

我试图通过mscomm端口发送和接收数据,但接收到的数据类型不匹配。因此,我应该如何避免此错误,我需要以整数形式发送数据并以字符串形式接收数据(如果可能),至少我应该以整数数据类型获取数据。下面是我的代码,请帮我解决这个问题

  • 发送和接收代码在独立运行时工作


  • 我认为主要的问题是,您正在异步发送数据,而没有尝试传输控制。由于要传输多个字符,您需要告诉接收器新传输从何处开始,以使其找到正确的偏移量

    在您的情况下,您说您只希望发送范围为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
    
    选项显式
    私有声明子睡眠库“kernel32”(ByVal-dwms长度)
    私有子cmdOpen_Click()
    如果(MSComm1.PortOpen=False),则
    MSComm1.PortOpen=True
    如果结束
    cmdOpen.Enabled=False
    cmdClose.Enabled=True
    Text=“COM1,波特-9600,数据位-8,奇偶校验-无,停止位-1…已连接。”&txtState.Text
    端接头
    私有子cmdClose_Click()
    如果(MSComm1.PortOpen=True),则
    MSComm1.PortOpen=False
    如果结束
    cmdOpen.Enabled=True
    cmdClose.Enabled=False
    txtState.Text=“断开连接”&txtState.Text
    端接头
    专用子CMD清除\u单击()
    txtReceived.Text=“”
    txtSend.Text=“”
    txtState.Text=“清除”&txtState.Text
    端接头
    专用子cmdSend_Click()
    作为字节的数字
    '一些检查-需要根据数据源进行检查
    如果不是数字(txtSend.Text),则
    MsgBox“仅限数字(从0到255)”
    出口接头
    如果结束
    如果Val(txtSend.Text)<0或Val(txtSend.Text)>255,则
    MsgBox“超出范围(从0到255)”
    出口接头
    如果结束
    Number=CByte(Val(txtSend.Text))
    MSComm1.Output=Chr(数字)
    txtState.Text=“发送”&txtState.Text
    端接头
    私有子CMD清除状态_单击()
    txtState.Text=“”
    端接头
    专用子表单_加载()
    MSComm1.CommPort=1
    MSComm1.Settings=“9600,N,8,1”
    MSComm1.DTREnable=True
    MSComm1.Handshaking=comNone'comrs我只有3线连接,所以没有握手
    MSComm1.InBufferSize=1024'不是2我们不希望缓冲区溢出那么快
    MSComm1.RThreshold=1'如果接收缓冲区中有1个字符,则引发OnComm事件
    MSComm1.RTSEnable=True
    MSComm1.InputLen=1'一次获取一个字符
    MSComm1.InputMode=comInputModeText“即使在传输二进制数据时,二进制模式对我来说也不起作用
    MSComm1.NullDiscard=False'也将接收空字符
    MSComm1.exputffersize=512'同样,我们不希望溢出
    MSComm1.streshold=0'不保留数据-直接将其吹出
    MSComm1.PortOpen=True
    端接头
    私有子表单_卸载(取消为整数)
    如果(MSComm1.PortOpen=True),则
    MSComm1.PortOpen=False
    如果结束
    端接头
    私有子MSComm1_OnComm()
    将缓冲区设置为字符串
    选择Case MSComm1.CommEvent
    案件受理
    'txtReceived.Text=“”
    缓冲区=MSComm1.Input
    txtReceived.Text=Asc(缓冲区)
    txtState.Text=“RX”+txtState.Text
    结束选择
    端接头
    
    至少告诉我如何在没有数据类型不匹配的情况下运行代码,以便接收和发送代码都能模拟运行。如果我可以以整数形式发送数据并以整数形式接收数据,我会很好。这行代码会给出错误?Buffer=Cstr(MSComm1.Input)您的代码看起来适合读写文本。您是否同时存在Tx和Rx的并发问题?如果是这样,您需要设置某种信号量,这样您就不会同时尝试r/w comm资源。
    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