我用MScomm控件读取串口的数据,无法触发MSComm1_OnComm事件?

ghoster2008 2008-10-17 02:36:14
源码如下:
Private Sub Form_Load()
Dim port As Integer

port = 1

With MSComm1
.CommPort = port '使用COM1端口

.Settings = "1200,O,7,1"

.InputMode = comInputModeBinary '采用二进制传输

'MSComm1.SThreshold = 1

.RThreshold = 1 '产生MSComm事件

.InBufferCount = 0 '清空接受缓冲区

'MSComm1.OutBufferCount = 0 '清空传输缓冲区

.InBufferSize = 1024

.PortOpen = True
End With

If Err Then '错误处理
MsgBox "串口通信无效"
End If

End Sub

Private Sub MSComm1_OnComm()

Dim Buffer As Variant

Dim Hexbuffer(0) As Byte

Select Case MSComm1.CommEvent

Case comEvReceive

'告诉控件读入整个缓冲区
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeBinary
Buffer = MSComm1.Input

Hexbuffer(0) = AscB(Buffer)
'MSComm1.InputMode = comInputModeText
'Buffer = AscB(MSComm1.Input)

Text1.Text = Text1.Text & Hex(Hexbuffer(0)) '转换成十六进制

Case Else

End Select

MSComm1.PortOpen = False '关闭串口连接

End Sub
...全文
611 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghoster2008 2008-11-01
  • 打赏
  • 举报
回复
感谢各位的帮助,在此谢谢!
zdingyun 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zdingyun 的回复:]
引用 5 楼 ghoster2008 的回复:
我测试过,串口可以接受数据。现在就是不能触发comEvReceive,而且MSComm1.CommEvent的值为0,所以不能触发就收事件。

MSComm1.PortOpen = False '关闭串口连接

VB codePrivate Sub MSComm1_OnComm()
Dim Buffer As Variant
Dim Hexbuffer() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
'告诉控件读入整个缓冲区
MSComm1.I…
[/Quote]
上述代码有句错误:If Hex(Hexbuffer) = 1 Then,漏了Hexbuffer数组的下标
Private Sub Form_Load()
Dim port As Integer
port = 1
With MSComm1
.CommPort = port '使用COM1端口
.Settings = "1200,O,7,1"
.InputMode = comInputModeBinary '采用二进制传输
.RThreshold = 1 '产生MSComm事件
.InBufferCount = 0 '清空接受缓冲区
.OutBufferCount = 0 '清空传输缓冲区
.InBufferSize = 1024
.PortOpen = True
End With
If Err Then '错误处理
MsgBox "串口通信无效"
End If
Text1 = ""
End Sub

Private Sub MSComm1_OnComm()
Dim Buffer As Variant
Dim Hexbuffer() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
'告诉控件读入整个缓冲区
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeBinary
Buffer = MSComm1.Input
Hexbuffer() = Buffer
Dim I As Integer
For I = 0 To UBound(Hexbuffer)
If Hex(Hexbuffer(I)) = 1 Then
Text1.Text = Text1.Text & "0" & Hex(Hexbuffer(I))
Else
Text1.Text = Text1.Text & Hex(Hexbuffer(I))
End If
Next I
End Select
End Sub
a512423966 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 a512423966 的回复:]
.InBufferCount = 0 '清空接受缓冲区
将这句话换成

Dim r() as byte
r()=.Input
[/Quote]

将这句话去掉吧
.InBufferCount = 0 '清空接受缓冲区
还有看看下面这些设置是否问题
.CommPort = port
.Settings = "1200,O,7,1"
.InputMode = comInputModeBinary
只有这样一点点试着找了
ghoster2008 2008-10-24
  • 打赏
  • 举报
回复
是啊,如果不用定时器,MSComm1_OnComm不会执行,现在MSComm1.CommEvent的值是3啊?不知道硬件又问题没有?
a512423966 2008-10-24
  • 打赏
  • 举报
回复
Private Sub Timer1_Timer()

Me.Timer1.Enabled = True
Call MSComm1_OnComm

End Sub

