'-----------------------------------------------------
'发送区
'-----------------------------------------------------
Public Function SendData(ByRef bytData() As Byte) As Long
On Error Resume NextMSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.Output = bytData '发送数据Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
MSComm1.OutBufferCount = 0
'-----------------------------------------------------
'接收区
'-----------------------------------------------------
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As String
Dim strData As Variant
Dim i As Integer
Dim x As Integer
Select Case MSComm1.CommEvent
Case 2
MSComm1.Settings = "19200,M,8,2"
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = 0 & Hex(BytReceived(i))
Else
strData = Hex(BytReceived(i))
End If
Next
Text1.Text = Text1.Text
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
End Select
End Sub'---------------------------------------
'发送数据
'---------------------------------------
Private Sub cmdConnect_Click()Dim bytData1(0) As Byte
Dim bytData(21) As Byte
Dim i As Integer
MSComm1.CommPort = 1 'COM端口
MSComm1.Settings = "19200,m,8,2"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.SThreshold = 1 '如果传输缓冲区完全空时产生MSComm事件
MSComm1.RThreshold = 1 '不产生MSComm事件
MSComm1.PortOpen = True '打开端口bytData1(0) = 8
bytData(20) = 8
bytData(21) = 128
For i = 1 To 19
bytData(i) = 0
Next
MSComm1.Settings = "19200,m,8,2" '改变奇偶校验
Call SendData(bytData1) '发送
MSComm1.Settings = "19200,s,8,2" '改变奇偶校验
Call SendData(bytData) '发送
End Sub
当我改变MSComm1.Settings 值后发送没问题,硬件收到信息。可是接收到的数据全部都是3F,我代码全部在这里。请问我的问题出的哪里?该如何解决。解决后100分。不给是小狗
'发送区
'-----------------------------------------------------
Public Function SendData(ByRef bytData() As Byte) As Long
On Error Resume NextMSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.Output = bytData '发送数据Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
MSComm1.OutBufferCount = 0
'-----------------------------------------------------
'接收区
'-----------------------------------------------------
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As String
Dim strData As Variant
Dim i As Integer
Dim x As Integer
Select Case MSComm1.CommEvent
Case 2
MSComm1.Settings = "19200,M,8,2"
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = 0 & Hex(BytReceived(i))
Else
strData = Hex(BytReceived(i))
End If
Next
Text1.Text = Text1.Text
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
End Select
End Sub'---------------------------------------
'发送数据
'---------------------------------------
Private Sub cmdConnect_Click()Dim bytData1(0) As Byte
Dim bytData(21) As Byte
Dim i As Integer
MSComm1.CommPort = 1 'COM端口
MSComm1.Settings = "19200,m,8,2"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.SThreshold = 1 '如果传输缓冲区完全空时产生MSComm事件
MSComm1.RThreshold = 1 '不产生MSComm事件
MSComm1.PortOpen = True '打开端口bytData1(0) = 8
bytData(20) = 8
bytData(21) = 128
For i = 1 To 19
bytData(i) = 0
Next
MSComm1.Settings = "19200,m,8,2" '改变奇偶校验
Call SendData(bytData1) '发送
MSComm1.Settings = "19200,s,8,2" '改变奇偶校验
Call SendData(bytData) '发送
End Sub
当我改变MSComm1.Settings 值后发送没问题,硬件收到信息。可是接收到的数据全部都是3F,我代码全部在这里。请问我的问题出的哪里?该如何解决。解决后100分。不给是小狗
Me.MSComm1.CommPort = 2
Me.MSComm1.PortOpen = True
Me.MSComm1.RThreshold = 1
End SubPrivate Sub MSComm1_OnComm()
On Error Resume Next
Dim BytesReceived() As Byte
Dim buffer As String
Dim HData As String
Dim i As Integer
'Me.Timer2.Enabled = False
MSComm1.Settings = "19200,m,8,2" '改变MSComm.Settings值
DoEvents
Select Case MSComm1.CommEvent
Case comEvReceive '接收十六进制数据。并以十六进制显示
If MSComm1.InBufferCount <= 0 Then
Me.Timer2.Enabled = True
Exit Sub
End If
'MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeBinary '设置当前以二进制数接收数据
buffer = MSComm1.Input '接收数据至字符串中
BytesReceived() = buffer '将数据转入BYTE中
For i = 0 To UBound(BytesReceived) '显示结果以十六进制显示
If Len(Hex(BytesReceived(i))) = 1 Then
HData = HData & "0" & Hex(BytesReceived(i))
Else
HData = HData & Hex(BytesReceived(i))
End If
Text1.Text = HData '最后将结果后入Text1中
MSComm1.OutBufferCount = 0 '清除发送缓冲区
MSComm1.InBufferCount = 0 '清除接收缓冲区
Next
End Select
'Me.Timer2.Enabled = TrueEnd SubPrivate Sub Timer1_Timer()
On Error Resume Next
'Me.Timer1.Enabled = False
Dim bytData1(0) As Byte
Dim bytData(21) As Byte
Dim i As Integer
bytData1(0) = 9
bytData(0) = 3
bytData(20) = 12
bytData(21) = 136
MSComm1.Settings = "19200,m,8,2"
Call SendData(bytData1) '发送命令
MSComm1.Settings = "19200,s,8,2"
Call SendData(bytData)
'Me.Timer1.Enabled = True
End Sub
Public Function SendData(ByRef bytData() As Byte) As Long
On Error Resume NextMSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.Output = bytData '发送数据Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
MSComm1.OutBufferCount = 0 '清空发送缓冲区
End Function
'以下是我的自动接收.10/MS
Private Sub Timer2_Timer()
'Me.Timer2.Enabled = True
End Sub
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
MSComm1.OutBufferCount = 0
这些代码不要,也没问题吧,
我以前也用过,用这个话,CUP用的很多的
到这里是我用监视看strBuff显示的是一个问题,我监视MSComm1.Input中的值是63(这63是十进制的转十六进制后就是3F),而且我发送任何值出去返回来的都是3F.感到很奇怪.
'发送区
Public Function SendData(ByRef bytData() As Byte) As Long
On Error Resume Next
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.Output = bytData '发送数据
Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
MSComm1.OutBufferCount = 0
End Function
'增加Form_Load事件,将cmdConnect_Click事件中的部分代码移到Form_Load事件中,以避免串口多次打开错误
Private Sub Form_Load()
MSComm1.CommPort = 1 'COM端口
MSComm1.Settings = "19200,m,8,2"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.SThreshold = 1 '如果传输缓冲区完全空时产生MSComm事件
MSComm1.RThreshold = 1 '不产生MSComm事件
MSComm1.PortOpen = True '打开端口
End Sub'接收区
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As String
Dim strData As String
Dim i As Integer
Dim x As Integer
Select Case MSComm1.CommEvent
Case 2
MSComm1.Settings = "19200,M,8,2"
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i)) '此行修改
Else
strData = strData & Hex(BytReceived(i)) '此行修改
End If
Next
Text1.Text = strData '此行修改,原Text1.Text = Text1.Text
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
End Select
End Sub'---------------------------------------
'发送数据
Private Sub cmdConnect_Click()
Dim bytData1(0) As Byte
Dim bytData(21) As Byte
Dim i As Integer
bytData1(0) = 8
bytData(20) = 8
bytData(21) = 128
For i = 1 To 19
bytData(i) = 0
Next
MSComm1.Settings = "19200,m,8,2" '改变奇偶校验
Call SendData(bytData1) '发送
MSComm1.Settings = "19200,s,8,2" '改变奇偶校验
Call SendData(bytData) '发送
End Sub
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.Output = bytData '发送数据Do
DoEvents ;**********
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
MSComm1.OutBufferCount = 0;--------------------------------------------------------------MSComm1.Settings = "19200,m,8,2" '改变奇偶校验
Call SendData(bytData1) '发送
MSComm1.Settings = "19200,s,8,2" '改变奇偶校验*******
Call SendData(bytData) '发送
我的硬件是这样设置的.一条记录一共有23组数据.第一组数据以19200,M,8,2发送.后面的22组以19200,S,8,2发送.发完一条数据后下面的硬件会返回来一个值以确定这条数据是否正确.现在的问题是我发给硬件这条数据硬件给出反映提示已连接上.返回来一个值.可是这个返回来的值都是3F.我感觉到很郁闷.我在想是否我的接收数据有问题?还是我的Timer控件有问题?我Timer控件设置的是1秒发一条数据.
请参阅上述网址下本人2007-3-8 18:20:24 及2007-3-8 18:21:34 的答复的代码,调试正常的简化串口调试精灵代码,用16进制编写命令于txtSend。运行它来观察返回的命令究竟是否符合要求。
看看zdingyun的代码应该是正确的.
用Timer1发送数据,可是接收时我必须把奇偶改回19200,M,8,2
正如上面所说windows是多线程工作。当我在收数据时同时也在发数据,而发数据可能会改成19200,S,8,2所以就出现了所谓的3F现象。现在我要控制的问题是当我在接收数据时Timer1一定不能发数据。
可是这个时间我怎么就是控制不住。
有办法吗?
如果我要隔一段时间发送一条数据给硬件当前与它连接。
如果不用Timer控件。用什么处理最合适???
TIMER控件的Enabled 在 False 和 True 间交替改变。
此种用法需增加1TIMER控件,将其属性Interval设置在30000左右,用于自动卸载通讯窗体模块。在其它的主窗体再用代码提及通讯窗体的任一控件属性来加载到内存。这样做的目的是避免接收出错而程序死,以保证通信正常。
Dim bytData(21) As Byte
Dim i As Integer
bytData1(0) = 8
bytData(20) = 8
bytData(21) = 128MSComm1.Settings = "19200,m,8,2"
Call SendData(bytData1) '发送命令
MSComm1.Settings = "19200,s,8,2"
Call SendData(bytData)End Sub
'********Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As String
Dim strData As Variant
Dim i As Integer Select Case MSComm1.CommEvent
Case 2
MSComm1.Settings = "19200,M,8,2" MSComm1.InputLen = 0 '读取缓冲区中所有字符
strBuff = MSComm1.Input
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = 0 & Hex(BytReceived(i))
Else
strData = Hex(BytReceived(i))
End If
Next
Text1.Text = Text1.Text & " " & strData & vbCrLf
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
End Select
End Sub我没有用TIMER控件控制为什么结果还是3F呢?真的把我急死了
请会的朋友帮帮我。一个人开发不容易啊。而且我刚刚上岗不久。先谢谢了。解决了一定给分
没有使用握手协议
我发送一条数据给硬件是一个数组。这数组中有23个元素。
第一个元素以19200,M,8,2发送以后的22个元素以19200,S,8,2发送。发送完之后硬件会在10豪秒之内传回一个值。传回来的值以19200,M,8,2接收。这个值是一个十六进制数。别的就没有了。能给我写段代码吗?非常感谢。我是一对一的通信(就是计算机串口直接对一台设备设置)。速度应该很快。
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As String
Dim strData As String
Dim i As Integer
Dim x As Integer
Select Case MSComm1.CommEvent
Case 2
MSComm1.Settings = "19200,M,8,2"
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = "0" & Hex(BytReceived(i)) '此行修改
Else
strData = Hex(BytReceived(i)) '此行修改
End If
Next
'增加判别代码
If strData = "0F" Or strData = "F0" Then
Text1.Text = Text1.Text & " " & strData & vbCrLf
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
Else
End If
End Select
End Sub
'发送区
'-----------------------------------------------------
Public Function SendData(ByRef bytData() As Byte) As Long
On Error Goto ErrHandlerMSComm1.Output = bytData '发送数据Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
SendData = 0
Exit FunctionErrHandler:
SendData = Err.Number
End Function'-----------------------------------------------------
'接收区
'-----------------------------------------------------
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As Variant
Dim i As Integer
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input '必须用 Variant 变量接收二进制值
'否则中文系统将其改为“?”= Chr(&H3F)
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
Text1.Text = Text1.Text & " " Right("0" & Hex(BytReceived(i),2)
Next
End Select
End Sub'---------------------------------------
'发送数据
'---------------------------------------
Private Sub cmdConnect_Click()Dim bytData1(0) As Byte
Dim bytData(21) As Byte
Dim i As Integer
MSComm1.CommPort = 1 'COM端口
MSComm1.Settings = "19200,m,8,2"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.SThreshold = 1 '如果传输缓冲区完全空时产生MSComm事件
MSComm1.RThreshold = 1 '不产生MSComm事件bytData1(0) = 8
bytData(20) = 8
bytData(21) = 128
For i = 1 To 19
bytData(i) = 0
NextMSComm1.Settings = "19200,m,8,2" '改变奇偶校验
MSComm1.PortOpen = True '打开端口
Call SendData(bytData1) '发送
MSComm1.PortOpen = False '关闭端口
MSComm1.Settings = "19200,s,8,2" '改变奇偶校验
MSComm1.PortOpen = True '打开端口
Call SendData(bytData) '发送
MSComm1.PortOpen = False '关闭端口
MSComm1.Settings = "19200,m,8,2" '改变奇偶校验
MSComm1.PortOpen = True '打开端口
End Sub