VB如何通过mscomm控件既能发送ASII形式如0X01,又能发送字符串形式,如字符串‘M’, ‘R’, ‘ ’, ‘1’, ‘0’

qiangshou2301 2009-06-22 03:34:36
小弟刚用VB,现在要用VB来与一个带有232串口的仪器实现通信,现在碰见了个问题:VB如何通过mscomm控件既能发送ASII形式如0X01,又能发送字符串形式,如字符串‘M’, ‘R’, ‘ ’, ‘1’, ‘0’。请代码指点下。谢谢了!
...全文
206 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiangshou2301 2009-07-02
  • 打赏
  • 举报
回复
云哥 我试了 你这样也是可以的
qiangshou2301 2009-07-01
  • 打赏
  • 举报
回复
哦 明白了 学习下 谢谢了
zdingyun 2009-07-01
  • 打赏
  • 举报
回复
LZ:
你把Command1_Click作为过程名看待.我在Form_Load中调用Command1_Click事件过程.
qiangshou2301 2009-06-30
  • 打赏
  • 举报
回复
还是不明白zdingyun你为什么要用Command1?我是想按你说的把2个timer都全部合成到Private Sub Form_Load()这个代码怎么写?
zdingyun 2009-06-30
  • 打赏
  • 举报
回复
由于Chr(1) 或 Chr(48)都是ASCII小于128的字符号,只要无Chr(0)
Command1_Click中可以:
Private Sub Command1_Click()
Dim str1 As String
str1 = Chr(1) & Chr(48)
MSComm1.Output = str1
Timer1.Enabled = True
End Sub
zdingyun 2009-06-30
  • 打赏
  • 举报
回复
窗体初始化执行:
Option Explicit

Private Sub Command1_Click()
Dim arrOutput(1) As Byte
arrOutput(0) = &H1
arrOutput(1) = &H30
MSComm1.Output = arrOutput
Timer1.Enabled = True
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1000
Timer2.Enabled = False
Timer2.Interval = 10000
Me.MSComm1.Settings = "9600,n,8,1"
Me.MSComm1.CommPort = 1
Me.MSComm1.PortOpen = True
Command1_Click
End Sub

Private Sub Timer1_Timer()
Dim str1 As String
Static sum As Integer
sum = sum + 1
If sum = 1 Then
str1 = "DP140" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 2 Then
str1 = "DI180" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 3 Then
str1 = "DD120" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 4 Then
str1 = "SV14564" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 5 Then
str1 = "SA60000" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 6 Then
str1 = "FE0" & Chr(13)
Me.MSComm1.Output = str1
sum = 0
Timer1.Enabled = False
Timer2.Enabled = True
End If
End Sub

Private Sub Timer2_Timer()
Dim str1 As String
Static sum As Integer
sum = sum + 1
If sum = 1 Then
str1 = "MR436907" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 2 Then
str1 = "DH" & Chr(13)
Me.MSComm1.Output = str1
sum = 0
Timer2.Enabled = False
End If
End Sub
zdingyun 2009-06-30
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 veron_04 的回复:]
这么简单一个问题,被你们搞得这么复杂
要发十六进制数据只需要把inputmode设置为二进制模式。
要发字符串数据只需要把inputmode设置为文本方式。

其他的怎么发,我已经给楼主代码下载地址了,楼主下载来看看不就结了?

[/Quote]
你所说的是接收模式,不是发送。
贝隆 2009-06-29
  • 打赏
  • 举报
回复
这么简单一个问题,被你们搞得这么复杂
要发十六进制数据只需要把inputmode设置为二进制模式。
要发字符串数据只需要把inputmode设置为文本方式。

其他的怎么发,我已经给楼主代码下载地址了,楼主下载来看看不就结了?
zdingyun 2009-06-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qiangshou2301 的回复:]
我现在直接这样
        Dim str1 As String
        Dim arrOutput(1) As Byte
        arrOutput(0) = &H1
        arrOutput(1) = &H30
        MSComm1.Output = arrOutput
        Call Sleep(1000)
        str1 = "DP140" & Chr(13)
        Me.MSComm1.Output = str1
        Call Sleep(1000)
        str1 = "DI180" & Chr(13)
        Me.MSComm1.Output = str1
        Call Sleep(1000)
        str1 = "DD120" & Chr(13)
        Me.MSComm1.Output = str1
        Call Sleep(1000)
        str1 = "SV14564" & Chr(13)
        Me.MSComm1.Output = str1
        Call Sleep(1000)
        str1 = "SA60000" & Chr(13)
        Me.MSComm1.Output = str1
        Call Sleep(1000)
        str1 = "FE0" & Chr(13)
        Me.MSComm1.Output = str1
        Call Sleep(10000)
        str1 = "MR436907" & Chr(13)
        Me.MSComm1.Output = str1
        Call Sleep(10000)
        str1 = "DH" & Chr(13)
        Me.MSComm1.Output = str1