这段代码是为了 执行 MSComm1_OnComm 过程??
这个 MSComm1_OnComm 过程会自动执行,
因为你前面已经设置了
.RThreshold = 1
ghoster2008 2008-10-24
  • 打赏
  • 举报
回复
现在代码改成这样了:

Private Sub Form_Load()
Dim port As Integer
port = 1

With MSComm1
.CommPort = port
.Settings = "1200,O,7,1"
.InputMode = comInputModeBinary
'MSComm1.SThreshold = 1
.RThreshold = 1
.InBufferCount = 0
.OutBufferCount = 0
.InBufferSize = 1024
.PortOpen = True
End With

End Sub

Private Sub MSComm1_OnComm()

Dim Buffer As Variant

Dim Hexbuffer(0) As Byte

Select Case MSComm1.CommEvent

Case comEvReceive

MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeBinary
Buffer = MSComm1.Input

Hexbuffer(0) = AscB(Buffer)

For I = 0 To UBound(Hexbuffer)
If Hex(Hexbuffer) = 1 Then
Text1.Text = Text1.Text & "0" & Hex(Hexbuffer(I))
Else
Text1.Text = Text1.Text & Hex(Hexbuffer(I))
End If
Next I

Case comEvCTS
Debug.Print "123456789"

Debug.Print "Mscomm1.Event = " & MSComm1.CommEvent

End Select

End Sub

Private Sub Timer1_Timer()

Me.Timer1.Enabled = True
Call MSComm1_OnComm

End Sub
ghoster2008 2008-10-24
  • 打赏
  • 举报
回复
MSComm1.PortOpen = False这句已经注释掉了,现在问题是Mscomm1.comEvent的值是3,是这个comEvCTS 3 clear-to-send 线变化。
不知道这个值是什么意思?
a512423966 2008-10-24
  • 打赏
  • 举报
回复
MSComm1.PortOpen = False '关闭串口连接
注释掉试下,
怎么就接收一个 byte?就要求结束 ????
a512423966 2008-10-24
  • 打赏
  • 举报
回复
.InBufferCount = 0 '清空接受缓冲区
将这句话换成

Dim r() as byte
r()=.Input
ghoster2008 2008-10-24
  • 打赏
  • 举报
回复
还是没有解决啊!
luzhanping 2008-10-20
  • 打赏
  • 举报
回复
ding
ghoster2008 2008-10-18
  • 打赏
  • 举报
回复
我测试过,串口可以接受数据。现在就是不能触发comEvReceive,而且MSComm1.CommEvent的值为0,所以不能触发就收事件。
yaochunhui1982 2008-10-18
  • 打赏
  • 举报
回复
Dim a As Variant
Dim b() As Byte
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
a = MSComm1.Input

b() = a
Dim I As Integer
For I = LBound(b) To UBound(b)
If Len(Hex(b(I))) = 1 Then
Text1.Text = Text1.Text & "0" & Hex(b(I)) & " "
Else
Text1.Text = Text1.Text & Hex(b(I)) & " "
End If
Next I
End Select
zdingyun 2008-10-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ghoster2008 的回复:]
我测试过,串口可以接受数据。现在就是不能触发comEvReceive,而且MSComm1.CommEvent的值为0,所以不能触发就收事件。
[/Quote]
MSComm1.PortOpen = False '关闭串口连接
Private Sub MSComm1_OnComm() 
Dim Buffer As Variant
Dim Hexbuffer() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
'告诉控件读入整个缓冲区
MSComm1.InputLen = 0
MSComm1.InputMode = comInputModeBinary
Buffer = MSComm1.Input

Hexbuffer() = Buffer
Dim I as Integer
For I=0 To Ubound(HexBuffer)
If hex(hexbuffer) = 1 Then
Text1.Text = Text1.Text & "0" & Hex(Hexbuffer(I))
Else
Text1.Text = Text1.Text & Hex(Hexbuffer(I))
End If
Next I
End Select
End Sub
zdingyun 2008-10-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ghoster2008 的回复:]
刚才忘了解释,我要读取ic卡的数据,通过串口连接,vb代码如上。问题是怎么也触发不了MSComm1_OnComm事件。请各位大侠们帮助一下,不胜感激!
[/Quote]
LZ的代码可接收1字节的ASCII字符,然后就将串口关闭了,这是LZ的本意吗?
可以按2楼的意见"先用串口监视软件看看串口上是否有进来的数据。"
打死不掉牙 2008-10-17
  • 打赏
  • 举报
