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