搜索
bottom↓
回复: 25

VB上位机问题求救

[复制链接]

出0入0汤圆

发表于 2009-4-11 19:39:16 | 显示全部楼层 |阅读模式
Private Sub Command1_Click()
  MSComm1.Output = Trim(Text1.Text)
End Sub

Private Sub Form_Load()
  MSComm1.Settings = "19200,n,8,1"
  MSComm1.CommPort = 1
  MSComm1.PortOpen = True
End Sub

本人刚学VB 代码如上,每次发送的时候单片机能接受数据 但是每次接受的都不正常,下位机的程序是对的 我用串口调试助手试过 可以正常工作 希望大家能指点一下 先谢谢了

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

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

出0入0汤圆

发表于 2009-4-11 19:53:46 | 显示全部楼层
.InputMode = comInputModeBinary

出0入0汤圆

发表于 2009-4-11 19:55:02 | 显示全部楼层
怎么个不正常?

出0入0汤圆

 楼主| 发表于 2009-4-11 19:57:57 | 显示全部楼层
就是接收的数据不正确

出0入0汤圆

 楼主| 发表于 2009-4-11 19:58:15 | 显示全部楼层
二楼说的也试过

出0入0汤圆

 楼主| 发表于 2009-4-11 20:00:15 | 显示全部楼层
比如我把发送过来的数据赋给P2口 P2接的是8个LED 共阳的

出0入0汤圆

 楼主| 发表于 2009-4-11 20:02:22 | 显示全部楼层
是不是发送之前还要把数据转换成二进制 再发出去

出0入0汤圆

 楼主| 发表于 2009-4-11 20:12:45 | 显示全部楼层
各位大虾,在线等答案,帮帮忙 弄很久 才上来问的

出0入0汤圆

发表于 2009-4-11 20:27:44 | 显示全部楼层
首先看你下位机要的是ascii还是hex,然后用虚拟串口看看你vb程序发的是什么?
举例:
Public Function Rs232_send()
Dim tmp_b(1) As Byte
tmp_b(0) = 1
tmp_b(1) = 200
'MainWindows.Text1.Text = Hex$(CRCValue)
MainWindows.MSComm1.Output = Chr(&H7E)
MainWindows.MSComm1.Output = tmp_b
End Function
那么串口发的会是7e 01 c8

出0入0汤圆

 楼主| 发表于 2009-4-11 20:47:14 | 显示全部楼层
下位机接受的就是HEX 不过你上面的有点看不明白,能解释一下吗 先谢谢你

出0入0汤圆

发表于 2009-4-11 20:53:16 | 显示全部楼层
假定你要发送的是7e 01 c8
可以这样实现MSComm1.Output = Chr(&H7E) &Chr(&H01)&Chr(&Hc8)
如果要发送text控件里面的内容则是
MSComm1.Output = Text1.Text
Text1是“7e 01 c8”则输出的是“7e 01 c8”而不是hex了

出0入0汤圆

 楼主| 发表于 2009-4-11 21:13:22 | 显示全部楼层
上面的行了 , 那我如何讲 text1里面的发出去呢?最后一个问题 非常感谢

出0入0汤圆

发表于 2009-4-11 21:42:34 | 显示全部楼层
随便写的,参考一下吧,把text1里的内容以hex的形式输出到MSComm1,如text1键入“12 3e”(不包括引号,每个hex间隔一个空格),则输出12 3e,不规则的输入可能会出错
Private Sub Command1_Click()
    On Local Error GoTo ErrH
    Dim oStr As String
    Dim Buf(255) As Byte
    oStr = Text1.Text
    If Trim(oStr) = "" Then
        MsgBox "输入为空"
        Exit Sub
    End If
   
    Dim TheLen As Integer   '字符串长度
    TheLen = Len(oStr)
    oStr = oStr & " "
   
    Dim i As Integer, Piece As String, j As Integer
    j = 0
    i = 1
    While i <= TheLen
        Piece = Mid(oStr, i, 1)
        If IsNumeric("&H" & Piece) Then     '检测到数字
            If i + 1 <= TheLen And IsNumeric("&H" & Mid(oStr, i + 1, 1)) Then '后面一个也是数字
                Buf(j) = CByte("&H" & Mid(oStr, i, 2))
                j = j + 1
                i = i + 2
            Else
                Buf(j) = CByte("&H" & Mid(oStr, i, 1))
                j = j + 1
                i = i + 1
            End If
        Else
            i = i + 1
        End If
    Wend
   
    '生成完毕,
    If j = 0 Then
        MsgBox "你输入的字符串中没有数字"
        Exit Sub
    End If
   
    Dim Arr() As Byte
    ReDim Arr(j - 1)
    For i = 0 To j - 1
        Arr(i) = Buf(i)
    Next
   
    MSComm1.Output = Arr 'outbte(0) '...发送数据
    Exit Sub
