yuanshi3 发表于 2009-6-25 16:50:46

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

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

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

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

yuanshi3 发表于 2009-6-25 19:35:06

哪位有这样的VB例子吗?

cqfeiyu 发表于 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

yuanshi3 发表于 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

cqfeiyu 发表于 2009-6-26 15:43:14

要显示所有的内容只能以十六进制方式显示,不然的话非ASCII不能正确显示出来

yuanshi3 发表于 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进制显示否,还是本身我发送的格式还是不对?

cqfeiyu 发表于 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个小写英文字母,其余的是一些标点符号、运算符号等。
http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_456324.gif
ASCII编码表 (原文件名:ascii.gif)

yuanshi3 发表于 2009-6-27 22:21:58

按cqfeiyu 所说,“将要发送的数据用十六进制显示出来,然后和接收的十六进制进行比较就能得出结论 ”,我通过你发的图比较了下,发送的内容应该是正确的。
我把串口调试助手收到的内容发给你看看。见下面的2个图(16进制选中与不选中两个画面都有,注明:是同样内容,只是显示方法不同),想问你一下发送内容对不对?以及各个命令之间有没有时间间隔?下面有我VB的初始化代码。(Chr(13)是回车的意思)。
       下图是发送 0x01 0x30 "DP140" "DI180" "DD120" "SV14564" "SA60000""FE0" "MR436907" "DH",非十六进制显示
http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_456490.JPG
(原文件名:未命名.JPG)
       下图是发送 0x01 0x30 "DP140" "DI180" "DD120" "SV14564" "SA60000""FE0" "MR436907" "DH",十六进制显示
http://cache.amobbs.com/bbs_upload782111/files_16/ourdev_456491.JPG
(原文件名:未命名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

cqfeiyu 发表于 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

yuanshi3 发表于 2009-6-28 11:07:46

谢谢 cqfeiyu 兄了,延时是得考虑,现在发送的命令应该是没有问题,还在联系厂家技术人员看还有其他方面需要注意的不,通过电脑usb转控制器com发送,控制器还是接收不到命令。

cqfeiyu 发表于 2009-6-28 12:45:00

你用串口助手能收到正确的发送数据说明是没哟问题的,看控制器有问题没?控制器难道不返回些数据吗?这样不好交互,难以确定在哪个地方出了问题

yuanshi3 发表于 2009-6-28 16:20:26

控制器是没有问题的 我用它厂家自己的控制软件是可以的 还不知道怎么让控制器返回数据啊 现在确实不知道哪儿出问题了 处于迷茫期 呵呵

ice110 发表于 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修改了.
页: [1]
查看完整版本: 谁有VB既能发送ASII又能发送字符形式的例子,谢谢了!