回 帖 发 新 帖 刷新版面

主题:[原创]在Vfp9中用Mscomm.ocx控件进行串口通信的经验

近来,本讨论区中不断有人提及串口接、发的问题。现把本人多年来积累的经验贴出来。

Vfp9的Mscomm.ocx控件传递数据时需要使用二进制字符型数据。在 Visual FoxPro 中,二进制数据可以包含在字符串中。但 ActiveX 控件和 OLE 对象中的字符串 (OLE VT_BSTR 数据类型) 不能包含二进制数据。ActiveX 控件和 OLE 对象通过 VT_UI1 类型数组与 Visual FoxPro 传递二进制形式的数据。

ActiveX 控件和 OLE 对象通过 VT_UI1 类型的数组将二进制数据传递给 Visual FoxPro后。Visual FoxPro 自动将它转换为 Visual FoxPro 字符串的形式,但 Visual FoxPro 内部会把由 ActiveX 控件和 OLE 对象传递来的字符串标记为二进制字符串。当需要把数据传回 ActiveX 控件和 OLE 对象时,Visual FoxPro 再自动将它们转换为 VT_UI1 类型的数组。

如果您需要把一个 Visaul FoxPro 字符串传递给 ActiveX 控件和 OLE 对象,您必须首先使用 CRETEBINARY()函数将它转换为二进制字符串形式。


Vfp9的Mscomm.ocx控件,对Ascii码0——255的发送与接收的方法:

发送端:如发送Ascii码为167的字符,
......................
Thisform.olecontrol1.Output=Createbinary(CHR(167))
......................

接收端:
......................
cString=transform(This.Input)
?cString    && 显示167的十六进制字符“A7”

欢迎讨论!不妥处请VfpFans指正。

回复列表 (共15个回复)

11 楼

我在机器上测试了,我的方法目前没有发现错误。
你可以实际测试一下,最简单的方法如下:
1.找一个串口线(串口鼠标线等),把发送TXD(3脚)、接收RXD(2脚)两个线短接,或者在电脑关闭的情况下,用一条导线直接短接。串口端子(RS-232)的的引脚分布在网上可以查到。
2.建立一个表单,加入控件mscomm.cox、按钮、文本框、编辑框各一个。
按钮的clik代码:
If Thisform.olecontrol1.portOpen=.T.
 Thisform.olecontrol1.portOpen=.F.
Endif

Thisform.olecontrol1.InputLen =0 &&设置或返回接收缓冲区内用Input读入的个数。若取0,则INPUT读取整个缓冲区的内容。
Thisform.olecontrol1.CommPort=1    &&选择com1口,根据实际情况可改为1、2、3、4、5、6等
Thisform.olecontrol1.settings="57600,n,8,1" &&波特率为57600
Thisform.olecontrol1.RThreshold=1 &&下位机发1个字节时,控件MsComm产生一次OnComm(CommEvent=2)接收事件。
If !Thisform.olecontrol1.portOpen
 Thisform.olecontrol1.portOpen=.T.
Endif
Thisform.olecontrol1.Output=0h00    && 发送0h00.用下面两行代码也行
*****************************************************************************
*A1="00"    &&发送“00”ascii码。在这里改写不同的ascii码进行测试        
*Thisform.olecontrol1.Output=Createbinary(CHR(EVALUATE('0x'+A1)))
*****************************************************************************
Thisform.edit1.Value=""

mscomm.ocx的oncomm事件代码:
If This.CommEvent=2        &&事件方式    
 A1=This.Input
 A2=TRANSFORM(A1)
 thisform.txet1.value=A2  &&可换为A1测试
 thisform.combo1.value=A2 &&可换为A1测试
endif

12 楼

很好,有讨论更有进步...

13 楼

自己再顶一下,使更多的人参考。
[em18][em5]

14 楼

感谢楼主分享
用Createbinary()是正确的,传递二进制数据必须用该函数转换。
Thisform.olecontrol1.settings="57600,n,8,1" 这样设置是8位数据,我现在单片机需要用方式3工作,传递9位数据,该怎么办?

15 楼

本新人正準備學如何運用接口技術來連接外設.比如條碼掃描儀,IC卡感應器,我想樓主一定有比較合適的資料或書籍可以提供.不知可否分享一下呢?

我来回复

您尚未登录,请登录后再回复。点此登录或注册