回复
你读取ic卡的命令呢,你不读哪来的返回啊,你把读的程序发上来看看!
of123 2008-10-17
  • 打赏
  • 举报
回复

先用串口监视软件看看串口上是否有进来的数据。
ghoster2008 2008-10-17
  • 打赏
  • 举报
回复
刚才忘了解释,我要读取ic卡的数据,通过串口连接,vb代码如上。问题是怎么也触发不了MSComm1_OnComm事件。请各位大侠们帮助一下,不胜感激!
书名:《Visual C++串口通信技术详解》(机械工业出版社.李景峰.杨丽娜.潘恒) PDF格式扫描版,全书分为16章,共368页。2010年6月出版。 内容简介 本书介绍如何利用Visual C++集成开发环境进行串口通信程序开发。书中精选来自工程实践的应用范例,主要涵盖串口通信的理论基础、Visual c++集成开发环境简介、MSComm控件串口编程、Windows API串口编程、TAPI通信编程、串口实现双机互连、串口调试精灵、串口控制Modem设备、串口控制单片机、串口控制PLC、串口控制射频卡、串口控制GPS模块、串口控制云台摄像头、智能报警系统、语音自动应答系统以及USB转RS-232串口实例等。 本书通俗易懂,内容翔实,层次分明,注重知识的系统性、针对性和先进性,注重基础理论与工程实践之间的相互联系。书中实例的源代码均在随书光盘中提供,以方便读者学习和使用。 本书可作为具有一定Visual c++使用基础的读者开发串口通信程序的参考书,也可作为科研单位、高等院校相关专业技术人员的参考书 目录 前言 第一篇 基础理论和基本方法 第1章 串口通信理论基础 1.1 接口技术 1.1.1 接口的定义 1.1.2 接口的基本功能 1.1.3 接口的基本控制方式 1.1.4 并行接口技术 1.1.5 串行接口技术 1.2 RS-232C标准 1.2.1 RS-232C电气特性 1.2.2 RS-232C连接器机械特性 1.2.3 RS-232C的接口信号 1.2.4 RS-232C的通信方式 1.3 RS-422/RS-485标准 1.3.1 RS-422简介 1.3.2 RS-485简介 1.3.3 RS-422/RS-485网络安装注意点 1.4 SPI总线标准 1.4.1 SPI总线原理 1.4.2 SPI总线特点 1.5 USB总线标准 1.5.1 USB总线总体结构 1.5.2 USB数据传输逻辑结构 1.5.3 传输类型 1.6 使用串口通信的典型外设 1.6.1 Modem 1.6.2 传真机 1.6.3 GPS接收机 1.7 实践拓展 第2章 Visual C++集成开发环境简介 2.1 面向对象程序设计与C++语言 2.1.1 面向对象程序设计概述 2.1.2 C++语言基础 2.1.3 C++的面向对象特性 2.2 Visual C++6.0集成开发环境 2.2.1 visual C++6.0开发环境 2.2.2 项目与项目工作区 2.2.3 应用程序向导App Wizard 2.2.4 集成开发基本操作 2.2.5 联机帮助文件 2.3 MFC应用程序的创建 2.4 实践拓展 第3章 MSComm控件串口编程 3.1 MSComm控件简介 3.1.1 MSComm控件描述 3.1.2 MsComm控件常用属性 3.1.3 MSComm控件其他属性 3.1.4 MSComm控件事件 3.2 MSComm控件编程步骤 3.2.1 加载MSComm控件到项目 3.2.2 初始化并打开串行端口 3.2.3 捕获串行端口事件 3.2.4 串行端口数据读写 3.2.5 关闭串行端口 3.2.6 程序发布问题 3.3 使用MsComm控件实现串口通信接收 3.4 实践拓展 第4章 Windows API串口编程 4.1 windows API串行编程概述 4.1.1 串行编程的数据结构 4.1.2 串行编程的Win32API函数 4.2 win32 API串口通信编程方式 4.2.1 打开串行端口 4.2.2 配置串行端口 4.2.3 读写串行端口 4.2.4 关闭串行端口 4.3 基于win32API函数实现串口通信发送程序 4.4 实践拓展 第5章 TAPI串口编程 5.1 TAPI概述 5.1.1 TAPI的含义 5.1.2 TAPI的体系结构 5.1.3 TAPI的服务类型 5.2 windows TAPI 2.x函数集 5.2.1 Windows TAPI编程流程 5.2.2 TAPI 2.x常用函数 5.3 使用TAPI实现电话拨打程序 5.4 实践拓展 第二篇 串口编程基础应用 第6章 串口实现双机互连 6.1 概述 6.2 通信协议及实现方案 6.2.1 异步串行通信 6.2.2 同步串行通信 6.3 实现代码分析 6.3.1 程序主体设计及关键模块分析 6.3.2 使用API通信 6.4 实践拓展 第7章 串口调试精灵 7.1 串口调试工具实现的基本要求 7.2 串口调试精灵的编程实现 7.2.1 软件功能及流程设计 7.2.2 程序界面分析 7.2.3 编程实现 7.2.4 使用测试 7.3 实践拓展 第8章 串口控制Modem设备 8.1 Modem接口 8.1.1 Modem简介 8.1.2 Modem工作流程 8.1.3 Modem通信方案 8.2 AT指令简介 8.2.1 Modem工作状态 8.2.2 AT指令集 8.3 使用Modem实现远程通信 8.3.1 使用单片机和Modem通信 8.3.2 使用PC和Modem通信 8.4 实践拓展 第9章 串口控制单片机 9.1 串口通信硬件设计 9.1.1 MCS.5 1系列单片机的串口原理 9.1.2 常用的接口芯片介绍 9.1.3 接口电路设计 9.2 串口通信参数设置 9.2.1 波特率设置 9.2.2 奇偶校验位的使用方法 9.2.3 通信协议约定 9.3 系统总体设计 9.4 单片机的串口编程方法 9.5 计算机端通信界面设计 9.6 计算机端程序设计 9.6.1 头文件引用及变量声明 9.6.2 控件加载及控件属性设置 9.6.3 发出读数据请求 9.6.4 接收数据的处理 9.6.5 关闭串口 9.7 实践拓展 第10章 串口控制PLC 10.1 PLC概述 10.1.1 PLC基本结构 10.1.2 PLC串行接口规范 10.1.3 通信协议 10.2 PLC串口通信 10.2.1 计算机与PLC之间的通信流程 10.2.2 PLC通信编程 10.3 实现代码分析 10.3.1 界面设计 10.3.2 程序设计核心代码 10.4 实践拓展 第11章 串口控制射频卡 11.1 射频卡概述 11.1.1 射频卡原理 11.1.2 射频卡分类及应用 11.1.3 典型射频卡模块 11.2 射频卡应用设计 11.2.1 读写器设计 11.2.2 基于射频卡模块的设计 11.3 实现代码分析 11.3.1 界面设计 11.3.2 串口通信程序设计 11.4 实践拓展 第12章 串口控制GPS模块 12.1 GPS系统的基础知识 12.1.1 GPS定位原理 12.1.2 GPS系统 12.2 LEA-4H型GPS模块的性能及其应用 12.3 NMEA-0183协议分析 12.3.1 NMEA-0183协议的定义 12.3.2 NMEA-0183数据信息 12.4 主机与GPS模块串口通信的程序实现 12.4.1 MSComm控件属性 12.4.2 添加MSComm控件 12.4.3 添加串口事件消息处理函数OnComm() 12.4.4 数据的接收与提取 12.4.5 实验结果及数据的显示 12.5 实践拓展 第三篇 串口编程高级应用 第13章 串口控制云台摄像头 13.1 云台摄像头 13.1.1 云台简介 13.1.2 摄像头及控制电路 13.2 云台控制协议 13.3 控制程序分析 13.3.1 添加控件 13.3.2 设置界面 13.3.3 主控程序 13.3.4 初始化 13.3.5 配置按钮 13.3.6 通信参数的设置 13.3.7 云台控制命令 13.3.8 旋转控制按钮和镜头控制按钮 13.4 实践拓展 第14章 智能报警系统 14.1 系统描述 14.2 系统分析与设计 14.3 关键技术 14.3.1 建立安防信息数据库 14.3.2 端口设置和定时读取I/O端口数据 14.3.3 判断是否有触发事件 14.3.4 启动并口控制的报警设备 14.3.5 根据设置拨打报警电话 14.3.6 安防日志管理 14.3.7 I/O端口通信 14.4 实现代码分析 14.4.1 创建项目 14.4.2 界面设计与实现 14.4.3 加入数据库支持 14.4.4 关键程序类的实现 14.5 实践拓展 第15章 语音自动应答系统 15.1 功能描述 15.1.1 TAPI介绍 15.1.2 功能介绍 15.1.3 实验要求 15.2 设计流程实现 15.2.1 程序设计流程图 15.2.2 TAPI 3.0方法介绍 15.2.3 串处理分析介绍 15.3 具体功能实现 15.3.1 程序主界面 15.3.2 参数配置 15.3.3 选择语音界面 15.4 实践拓展 第16章 USB转RS-232串口实例 16.1 USB总线技术简介 16.1.1 USB的特点 16.1.2 USB的体系结构 16.1.3 USB的电气特性 16.1.4 USB的数据通信协议 16.2 功能描述 16.3 USB总线转换芯片CH341简介 16.3.1 CH341异步串口工作方式 16.3.2 CH341功能配置 16.4 USB转RS-232桥接器硬件设计 16.5 驱动程序安装 16.6 实践拓展 附录 Modem AT命令集 参考文献
串行通信主要用了C# 中的SerialPort类 开发语言:C# 程序运行环境:.NetFrameWork 2.0以上版本 开发工具:Visual Studio 2008 C# System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步 I/O 和事件驱动的 I/O、对管脚和中断状态的访问以 及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Using System.IO.Ports。 串口的通讯参数 a.通讯端口号 [PortName]属性获取或设置通信端口,包括但不限于所有可用的 COM 端口,请注意该属性返回类型为String。通常情况下,PortName正 常返回的值为CO1、COM2……,SerialPort类最大支持的端口数突破了CommPort控件CommPort属性不能超过16的限止,大大方便了用户 串口设备的配置。 b. 通讯格式 SerialPort类对分别用[BaudRate]、[Parity]、[DataBits]、[StopBits]属性设置通讯格式中的波特率、数据位、停止位和校验位,其 中[Parity]和[StopBits]分别是枚举类型Parity、StopBits,Parity类型中枚举了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚 举了None、One、OnePointFive、Two。 SerialPort类提供了七个重载的构造函数,既可以对已经实例化的SerialPort对象设置上述相关属性的值,也可以使用指定的端口名称 、波特率和奇偶校验位数据位和停止位直接初始化 SerialPort 类的新实例。 3.串口的打开和关闭 SerialPort类是调用类的Open()和Close()方法。 4. 数据的发送和读取 Serial类调用重载的Write和WriteLine方法发送数据,其中WriteLine可发送字符串并在字符串末尾加入换行符,读取串口缓冲区的方法 有许多,其中除了ReadExisting和ReadTo,其余的方法都是同步调用,线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定 的时间值后,引发ReadExisting异常。 5.DataReceived事件事件类似于MSComm控件中的OnComm事件,DataReceived事件在接收到了[ReceivedBytesThreshold]设置的字符个数或接收到了文件结 束字符并将其放入了输入缓冲区时被触发。其中[ReceivedBytesThreshold]相当于MSComm控件的[Rthreshold]属性,该事件的用法与 MsComm控件的OnComm事件CommEvent为comEvSend和comEvEof时是一致的

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