用MSCOMM控件发送十六进制数据怎么处理

dfwxj 2009-02-16 12:07:06
豆兄:
我要用MSCOMM控件发送十六进制数据,该怎么写?

我要发送的是:AA BB 00 01 01 02 03 04,中间用空格隔开的
...全文
515 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
dfwxj 2009-02-26
  • 打赏
  • 举报
回复
THISFORM.LIST1.ADDITEM(str(out1))是对的,接收到的就是数字,而我需要的也是数字,不需要转换了

加延时可能不行,因为我的终端会很多的,一千多个呢,怎么能保证正确接收啊,看来必须通过标志进行数据收发
十豆三 2009-02-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dfwxj 的回复:]
不行,INT事件中就是这样写的,问题是我返回的是原样数据,应该返回170、187、0、1、1、2、3、4这8个数,有时只返回一个,有时返回5个
InBufferSize=256
InputMode=1
RThreshold=1
Settings="9600,n,8,1"
8个数在单机端是分八次发送的,数据为8位,最大为255,即0xFF。
为了减少发送数据的次数,我想发送256的倍数和余数,这样两个数最大能达到十进制的255*256+255=65535
[/Quote]

你用超级终端接收试一下,看看能不能接到全的数据,如果能,就是程序有问题。如果不能就不好说了。
aabiao 2009-02-25
  • 打赏
  • 举报
回复
1.THISFORM.LIST1.ADDITEM(str(out1)) 中的STR(OUT1)应该用str(ASC(out1))吧?
2.丢数据的原因会不会是用VFP接收处理,速度跟不上呀,处理程序复杂吗?在单片机上加延时看看。
dfwxj 2009-02-24
  • 打赏
  • 举报
回复
是不是需要建立通信协议,接收完一个数据后,发送标记让单片机发送第二个数据
十豆三 2009-02-23
  • 打赏
  • 举报
回复

在FORM的Init事件加代码:

With This.Ole_MsCom
If .PortOpen=.T. &&判断是否已打开串口
.PortOpen=.F. &&关闭串口
Endif
.InBufferSize=1024 &&设置接收缓冲区的大小,缺省值为1024字节。
.InputLen=0 &&设置一次从接收缓冲区中读取的字节数。默认值为0,表示读取整个缓冲区的内容。
.InputMode=0 &&设置接收数据的类型。0为文本型,1为二进制型。
.RThreshold=1 &&设置当接收缓冲区中接收到一个字符后,就产生一次OnComm事件。
.RTSEnable=.T. &&握手,要保证数据传输成功,必须对接收和发送缓冲区进行管理。例如,要保证接收数据的速度不超出缓冲区的限制。
.Settings="9600,E,7,1" &&以字符串的形式设置串口的波特率、奇偶校验位、数据位数、停止位,这个根据你的情况设定。
.CommPort=1 &&设置串口号,其取值范围为1~16。建议此处用变量
.PortOpen=.T. &&打开串口
Endwith



.RThreshold=1 &&设置当接收缓冲区中接收到一个字符后,就产生一次OnComm事件

然后在OnComm事件中将得到的数据覆给一个变量,再通过标识符(你的数据的开头或结尾应该有标识吧)将要的数据截取出来。
这个你可以参考我的这个例子:
http://download.csdn.net/source/507162
dfwxj 2009-02-23
  • 打赏
  • 举报
回复
解决了

thisform.Ole_MsCom.output=CREATEBINARY(chr(170)) &&0xAA
thisform.Ole_MsCom.output=CREATEBINARY(chr(187)) &&0xBB
thisform.Ole_MsCom.output=CREATEBINARY(chr(0))
thisform.Ole_MsCom.output=CREATEBINARY(chr(1))
thisform.Ole_MsCom.output=CREATEBINARY(chr(1))
thisform.Ole_MsCom.output=CREATEBINARY(chr(2))
thisform.Ole_MsCom.output=CREATEBINARY(chr(3))
thisform.Ole_MsCom.output=CREATEBINARY(chr(4))

接下来的问题是:接收返回数据时丢包

我是在ONCOMM中这写的:

out1=THISFORM.Ole_MsCom.INPUT()
THISFORM.LIST1.ADDITEM(str(out1))

不能正确完整地接收8个数据
dfwxj 2009-02-23
  • 打赏
  • 举报
回复
不行,INT事件中就是这样写的,问题是我返回的是原样数据,应该返回170、187、0、1、1、2、3、4这8个数,有时只返回一个,有时返回5个
InBufferSize=256
InputMode=1
RThreshold=1
Settings="9600,n,8,1"
8个数在单机端是分八次发送的,数据为8位,最大为255,即0xFF。
为了减少发送数据的次数,我想发送256的倍数和余数,这样两个数最大能达到十进制的255*256+255=65535
dfwxj 2009-02-20
  • 打赏
  • 举报
回复
头昏,只能返回最后一个字符。
算了,还是在单片机上做文章吧,要不就用一个VB的DLL
十豆三 2009-02-19
  • 打赏
  • 举报
回复
试试:

thisform.comm1.output=CREATEBINARY("AA BB 00 01 02 03 04")
dfwxj 2009-02-18
  • 打赏
  • 举报
回复
Thisform.OLe_MsCom.Output="0xAA BB 00 01 01 02 03 04"

Thisform.OLe_MsCom.Output="AA BB 00 01 01 02 03 04"

都不行的,

VB下:

dim aa(8) as byte
aa(0)="AA"
aa(1)="BB"
.
.
.
mscomm.output=aa

有VFP例程:
for i=0 to 255
thisform.comm1.output=createbinary(chr(i))
endf

可我测试无效
十豆三 2009-02-16
  • 打赏
  • 举报
回复
你的设备说明是什么样,最好有VB等程序例子。

也可以用FOPEN()打开串口,然后用FWRITE()或FPUTS()写字符串。
十豆三 2009-02-16
  • 打赏
  • 举报
回复
Output 向传输缓冲区写一个字符串

是这样:
Thisform.OLe_MsCom.Output="0xAA BB 00 01 01 02 03 04"
还是这样:
Thisform.OLe_MsCom.Output="AA BB 00 01 01 02 03 04"

关键是你的设备能够识别送过去的16进制字符串

2,723

社区成员

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

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