首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi中使用来自线程的串口组件TComPort (v4)中的事件?

在Delphi中使用来自线程的串口组件TComPort (v4)中的事件?
EN

Stack Overflow用户
提问于 2011-12-19 15:16:01
回答 1查看 6.4K关注 0票数 2

几年前,对于我的一个应用程序,我把我的串行处理移到了一个线程上,当某个应用程序必须对某些串行事件做出非常快速的响应时。

它在BDS2006中,有一个更旧的版本(大约3.x?)这是通过在tthread.execute中使用这样的代码来完成的:

代码语言:javascript
复制
    while ...
          begin
          events:=[evRxChar];
          { Prepare a stop event for killing a waiting communication wait. }
           try
             comport1.WaitForEvent(events,stopevent.handle,500);
             if evRxChar in events then
               ComPort1RxChar(comport1,comport1.InputCount); // method of thread.
           on e: exception do {only logs} ;
           end;

初始化就像

代码语言:javascript
复制
procedure TSerThread.initcomport(comportname:string='COM1');
begin
 comport1:=tcomport.create(nil);
 ComPort1.BaudRate:=br115200;
 ComPort1.DataBits:=dbEight;
 ComPort1.Port:=comportname;

 ComPort1.StopBits:=sbOneStopBit;
 ComPort1.Events:=[];
 ComPort1.Connected:=true;

 StopEvent := TEvent.Create(nil,{ManualReset}false,{InitialState}false,'StopEvent');
end;

rxchar方法使用comport1.readstr()读取

最近我不得不挖掘这个问题,并注意到它在我的Delphi中不起作用,它有tcomport4。在源代码中我看到一些备注,comport4已经改变了它处理内部线程的方式(“重叠”属性),但是默认值似乎是"true“,有一个注释”经典“,我

假设这意味着与旧版本兼容。

请注意,协议是二进制的,所有字符串、char<-> ansistring、ansichar更改都已完成,就像我在普通的主线程版本中所做的那样。

现在真正的问题是:

  1. 有人让tcomport4在线程中工作吗?
  2. 以上是否有明显的错误?
  3. 还是我需要迁移到另一个组件?

我仍然在调试正在发生的事情,但是我很匆忙,这是我发布这篇文章的时候,希望能快速获得指针。

更新

我重新安装了一个旧的turbo副本,并验证了它在那里与v3一起工作。我修正了一个小错误,尽管在代码描述中,它与我想的有一点不同(不是在上面的代码中)。

这允许我更好地描述dxe/comportv4 4和dxe 2006/comportv4 3之间的行为;v4代码生成更多读取事件(数百/秒)。看起来,read并没有从传入队列中删除读字符。

更新2

我对最新版本进行了快速测试,并进行了必要的重新安排(基本上是二进制协议使用了杀死字符串函数)。我被困了一段时间,因为应用程序在启动时崩溃了,但这是因为我使用gnugettext,而Comport包则是不同的(非unicode?)版本。但是在那个之后,它就可以运行了。

不幸的是,将这些更改传播回生产版本(完全编写协议解码)有一定的风险,因此我将不得不使用inbetween ( 4.0到4.11f)进行测试。我会在适当的时候这样做,有什么建议吗?最后一个版本是readstr(ansistring)?

更新3

最后,我简单地重命名了4.11f单元,并将它们与旧版本并行使用,使用4.11f作为线程代码库,使用旧代码维护现有代码。

长期而言,我可能只是简单地采用了等待程序代码,并制作了自己的版本。它的主要问题是afaik无法查看等待是否在超时、停工或其他情况下终止。这意味着,如果想要定期发送,就需要另一个计时器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-19 20:44:04

您需要升级到最新的稳定版本4.11版本这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8563368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档