尝试进行串口通信,返回0x102作为返回码

时间:2011-08-18 17:12:59

标签: c# c++ serial-port

我正在使用C#中的程序,该程序通过串行端口与一块硬件进行通信(所述串行端口通信由C ++库处理)。它旨在取代已经变得无法维护的早期软件。目前,它根本不是我想要的。在我的工作笔记本电脑上,使用旧程序工作正常。使用旧程序与旧DLL工作正常。使用在调试模式下编译的DLL的新程序失败(以前,我能够在发布模式下编译DLL并使其工作,但从那时起,项目中的设置已更改,导致它甚至在发布模式下失败) 。具体来说,我用串口监视器跟踪它,当我发送SOM(消息开始)时。我发送“IRP_MJ_DEVICE_CONTROL(IOCTL_SERIAL_IMMEDIATE_CHAR:传输立即字符),DOWN,TRUE,0x0,3A,:”这似乎成功了。然后我做了一个“IRP_MJ_READ,DOWN,FALSE,0x0 ,,”,回答为“IRP_MJ_READ,UP,FALSE,0x102 ,,”错误。使用非调试DLL时,会发生完全相同的事件序列。

我一直无法找到对0x102的引用作为返回码,并且不是每个人都遇到同样的问题。我在太平洋另一边的同胞偶尔会看到这个错误,但只有在通过虚拟机运行时(他在Windows 7上运行,但我们最近需要为在VM上运行的XP开发。

任何人都有任何想法,这可能是什么情况?

更新

好吧,根据我的老板,显然转移到.Net是不行的。遗产原因。我有超过10秒的超时时间,它仍然超时在调试模式下编译的DLL。我发现当在软件的发布模式下运行时,看起来呼叫是通过rpcld.exe路由的,这与Absolute Software的LoJack防盗系统有关。在调试模式下编译时,不会进行此类调用。让我想知道串口是否被锁定,除非有人通过那里。为了以防万一,我已经与他们的一位客户服务代表留言。这可以解释为什么它在我的对手的计算机上工作,直到他进入虚拟机。

1 个答案:

答案 0 :(得分:1)

MS说0x102是NTSTATUS意思

  

给定的超时间隔已过期。

http://www.stallion.com.au/html/userdoc/easyadmw/easyadmw_2.html说了类似的话

  

上次状态这是最后一次读取IRP的NT_STATUS代码   (IRP_MJ_READ)由司机完成。实际代码可以解码   从NT DDK文件'ntstatus.h',但除了的任何值   通常考虑STATUS_SUCCESS(0x0)或STATUS_TIMEOUT(0x102)   错误。

在与此设备通信时,可能需要修改新的DLL以使用更高的超时...

或者您只是丢弃DLL并使用SerialPort类...

几个有用的链接:

修改
根据OP的注释,读取超时设置为1000 ms(超时=间隔*乘数+常数),因为乘数为0,常量为1000(ms)是读取操作的使用超时。

编辑2 - OP更新后:

你没有提供原始邮政中这类设备的信息 - 这类设备通常采用某种“反调试”技术......这可能就是你所看到的......这些措施由于使用了这样的设备而实现:使用调试器可能会损害设备的效率......因此,为了能够制作这样的设备,您需要实施一些措施,使其至少在任何攻击者身上都难以实现。没有这样的计划是100%安全的......