如何在DLL中控制简单RS232问题,但是我就搞不明白?(200分)

  • 主题发起人 主题发起人 z1234
  • 开始时间 开始时间
Z

z1234

Unregistered / Unconfirmed
GUEST, unregistred user!
我在DLL中使用CPORT控件向串口发送命令,如:Port.WriteStr('dddd');可是数据就是不向串口传送?但是如果我重新建立一个单独的EXE项目,然后将该Unit直接原封不动添加进来后编译运行,一切OK!还有如果我在DLL项目中在每个发送命令下添加一个Showmessage('**')也就一切OK了!这是怎么一回事呢?
我同时也试了MSCOMM32.OCX控件现象也一样,而且在调用程序关闭时还报错。
 
是不是封装的有问题呢,觉得是有点奇怪的。
 
应该不是封装,我是把控件放在一个DLLForm上。然后在宿主程序调用show DLLForm,然后再控制控件是不是与这个有关。
 
汇报一个情况我把显示DLLFORM 的方法由Form.Show 改为Form.ShowModal就OK了,为何??
 
可能是你在创建对象时有问题.
 
"创建对象时有问题“您能说得清楚些吗?是指创建什么对象?我已经尝试把代码最精简了。除了程序默认得就只用了通信控件,对于通信控件我也全部使用默认值,可是结果还是一样。
 
就用ShowModal吧,我也是这么用的。原因我不太明白呢。借楼主地方问个问题,希望有经验的大虾回答一下:在spcomm中,有几个属性会将接收、发送的数据自动替换掉,比如#11,#19等,是怎么回事
 
在dll中你的CPort对象必须先创建,并且打开端口。你可以在wirtestr前判断是否
已经打开端口,如果没有则打开后再发送。
 
我在DLL代码中并未有专门的创建对象的代码,全取默认值。当然在写端口时一定是要先打开端口的,否则控件会报错。而且我在打开了端口后也加入了检查代码确保端口已经被打开。
 
ShowMessage('*')能发送
那你有没有试sleep(50)?
 
不行,不仅不能发送。我曾经尝试在可以成功发送的情况下Sleep()甚至导致无法接受,我想是因为Sleep()时整个程序都处于休眠状态所以错过了接收。
 
在dll中定义ComPort_Comm为全局变量.
ComPort_Comm:=TComPort.Create(Application);
 
没用过CPort
基本上都是自己用API来实现
估计CPort也是用异步方式来实现通讯
否则在2000下不能同时读与写
所以你可以试试
发数时
定义一个全局变量
然后将数据存入这个变量
发送时使用这个全局变量做为指针试试
 
恕我水平比较低,有些看不明白。
yanghai0437您的意思是在Create from之前就创建ComPort_Comm吗?但是我的CPort控件是在From上的呀?而且TCommPort从何二来?

Mike1234567890我是调用CPort的WriteStr过程这样可以使用指针吗?可不可以给几段代码?
但是我总觉得这是因为该控件所所基于的Form类似于没有得到焦点,或是尽早的被Free掉这样一种类型的问题。
 
用Mscomm32.ocx又稳定又安全.
你的DLL文件应该一样不会有太大的区别
 
我早就用过MSCOMM32了,不行!但是最近改用SPCOMM就OK了,问题是必须要让SPCOMM所在的FormShow否则无法接受,但是毕竟不需ShowModal还是个进步。请问高手这是为何??
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部