我用VB做了一个两机通过rs232接口交互的串口通信小程序,数据的收发都能够实现了,但是在自动报错这里遇到一些问题,求教老师们,要想实现:当一台计算机的com端口接收到一个错误数据(比如接收到5这个数字)时,马上弹出一个窗口或者对话框(置顶的),并且自动在F盘目录下生成一个名叫data.txt的TXT文件并将5这个数字保存在这个文件中,以后每当端口收到这个错误数据的时候都会自动保存在这个文档中,并且不覆盖以前保存的。该怎样来编程呢?希望能加好注释,我比较菜,还请您谅解,谢谢!

解决方案 »

  1.   

    接收到数据 ->检查数据->FSO写文件
      

  2.   

    我不要什么做苦力!哪怕是提醒我用什么控件,还有保存路径方面有什么问题,我以前没有接触过VB,但是我知道这个问题只要是个懂VB的人,花不到一分钟就能搞定!我几天都没搞会的东西问问又怎么了?不想帮也别废话,我不指望有那么多好心人!
      

  3.   

    我前面实现的都是从网上搜的例子然后稍加修改,弹窗也搜过,点击按钮就弹窗,一句简单的form.show我以前也不会,就这简单还没人给说呢!我上面说的很清楚!我要的不是普通的弹窗,而是接收到相应数据后弹窗!这个数据前面用dim buf$,来设定的一个变量,然后buf=mscomm1.input  ,我就是想让这个变量等于一个设定的数值(比如5 )的时候弹出窗口!我试过好多语句,比如 if buf=5 then form2.show  这也就是我现在凭自己能写出的水平,但我知道可定时语法等出了点问题!而且是相当小的问题!我知道你们会VB,我纳闷的就是你们这么懂VB,连这种入门知识都说不出?看不懂?
      

  4.   

    LZ先整理好你的通信协议,所谓接收到5是指数值5呢还是字符5呢?判断需要依据这来写代码.
    此外不要搞单字节的报错,串口通信相当易受干扰,甚至数据帧中有某字节恰好与LZ设想的报错条件相同,将产生歧义.
      

  5.   


    LZ的这段叙述看不懂!
    LZ先定义了buf$为字符变量,而判断式中用
    if buf=5 then form2.show
    上句中成了数值.难道LZ不认为是自相矛盾吗?建议LZ以2进制方式接收,那才能达到某字节其值是5.
      

  6.   

    串口通信可以使用MSComm控件实现
    简单的说可以写MSComm控件的OnComm事件,通过判断接收到的字符来做出报警
    参考一下这个:
    http://download.csdn.net/source/1262066
      

  7.   

    数据类型概述
    以下表格显示所支持的数据类型,以及存储空间大小与范围。数据类型  存储空间大小 范围 Byte 1 个字节 0 到 255 
    Boolean 2 个字节 True 或 False 
    Integer  2 个字节 -32,768 到 32,767 
    Long(长整型) 4 个字节 -2,147,483,648 到 2,147,483,647 
    Single 
    (单精度浮点型) 4 个字节 负数时从 -3.402823E38 到 -1.401298E-45;正数时从 1.401298E-45 到 3.402823E38 
    Double 
    (双精度浮点型) 8 个字节 负数时从 -1.79769313486232E308 到 
    -4.94065645841247E-324;正数时从4.94065645841247E-324 到 1.79769313486232E308 
    Currency 
    (变比整型) 8 个字节 从 -922,337,203,685,477.5808 到 922,337,203,685,477.5807 
    Decimal 14 个字节 没有小数点时为 +/-79,228,162,514,264,337,593,543,950,335,而小数点右边有 28 位数时为 +/-7.9228162514264337593543950335;最小的非零值为 +/-0.0000000000000000000000000001 
    Date 8 个字节 100 年 1 月 1 日 到 9999 年 12 月 31 日 
    Object 4 个字节 任何 Object 引用 
    String 
    (变长) 10 字节加字符串长度 0 到大约 20 亿 
    String(定长) 字符串长度 1 到大约 65,400 
    Variant(数字) 16 个字节 任何数字值,最大可达 Double 的范围 
    Variant(字符) 22 个字节加字符串长度 与变长 String 有相同的范围 
    用户自定义(利用 Type) 所有元素所需数目 每个元素的范围与它本身的数据类型的范围相同。 
    注意 任何数据类型的数组都需要 20 个字节的内存空间,加上每一数组维数占 4 个字节,再加上数据本身所占用的空间。数据所占用的内存空间可以用数据元数目乘上每个元素的大小加以计算。例如,以 4 个 2 字节之 Integer 数据元所组成的一维数组中的数据,占 8 个字节。这 8 个字节加上额外的 24 个字节,使得这个数组所需总内存空间为 32 个字节。包含一数组的 Variant 比单独的一个数组需要多 12 个字节。
      

  8.   

    又回到原来的问题上了,其实我那个就是想实现一个很简单的效果,就如14楼说的我当时定义的buf 是个字符变量,后面用的if buf=5又成了数值变量,我这里是自相矛盾了,我想如果我定义的是数值变量,或者后面的检测的是字符变量(总之前后统一)应该就可以了吧?能不能在这个点上再指点一下呢?
      

  9.   

    MSComm 控件
    Input 属性
    返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。
    语法
    object.Input
    Input 属性语法包括下列部分:
    部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    说明
    InputLen 属性确定被 Input 属性读取的字符数。设置 InputLen 为 0,则 Input 属性读取缓冲区中全部的内容。
    InputMode 属性确定用 Input 属性读取的数据类型。如果设置 InputMode 为 comInputModeText,Input 属性通过一个 Variant 返回文本数据。如果设置 InputMode 为 comInputModeBinary,Input 属性通过一个 Variant .返回一二进制数据的数组
      

  10.   

    哎呀,我失误了,我应该第一时间就把我的程序放上来Private Sub Command1_Click()
    MSComm1.Output = Text1.Text
    End SubPrivate Sub Command2_Click()
    MSComm1.PortOpen = False
       Unload Me
    End SubPrivate Sub Command3_Click()
    Text2.SetFocus
    SendKeys "^{END}"
    Dim buf$
    buf = MSComm1.Input
    If Len(buf) <> 0 Then
    Text2.Text = Text2.Text + Chr(13) + Chr(10) + buf
    Open "f:\data.txt" For Output As #1   '这里是我下午研究出来的,能够保存接收到的东西了'
    Print #1, Text2.Text
    Close #1
    End If
    If buf=5 Then  '就是这里的问题,我把这里删掉其他可以正常运行,上面的也能把数据储存了’
    Form2.Show
    End If
    End SubPrivate Sub Form_Load()
      MSComm1.CommPort = 1
      MSComm1.Settings = "9600,n,8,1"
      MSComm1.InputMode = comInputModeText
      MSComm1.PortOpen = True
      MSComm1.InputLen = 0
      Timer1.Enabled = True
      Timer1.Interval = 100
    End SubPrivate Sub Timer1_Timer()
    Command3.Value = True
    End Sub还要麻烦大师帮忙指正一下
      

  11.   


    定义何种变量来读取输入缓冲区的数据流取决于InputMode属性的设置.
    当设置InputMode 为 comInputModeText时,可定义为字符串变量.
    当设置 InputMode 为 comInputModeBinary时,应定义为Byte(字节)数组.
      

  12.   


    看了LZ的代码,只有下位机每次只发送一个字节或字符(单字节),
    buf = MSComm1.Input
    此时
    buf是一个字节或字符(单字节)当是字符"5"时判断式应为
    If buf = "5" Then 
    Form2.Show
    End If当是数值5(即ASCII码为5)时判断式应为If buf = Chr(5) Then 
    Form2.Show
    End If

    If Asc(buf) = 5 Then 
    Form2.Show
    End If