搜索
bottom↓
回复: 12

谁有VB既能发送ASII又能发送字符形式的例子,谢谢了!

[复制链接]

出0入0汤圆

发表于 2009-6-25 16:50:46 | 显示全部楼层 |阅读模式
现在需要对一个带有com口的仪器用VB发送命令来控制,由于我电脑上的com口不行,只能选择com转usb了。现在有如下发送的命令需要解决:
formload初始化里,需要发送的东西有:
1、首先向控制器发送数字1(ASII即0X01),然后发送控制器地址0(ASII即0X30);
2、初始化控制器,这些指令却是以字符形式发送的,如指令“ MR 100”,发送的是字符串{‘M’, ‘R’, ‘ ’, ‘1’, ‘0’, ‘0’  }。

然后才是command控件控制:
1、command1还是发送字符:如指令MA  14563.6

有哪位之前做过这方面的能否共享下或者指点下!
谢谢各位了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-6-25 19:35:06 | 显示全部楼层
哪位有这样的VB例子吗?

出0入0汤圆

发表于 2009-6-25 23:05:17 | 显示全部楼层
' 保存输入子串的缓冲区
Dim Instring As String
Dim Outstring As String
' 使用 COM1。
MSComm1.CommPort = 1
' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1"
' 当输入占用时,
' 告诉控件读入整个缓冲区。
MSComm1.InputLen = 0
' 打开端口。
MSComm1.PortOpen = True
' 将 attention 命令送到调制解调器。
Outstring=chr(1) & "0"
MSComm1.Output = Outstring
Outstring="MR 100"
MSComm1.Output = Outstring
Outstring="MA 14563.6"
MSComm1.Output = Outstring
' 等待数据返回到串行端口。
Do
  DoEvents
Loop Until MSComm1.InBufferCount > 0
' 从串行端口读 "OK" 响应。
Instring = MSComm1.Input
' 关闭串行端口。
MSComm1.PortOpen = False

出0入0汤圆

 楼主| 发表于 2009-6-26 11:02:56 | 显示全部楼层
我这样做也是能在初始化里发送,但是接受到得asii值1(ASII即0X01),0(ASII即0X30)时调试助手要选择十六进制才能正确显示;
而发送"DP140"等字符串的时候用十六进制显示就不是"DP140"了,必须不选择十六进制显示。

'界面初始化程序
Private Sub Form_Load()     
        Dim buff_out11() As Byte
        ReDim buff_out11(0)
        buff_out11(0) = &H1
        Me.MSComm1.Output = buff_out11

        Dim buff_out12() As Byte
        ReDim buff_out12(0)
        buff_out12(0) = &H30
        Me.MSComm1.Output = buff_out12

        Me.MSComm1.Output = "DP140"
        Me.MSComm1.Output = "DI180"
        Me.MSComm1.Output = "DD120"
        Me.MSComm1.Output = "SV14563.6"
        Me.MSComm1.Output = "SA60000"
        Me.MSComm1.Output = "FE0"   
End Sub

出0入0汤圆

发表于 2009-6-26 15:43:14 | 显示全部楼层
要显示所有的内容只能以十六进制方式显示,不然的话非ASCII不能正确显示出来

出0入0汤圆

 楼主| 发表于 2009-6-26 22:58:44 | 显示全部楼层
我现在VB发送端是16进制发送 助手显示端是这样的2种情况:
1、发送0x01;0x30;“MR100”字符串这3组,我助手里不选择16进制时显示如下:lMR100,就感觉0x01;0x30就没有显示,前面的l不知道是什么;
2、选择了16进制显示:01 30 4D 52 31 30 30 。4D 52 31 30 30 是MR100的16进制。
大家看看是不是有问题啊?还是不用管16进制显示否,还是本身我发送的格式还是不对?

出0入0汤圆

发表于 2009-6-26 23:15:20 | 显示全部楼层
两位十六进制是可以表示十进制的0~255,ASCII分为控制字符,和英文字符(大小写字母),数字,所以一般以十六进制显示发送和接收的数据
LZ可以将要发送的数据用十六进制显示出来,然后和接收的十六进制进行比较就能得出结论
ASCII码中,第0~32号及第127号是控制字符,常用的有LF(换行)、CR(回车);第33~126号是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余的是一些标点符号、运算符号等。

ASCII编码表 (原文件名:ascii.gif)

出0入0汤圆

 楼主| 发表于 2009-6-27 22:21:58 | 显示全部楼层
按cqfeiyu 所说,“将要发送的数据用十六进制显示出来,然后和接收的十六进制进行比较就能得出结论 ”,我通过你发的图比较了下,发送的内容应该是正确的。
我把串口调试助手收到的内容发给你看看。见下面的2个图(16进制选中与不选中两个画面都有,注明:是同样内容,只是显示方法不同),想问你一下发送内容对不对?以及各个命令之间有没有时间间隔?下面有我VB的初始化代码。(Chr(13)是回车的意思)。
       下图是发送 0x01 0x30 "DP140" "DI180" "DD120" "SV14564" "SA60000"  "FE0" "MR436907" "DH",非十六进制显示