ErrH:
    MsgBox Err.Description
End Sub

出0入0汤圆

 楼主| 发表于 2009-4-11 21:49:52 | 显示全部楼层
谢谢 ,有几个函数 不明白 我自己会慢慢解决 非常感谢

出0入0汤圆

 楼主| 发表于 2009-4-12 13:45:16 | 显示全部楼层
MSComm1.Output = Arr 'outbte(0) '...发送数据  这个是什么意思啊 其他都明白了 能解释一下吗 谢谢

出0入0汤圆

发表于 2009-4-12 14:01:47 | 显示全部楼层
MSComm1.Output = Arr表示把Arr数组通过串口发送出去

出0入0汤圆

 楼主| 发表于 2009-4-12 17:04:12 | 显示全部楼层
整了一天也没整出来,确实有点笨 能不能写个最简单的 比如我在text里输入00或者aa 按一下按键 以十六进制发送出去就可以了

出0入0汤圆

发表于 2009-4-12 18:37:47 | 显示全部楼层
点击此处下载 ourdev_435708.rar(文件大小:58K) (原文件名:VB_rs232_test.rar)
参考一下

出0入0汤圆

 楼主| 发表于 2009-4-12 18:39:55 | 显示全部楼层
Option Explicit

Private Sub Command1_Click()
    Dim c As Integer
    Dim a As String
    Dim b As Integer
    c = Trim(Text1.Text)
    b = c
    a = Chr(b)
    MSComm1.Output = a
   
   
End Sub

Private Sub Form_Load()
    MSComm1.CommPort = 1
    MSComm1.Settings = "19200,n,8,1"
    MSComm1.PortOpen = True
   
End Sub

出0入0汤圆

 楼主| 发表于 2009-4-12 18:41:04 | 显示全部楼层
这是我写的,但是数据发送大的时候就出错 比如发送00 01 02 04什么的就能正确接受 但是发送FF AA什么就出错 是什么原因呢

出0入0汤圆

发表于 2009-4-30 13:49:13 | 显示全部楼层
学习一下.

出10入0汤圆

发表于 2009-4-30 21:31:10 | 显示全部楼层
Private Sub Command1_Click()
Dim mid_data As Single
Dim temp_str(2) As Byte
Dim buffer As Variant
If sw Then
    If (Text3.Text = "" And Text4.Text = "") Or (Text3.Text <> "" And Text4.Text = "") Then
        ret = MsgBox("请先输入测试数据", 64, "出错了")
        Text4.SetFocus
    Else
        mid_data = ((Str(Text4.Text)) / 99) * 255   '流量数值转换
        temp_str(0) = CByte(mid_data)    'F  发送的时候先发送数组下标小的那个
        temp_str(1) = CByte(&H22)
        temp_str(2) = CByte(temp_str(0)) Xor CByte(temp_str(1))
        '"&h" & hex(str(60))    连接生成十六进制格式
        S_DATA_X = Str(Text4.Text)
        buffer = temp_str      '经chr转换后的数据已经是字符代表的 Ascii码值,如97就是代表 a
        MSComm1.Output = buffer
    End If
Else
    ret = MsgBox("请先打开串口", 64, "出错了")
End If
End Sub


这个是我的一个 sub,也是将text文本中的数据发送出去,前面是判断文本中是否空,后面 else是发送前处理
发送的数据结构有三个 byte,数据+类型+异或校验,像你这样就发一个就够了,不用定义临时数组
应该看的懂吧,已经有注释了

出0入0汤圆

发表于 2009-6-24 11:27:32 | 显示全部楼层
楼主能否加我QQ互相学习下  请教下你 谢谢

出0入0汤圆

发表于 2009-7-28 09:07:05 | 显示全部楼层
这个情况我也遇到过,就是串口编写的程序发出去的数据你下位机接受的是十六进制的,还是ASCII码,建议可以用数组的方式来制作,就像21楼中的做法,不过还是要自己多谢谢程序,这样才能提升得快点,这个是我的一些学习经验!

欢迎大家到【爱伙工作室】交流学习!


(原文件名:LOGO1.gif)

出0入0汤圆

发表于 2011-8-5 18:29:48 | 显示全部楼层
记号下 学

出0入0汤圆

发表于 2011-10-15 12:39:05 | 显示全部楼层
楼主遇到的问题,我也遇到过,发到上位机的不正常,楼主解决可没有?可否公开源程序呢???多谢楼主了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-24 13:02

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

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