串口控件(mscomm32.ocx)引发的C0000005错误

十豆三 2014-06-19 02:59:12
测试表单下载

1、例子中可以通过 RegSvrControl.bat 注册串口控件(mscomm32.ocx),如果是 Windows 7,需要管理员权限。
2、测试表单 form1 中只有2个控件,如下图:

表单 Init 事件代码如下:
This.olecontrol1.RThreshold=1				&& 设置当接收缓冲区中接收到 RThreshold 个字符后,就产生一次OnComm事件。
This.olecontrol1.Settings="9600,N,8,1" && 以字符串的形式设置串口的波特率、奇偶校验位、数据位数、停止位。
This.olecontrol1.CommPort=1 && 串口号
This.olecontrol1.PortOpen=.T. && 打开串口


表单 Load 事件代码如下:
On Error Quit		&& 遇到错误退出


串口控件的 Name 为 olecontrol1,其 OnComm 事件代码如下
*** ActiveX Control Event ***
Use 打开不存在的表为了报错 && 程序执行此句将报错,将触发 On Error


按钮控件的 Name 为 command1,其 Click 事件代码如下:
Thisform.olecontrol1.OnComm()		&& 单独调用串口控件的 OnComm 事件。


*----------------------------------
测试时电脑串口需要连接1个设备,我测试是连接了一个232通讯方式的ID卡读卡器,刷卡时向串口发送卡号,
如果有测试条件的网友可以使用任意能向串口发送数据设备均可。

运行表单:
1、手动点击 command1 按钮,程序执行了串口控件 OnComm 事件,因为此事件的 Use 代码报错,程序直接退出,这是正常的,因为设置了 On Error。
2、不手动点击 command1 按钮,而是向读卡器刷卡,也会触发串口控件 OnComm 事件,这时 VFP 就发生了:致命错误 C0000005,最近写程序无意发现了此问题,不知道是什么原因,
当然可以通过 Try ... Endtry 执行 Use 代码来避免发生 C0000005 错误。我更想弄明白这其中的原因。

如果不设置 On Error Quit 也不会发现此问题,实际我的程序 On Errror 是执行一个过程,有很多处理代码,为了测试方便,此例设置成了 On Error Quit

用 USB 转串口及电脑自带串口测试也都是这样,换过电脑也是这样,所以应该与硬件无关。

我在 XP(SP3)+VFP9.0(SP2 7423) 及 XP(SP3)+VFP6.0(8167) 测试都是这样。

希望有测试条件的网友帮忙测试反馈,能指出其中原因当然最好了。
...全文
627 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
whinda 2016-03-22
  • 打赏
  • 举报
回复
VFP和mscomm建立通信后,申请了一块内存建立缓冲buffer 1.从Commandbutton发出的Oncom事件并不会向buffer中写入数据,写表出错直接清理占用内存,退出。 2.由串口触发Oncom事件,先执行用户自义程序写表出错清理内存,而此时mscomm尚占用buffer并写入,VFP试图清理被占用的buffer,当然是致命错误了。
G1QHTZ 2014-11-03
  • 打赏
  • 举报
回复
找串口监控软件看看按COMMAND1与否时刷卡时所返回应答码是否一致
G1QHTZ 2014-11-03
  • 打赏
  • 举报
回复
试下换一个串口设备看看
十豆三 2014-06-24
  • 打赏
  • 举报
回复
引用 4 楼 Taidy_Du 的回复:
试了一下,WIN7 + VFP9 SP2(6602)的。 我的用一个设备连接测试。没有向设备读取数据及发送数据,均不会报错。因为不存在INPUT 或 OUTPUT。 但若INPUT 字节时,绝对会触发ONCOMM事件,那当然会报错了, 不知我表达有问题吗。
我的意思是,报错可以,不应该出 C0000005。
Taidy_Du 2014-06-24
  • 打赏
  • 举报
回复
试了一下,WIN7 + VFP9 SP2(6602)的。 我的用一个设备连接测试。没有向设备读取数据及发送数据,均不会报错。因为不存在INPUT 或 OUTPUT。 但若INPUT 字节时,绝对会触发ONCOMM事件,那当然会报错了, 不知我表达有问题吗。
十月鹰飞 2014-06-23
  • 打赏
  • 举报
回复
C0000005错误大多和环境有关系,还是多从运行环境上找找思路,杀毒软件,操作系统等都有可能造成这种错误
trainee 2014-06-20
  • 打赏
  • 举报
回复
有没有将autoyield 设为 .f. ?
十豆三 2014-06-20
  • 打赏
  • 举报
回复
引用 1 楼 trainee 的回复:
有没有将autoyield 设为 .f. ?
_vfp.AutoYield=.T. 或 .F. 还是一样会出 C0000005。

2,748

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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