(原文件名:未命名.JPG)
       下图是发送 0x01 0x30 "DP140" "DI180" "DD120" "SV14564" "SA60000"  "FE0" "MR436907" "DH",十六进制显示

(原文件名:未命名2.JPG)

下面是VB初始化代码,任务是完成发送仪器初始化控制命令:     
'界面初始化程序
Private Sub Form_Load()
        Dim arrOutput(1) As Byte
        arrOutput(0) = &H1
        arrOutput(1) = &H30
        MSComm1.Output = arrOutput
        Me.MSComm1.Output = "DP140" & Chr(13)
        Me.MSComm1.Output = "DI180" & Chr(13)
        Me.MSComm1.Output = "DD120" & Chr(13)
        Me.MSComm1.Output = "SV14564" & Chr(13)
        Me.MSComm1.Output = "SA60000" & Chr(13)
        Me.MSComm1.Output = "FE0" & Chr(13)
        Me.MSComm1.Output = "MR436907"& chr(13)
        Me.MSComm1.Output = "DH"& chr(13)   
End Sub

初始化完成后,下面是VB控件操作对应的代码:
Command5对应代码:
Private Sub Command5_Click()
MSComm1.Output = "M" & "A" & Round(Val(Text2.Text) * 145635.5328)
End Sub

Command8对应代码:
Private Sub Command8_Click()
MSComm1.Output = "MR-146"
End Sub

Command9对应代码:
Private Sub Command9_Click()
MSComm1.Output = "MR146"
End Sub

出0入0汤圆

发表于 2009-6-27 22:37:20 | 显示全部楼层
要想有间隔可以延时一段时间,用API函数Sleep(xms)
初始化代码可以写成这样
private Declare Sub Sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)

Private Sub Form_Load()
        Dim str1 As string
        str1=chr(1) & chr(&H30)
        MSComm1.Output = str1
        call sleep(100)
        str1="DP140" & Chr(13)
        Me.MSComm1.Output = str1
        call sleep(100)
        str1="DI180" & Chr(13)
        Me.MSComm1.Output = str1
        call sleep(100)
        str1="DD120" & Chr(13)
        Me.MSComm1.Output = str1
        call sleep(100)
        str1="SV14564" & Chr(13)
        Me.MSComm1.Output = str1
        call sleep(100)
        str1="SA60000" & Chr(13)
        Me.MSComm1.Output = str1
        call sleep(100)
        str1="FE0" & Chr(13)
        Me.MSComm1.Output = str1
        call sleep(100)
        str1="MR436907"& chr(13)
        Me.MSComm1.Output = str1
        call sleep(100)
        str1="DH"& chr(13)
        Me.MSComm1.Output = str1
End Sub

出0入0汤圆

 楼主| 发表于 2009-6-28 11:07:46 | 显示全部楼层
谢谢 cqfeiyu 兄了,延时是得考虑,现在发送的命令应该是没有问题,还在联系厂家技术人员看还有其他方面需要注意的不,通过电脑usb转控制器com发送,控制器还是接收不到命令。

出0入0汤圆

发表于 2009-6-28 12:45:00 | 显示全部楼层
你用串口助手能收到正确的发送数据说明是没哟问题的,看控制器有问题没?控制器难道不返回些数据吗?这样不好交互,难以确定在哪个地方出了问题

出0入0汤圆

 楼主| 发表于 2009-6-28 16:20:26 | 显示全部楼层
控制器是没有问题的 我用它厂家自己的控制软件是可以的 还不知道怎么让控制器返回数据啊 现在确实不知道哪儿出问题了 处于迷茫期 呵呵

出0入0汤圆

发表于 2009-7-19 18:42:58 | 显示全部楼层
'------------------2位16进制字符串转8位2进制字符串 向下位机发送 -----------------------------
Public Function HexStrToStr(strHex As String) As String "FF"--->"1111 1111"
Dim i As Integer
Dim strBin As Integer
HexStrToStr = ""
For i = 1 To Len(strHex) Step 2
            If i + 1 > Len(strHex) Then
                     strBin = "&H" & "0" & Mid$(strHex, i, 2)   
            Else
                     strBin = "&H" & Mid$(strHex, i, 2)
            End If

Next
HexStrToStr = CByte(strBin)
End Function
'接收下位机发送的数据并转换成16进制可显示字符
Public Function StrToHexStr(strBin As String) As String      
Dim i As Integer     
Dim strHex As String
StrToHexStr = ""
For i = 1 To Len(strBin) Step 2   
    If i = 1 Then
        strHex = Right("0" & Hex$(Asc(Mid$(strBin, i, 2))), 2)
    Else
        strHex = Right((strHex & Hex$(Asc(Mid$(strBin, i, 2)))), 2)
   End If
Next
        StrToHexStr = strHex
End Function
'---------------------------------------------------------------------------------------------------------------------
大家看看能修改的更快更稳定吗?并把里面的bug修改了.
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 18:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表