先发送0x01与30 然后就是 "DP140"等字符串 这个我用助手接收看了的 用十六进制显示是对的 DP140相应的转换为了16进制
[/Quote]
LZ:Sleep的使用是有问题的.应该用2个Timer来实现:
Option Explicit

Private Sub Command1_Click()
Dim arrOutput(1) As Byte
arrOutput(0) = &H1
arrOutput(1) = &H30
MSComm1.Output = arrOutput
Timer1.Enabled = True
End Sub

Private Sub Form_Load()
Timer1.Enabled = False
Timer1.Interval = 1000
Timer2.Enabled = False
Timer2.Interval = 10000
Me.MSComm1.Settings = "9600,n,8,1"
Me.MSComm1.CommEvent = 1
Me.MSComm1.PortOpen = True
End Sub

Private Sub Timer1_Timer()
Dim str1 As String
Static sum As Integer
sum = sum + 1
If sum = 1 Then
str1 = "DP140" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 2 Then
str1 = "DI180" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 3 Then
str1 = "DD120" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 4 Then
str1 = "SV14564" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 5 Then
str1 = "SA60000" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 6 Then
str1 = "FE0" & Chr(13)
Me.MSComm1.Output = str1
sum = 0
Timer1.Enabled = False
Timer2.Enabled = True
End If
End Sub

Private Sub Timer2_Timer()
Dim str1 As String
Static sum As Integer
sum = sum + 1
If sum = 1 Then
str1 = "MR436907" & Chr(13)
Me.MSComm1.Output = str1
ElseIf sum = 2 Then
str1 = "DH" & Chr(13)
Me.MSComm1.Output = str1
sum = 0
Timer2.Enabled = False
End If
End Sub
qiangshou2301 2009-06-29
  • 打赏
  • 举报
回复
不知道这个仪器控制还有哪的问题
zdingyun 2009-06-29
  • 打赏
  • 举报
回复
来自qiangshou2301 2 分钟前

你好!云哥,这个是你给小弟回复的用2个timer,还是没有看懂

对LZ的私信我没看懂.是我的代码不对?还是我的理由错?还是仍无法解决LZ的问题?
qiangshou2301 2009-06-29
  • 打赏
  • 举报
回复
谢谢老朱 我给你发私信了
嗷嗷叫的老马 2009-06-29
  • 打赏
  • 举报
回复
路过.
qiangshou2301 2009-06-28
  • 打赏
  • 举报
回复
我现在直接这样
Dim str1 As String
Dim arrOutput(1) As Byte
arrOutput(0) = &H1
arrOutput(1) = &H30
MSComm1.Output = arrOutput
Call Sleep(1000)
str1 = "DP140" & Chr(13)
Me.MSComm1.Output = str1
Call Sleep(1000)
str1 = "DI180" & Chr(13)
Me.MSComm1.Output = str1
Call Sleep(1000)
str1 = "DD120" & Chr(13)
Me.MSComm1.Output = str1
Call Sleep(1000)
str1 = "SV14564" & Chr(13)
Me.MSComm1.Output = str1
Call Sleep(1000)
str1 = "SA60000" & Chr(13)
Me.MSComm1.Output = str1
Call Sleep(1000)
str1 = "FE0" & Chr(13)
Me.MSComm1.Output = str1
Call Sleep(10000)
str1 = "MR436907" & Chr(13)
Me.MSComm1.Output = str1
Call Sleep(10000)
str1 = "DH" & Chr(13)
Me.MSComm1.Output = str1

先发送0x01与30 然后就是 "DP140"等字符串 这个我用助手接收看了的 用十六进制显示是对的 DP140相应的转换为了16进制
贝隆 2009-06-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qiangshou2301 的回复:]
of123你说的就是:
dim  Rec as string
rec=mscomm.output


dim Rec() as byte
rec=mscomm.output
这样的意思吧?
[/Quote]

代码错了吧?
Mscomm.output= rec
qiangshou2301 2009-06-23
  • 打赏
  • 举报
回复
of123你说的就是:
dim Rec as string
rec=mscomm.output


dim Rec() as byte
rec=mscomm.output
这样的意思吧?
贝隆 2009-06-22
  • 打赏
  • 举报
回复
http://download.csdn.net/source/1262066
串口调试器源代码。能满足你的要求。
of123 2009-06-22
  • 打赏
  • 举报
回复

发送并不区分数值还是 ASCII 码。但是接收方需要知道你现在发送的是什么。一个简单的方法是,前缀一个标志字节来表示当前是数值,还是 ASCII。

发送时,声明一个 Byte 类型数组。如果是数值,直接填入。如果是字符,取 Asc() 再填入。然后将数组直接赋值给 MSComm.Output 属性。
qiangshou2301 2009-06-22
  • 打赏
  • 举报
回复
zdingyun的东西很好 谢谢了
chenyun1123 2009-06-22
  • 打赏
  • 举报
回复
dim Rec as string
rec=mscomm.output



dim Rec() as byte
rec=mscomm.output

可以这样接收。发送就自己来写了。对了还有设置接收类型的时候要注意。
加载更多回复(4)

1,451

社区成员

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

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