请教在 VFP 中使用 winsock 控件的问题

来源:互联网 发布:python求不定积分 编辑:程序博客网 时间:2024/05/16 08:33

我在VFP中用winsock控件开发一个与单片机通讯的程序,接收单片机中保存的数据。该控件的DataArrival事件中主要代码

但发现单片机发来的数据中凡Ascii码小于128的都可正常接收,大于128的字符如果成对出现(例如汉字),也可以正常接收。但如果不成对就会出现异常,例如单片机发出的是 chr(165) + chr(3), 实际收到的却是0x3F。不仅不对还丢失了一个字符。如果是一串字符,凡不是成对出现的Ascii码大于128的均被丢失。我修改GetData第二个参数无论是8还是17,或者是其它任何值,均无作用。请问能有办法解决吗?有个某人重新做了个WINSOCK,可以免除这种情况,明天发给你
当发送ASCII码大于128的控制符无法发送的问题 。
如果ASCII码大于128用CREATEBINARY函数转换就可以发送了。
我现在主要是接收不到不成对出现的 Ascii 码大于128的字符。例如单片机发出的是 chr(165) + chr(3), 实际收到的却是0x3F。不仅不对还丢失了一个字符。还真没试过这种,你试试用TCP的调试软件看能不能接到完整的字符

我个人认为是VFP在与控件传递数据时对收到的数据内部自动做了代码页转换造成的。

VFP帮助中是这样说的:ActiveX 控件和 OLE 对象通过 VT_UI1 类型的数组将二进制数据传递给 Visual FoxPro后。Visual FoxPro 自动将它转换为 Visual FoxPro 字符串的形式。

我想这说的控件的函数返回值或属性返回值。不幸的是,传址返回数据如果类型不是数值型依然会发生代码转换。
如果你一定要用VFP来传这样的数据,要用数值类型的变量来接收数据是可以的,但这时又来了一个问题,就是VFP会自动从接收数据缓冲区中以4字节来接收,且小于4字节时GetData指令将不被执行。这样实际操作时的问题是,如果bytestotal的值不是4的整数倍,则余数字节会保留在接收缓冲区内,与下一次接收到数据合并到一起。例如,如果接收到是7个字节,那么用GetData(@r)(前面要用r=0)后可以取出4个字节,再用一次Getdata(@r)则什么都没做,剩下的3个字节还会保留在接收缓冲区中,但下次再来数据这3个字节是不会丢失的,而是和新数据合并在一起,bytestotal的值也是新数据的字节数加3。假定你的数据传是永不停止的,那就可以自己在处理接收数据时分开每次接收的数据;若数据是间歇性接收的,且不能保证收到的数据字节数是4的整数倍,就真的不好办了,因为会有小于4的那几个字节要长时间无法取出处理。
不知我说明白了没有。

如果楼上分析正确的话,试试用 17 作为 GetData 的接受数据类型参数,并在调用 GetData 前用 ComArray(WinSock控件名, 1000) 设置为字节数组不做转换。
这个我试了,也不行啊。dkfdtf能不能写一个完整的示例出来啊,有关这个问题困扰我很久了。
如果哪位大侠很好的解决了这个问题,我可以另外开贴给分的,呵呵,请大家多给些意见吧!

在我以前用winsock控件时,并未感觉到有楼主出现的现象。只要数据符合文本文件格式,就都可正确的接收。
但该控件无法处理二进制数据,比如 chr(0)。所以也就放弃了对该控件的使用
本人做过一个简单的药店管理系统,其实很多时候用户也不知道他们想要的是个什么东西,等你做好了才说这里不行,那里不行,非常让人头疼。无休止的更改,直到你筋疲力尽。
建议你你找一个成功的医药管理软件用用看看,然后再做自己的。

老天,不要编错了会不会卖错药给客户?我以前老家就有过这样一个笑话(人救活了,才敢说笑话)
有一个人到卖药店那里说要买打虫的药,那药店就给他包了给猪打的药,结果不曾想是人吃的,就搞出了大麻烦.

来源:nba直播

原创粉丝点击