MSCOMM控件问题真的没人知道吗??

guxing110 2007-03-15 10:57:38
'-----------------------------------------------------
'发送区
'-----------------------------------------------------
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
'-----------------------------------------------------
'接收区
'-----------------------------------------------------
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分。不给是小狗
...全文
685 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
guxing110 2007-03-16
  • 打赏
  • 举报
回复
哈哈...楼上的真是好心人啊.
真的是要好好谢谢你.
答应你500分的.
我上小号刷给你.哈哈
of123 2007-03-16
  • 打赏
  • 举报
回复
Text1.Text = Text1.Text & " " Right("0" & Hex(BytReceived(i)),2)
of123 2007-03-16
  • 打赏
  • 举报
回复
中途改变 Settings 之前,关闭 MSComm 控件,然后再打开。这样会比较慢,如果要求速度,可以用 API 来做。

'-----------------------------------------------------
'发送区
'-----------------------------------------------------
Public Function SendData(ByRef bytData() As Byte) As Long
On Error Goto ErrHandler

MSComm1.Output = bytData '发送数据

Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
SendData = 0
Exit Function

ErrHandler:
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
Next

MSComm1.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

Hashxu 2007-03-16
  • 打赏
  • 举报
回复
UP 期待中
guxing110 2007-03-16
  • 打赏
  • 举报
回复
谢谢楼上的回复.可是问题还是没解决.还是3F
能帮我写段源码测试一下吗?

解决之后500分.决不食言.骗人是小狗
celevantis 2007-03-15
  • 打赏
  • 举报
回复
3F的出现应该是多次打开串口造成的。
建议你发送完第一次后用定时器延时,然后发第二个包。
zdingyun 2007-03-15
  • 打赏
  • 举报
回复
Option Explicit

'-----------------------------------------------------
'发送区
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
guxing110 2007-03-15
  • 打赏
  • 举报
回复
我调试时strBuff = MSComm1.Input
到这里是我用监视看strBuff显示的是一个问题,我监视MSComm1.Input中的值是63(这63是十进制的转十六进制后就是3F),而且我发送任何值出去返回来的都是3F.感到很奇怪.
guxing110 2007-03-15
  • 打赏
  • 举报
回复
恩,没问题.我去掉了.问题还在.有人知道原因吗?
实在想不出.好心人帮帮忙吧
xiangfly 2007-03-15
  • 打赏
  • 举报
回复
Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕
MSComm1.OutBufferCount = 0
这些代码不要,也没问题吧,
我以前也用过,用这个话,CUP用的很多的
guxing110 2007-03-15
  • 打赏
  • 举报
回复
你能告诉我。我的问题出在哪里吗?
我试过了问题没有解决。告诉我问题出的哪里好吗?
zdingyun 2007-03-15
  • 打赏
  • 举报
回复
更正,上述代码是另一网友的,你的代码在分析中,但他的问题与你相似。
zdingyun 2007-03-15
  • 打赏
  • 举报
回复
已将你在另一处提问的代码修改,经VB6调试通过:

Private Sub Form_Load()
Me.MSComm1.CommPort = 2
Me.MSComm1.PortOpen = True
Me.MSComm1.RThreshold = 1
End Sub

Private 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 = True

End Sub

Private 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 Next

MSComm1.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

zdingyun 2007-03-15
  • 打赏
  • 举报
回复
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 = "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
guxing110 2007-03-15
  • 打赏
  • 举报
回复
我使用的串口只使用了三根线。一根接收线。一根发送线。一根地线。
没有使用握手协议
我发送一条数据给硬件是一个数组。这数组中有23个元素。
第一个元素以19200,M,8,2发送以后的22个元素以19200,S,8,2发送。发送完之后硬件会在10豪秒之内传回一个值。传回来的值以19200,M,8,2接收。这个值是一个十六进制数。别的就没有了。

能给我写段代码吗?非常感谢。我是一对一的通信(就是计算机串口直接对一台设备设置)。速度应该很快。
fclvgyfe 2007-03-15
  • 打赏
  • 举报
回复
你不提供软件与硬件方的握手方式,协议长度,串口工作及变化方式和硬件时序要求,很难给出确切的解决办法。
fclvgyfe 2007-03-15
  • 打赏
  • 举报
回复
另外,如果发送总是用同一种校验,接收总是用另一种校验,那么只需要设置SETTINGS为发送时的校验,而接收时只取数据,忽略其中的校验错信息。MSCOMM不会因为校验错而改变接收的有效的8位数的。
guxing110 2007-03-15
  • 打赏
  • 举报
回复
我从硬件返回来的数据是十六进制的二位数“0F”成功“F0”失败。帮我写段代码好吗?
guxing110 2007-03-15
  • 打赏
  • 举报
回复
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

MSComm1.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呢?真的把我急死了
请会的朋友帮帮我。一个人开发不容易啊。而且我刚刚上岗不久。先谢谢了。解决了一定给分
fclvgyfe 2007-03-15
  • 打赏
  • 举报
回复
这需要把硬件方的串口工作方式列出来,因为到目前为止,问题仅限于用MSCOMM来适应硬件串口的时序和工作方式。说实话,如果不是硬件有地址识别功能的话,没事改串口参数是件比较困惑的事。
加载更多回复(11)

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