我用VB做了一个两机通过rs232接口交互的串口通信小程序,数据的收发都能够实现了,但是在自动报错这里遇到一些问题,求教老师们,要想实现:当一台计算机的com端口接收到一个错误数据(比如接收到5这个数字)时,马上弹出一个窗口或者对话框(置顶的),并且自动在F盘目录下生成一个名叫data.txt的TXT文件并将5这个数字保存在这个文件中,以后每当端口收到这个错误数据的时候都会自动保存在这个文档中,并且不覆盖以前保存的。该怎样来编程呢?希望能加好注释,我比较菜,还请您谅解,谢谢!
调试欢乐多
此外不要搞单字节的报错,串口通信相当易受干扰,甚至数据帧中有某字节恰好与LZ设想的报错条件相同,将产生歧义.
LZ的这段叙述看不懂!
LZ先定义了buf$为字符变量,而判断式中用
if buf=5 then form2.show
上句中成了数值.难道LZ不认为是自相矛盾吗?建议LZ以2进制方式接收,那才能达到某字节其值是5.
简单的说可以写MSComm控件的OnComm事件,通过判断接收到的字符来做出报警
参考一下这个:
http://download.csdn.net/source/1262066
以下表格显示所支持的数据类型,以及存储空间大小与范围。数据类型 存储空间大小 范围 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 个字节。
Input 属性
返回并删除接收缓冲区中的数据流。该属性在设计时无效,在运行时为只读。
语法
object.Input
Input 属性语法包括下列部分:
部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
说明
InputLen 属性确定被 Input 属性读取的字符数。设置 InputLen 为 0,则 Input 属性读取缓冲区中全部的内容。
InputMode 属性确定用 Input 属性读取的数据类型。如果设置 InputMode 为 comInputModeText,Input 属性通过一个 Variant 返回文本数据。如果设置 InputMode 为 comInputModeBinary,Input 属性通过一个 Variant .返回一二进制数据的数组。
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还要麻烦大师帮忙指正一下
定义何种变量来读取输入缓冲区的数据流取决于InputMode属性的设置.
当设置InputMode 为 comInputModeText时,可定义为字符串变量.
当设置 InputMode 为 comInputModeBinary时,应定义为Byte(字节)数组.
看了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