如何在动态链接库中打开计算机端口(如串口),让主程序能够通过该端口收发数据 ( 积分: 50 )

  • 主题发起人 主题发起人 jamcky
  • 开始时间 开始时间
J

jamcky

Unregistered / Unconfirmed
GUEST, unregistred user!
苦战了好几天,都没法解决这个问题,主程序调用dll打开串口后(使用spcomm),能够发送一次数据,但下次就发送不了了,跟踪进去后发现spcomm的:
PostThreadMessage( WriteThread.ThreadID, PWM_COMMWRITE,WPARAM(dwSizeofDataToWrite), LPARAM(Buffer) ) 的返回值为false,估计WriteThread.ThreadID已经退出,不知道各位有什么方法可以解决这种现象。
 
苦战了好几天,都没法解决这个问题,主程序调用dll打开串口后(使用spcomm),能够发送一次数据,但下次就发送不了了,跟踪进去后发现spcomm的:
PostThreadMessage( WriteThread.ThreadID, PWM_COMMWRITE,WPARAM(dwSizeofDataToWrite), LPARAM(Buffer) ) 的返回值为false,估计WriteThread.ThreadID已经退出,不知道各位有什么方法可以解决这种现象。
 
可能是Handle的问题,Dll里面有Form吗?是不是动态建立的
没有的话要改一下代码,我以前修改过SPComm的代码
 
开始使用没有Form的模式,发现不行,我以为是dll没法保持,所以加上了Form,在Form上打开,还是不行。
 
那就明白了,修改一下SPComm的代码。在Create和Destroy两个函数
那有个分配Handle的,它会判断是不是在设计状态的,把那个判断去了,就是说直接建立Handle,但是这样你就不能用Form了,先看看行不行
 
把spcomm编译后,在编译dll,还是不行,他在第一次发送完数据后, TWriteThread.Execute中
PostMessage( hComm32Window, PWM_SENDDATAEMPTY, 0, 0 )返回False,导致线程退出。
 
跟踪一下,Handle是多少,分配对了没有,另外用GetLastError看看是什么错误
如果查不到就把GetLastError的值贴上来,我帮你看
 
没问题,分配的值是:5966348,而且第一次发送的时候也是用的这个值,此时GetLastError值为0,第二次发送的时候,GetLastError值为1444(无效的线程标识。),也就是说,5966348已经退出,利用线程查看器也发现少了3个线程,但我始终没有跟踪到关闭线程的情况。
 
而且,串口资源并没有释放,重新调用stop、start也不行。
 
这还真是奇怪了,如果不在DLL正常吗?怀疑是不是DLL的问题
 
既然都做到DLL中了,再使用Spcomm不太合适吧?
换一种思路:自己用API函数封装一个类,再输出一个接口供程序调用即可;
参考:
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3154927
 
要是不用dll,一切正常,我估计是dll的问题,但就是找不出原因,使用api不是不行,就是麻烦了点,而且,我还可能需要使用的网络,到时会利用indy控件,这样做起来方便。如果实在没办法,我也只好使用api了。
 
这几天看了几个帖子,我想是不是Application等一些没有传进去去的原因
其实和API没有什么关系,SPCOMM里面的那些东西也是要用API实现,只是数据协调做得好些。不管如何你都需要线程去读串口,这个没有问题的,SPComm起了两个线程,我想如果可以确保在线程在DLL正常,那么估计spcomm也正常了,简单测试一下
 
终于解决了,原来初始化接口不能用另外线程,必须是谁使用谁初始化,否则,初始化线程退出后,接口的线程也相应退出了。都是我的大意,感谢chenybin给我的支持。不过,没法接收到数据,明天再调测调测吧。
 
后退
顶部