问题标签 [tcomport]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
6232 浏览

delphi - 在 Delphi 的线程中使用串行端口组件 TComPort (v4) 中的事件?

几年前,对于我的一个应用程序,当某个应用程序必须非常快速地响应某些串行事件时,我将串行处理转移到一个线程中。

它在 BDS2006 中,具有较旧的版本(一些 3.x?)它是通过在 tthread.execute 中有这样的代码来完成的:

初始化就像

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

我最近不得不对此进行挖掘,并注意到它在具有 tcomport4 的 Delphi XE 中不起作用。查看源代码我看到comport4已经改变了它处理其内部线程(“重叠”属性)的方式,但默认似乎是“true”有一个评论“经典”,我

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

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

现在真正的问题是:

  1. 有人有 tcomport4 在线程中工作吗?
  2. 上面有明显的错误吗?
  3. 还是我需要迁移到不同的组件?

我仍在调试正在发生的事情,但我很着急,这是我发布这个希望快速获得指针的时候。

更新

我重新安装了一个旧的 turbo delphi 副本,并验证它与 v3 一起工作。我在代码路径中修复了一个小错误,它与我的想法有点不同(不是在上面的代码中)

这让我可以更好地描述 dxe/comportv4 和 bds2006/comportv3 之间的行为;v4 代码生成更多的读取事件(数百次/秒)。似乎读取并没有从传入队列中删除读取的字符。

更新 2

我对最新版本进行了快速测试,并进行了必要的重新排列(杀死字符串函数用于本质上的二进制协议)。我被卡住了一段时间,因为应用程序在启动时崩溃了,但那是因为我使用了 gnugettext,而 Comport 打包了一个不同的(甚至非 unicode?)版本。但在那之后它起作用了

不幸的是,这些更改传播回生产版本(完全编写的协议解码)有点冒险,所以我必须测试中间版本(4.0 和 4.11f 之间)。我会在适当的时候这样做,有什么建议是最后一个 readstr(ansistring) 版本吗?

更新 3

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

从长远来看,我可能会简单地采用 waitforevent 代码并制作自己的版本。它的主要问题是无法查看等待是否在超时、停止事件或其他情况下终止。这意味着如果您想定期发送,则需要另一个计时器。

0 投票
1 回答
753 浏览

delphi - TComPort 行为怪异

我有一个 SMS 网关,我使用 AT 命令控制该组件工作正常,但我无法正确解析从设备接收到的字符串。

首先我使用硬件流控制这对我有什么影响?

我使用 TComDataPacket 组件,女巫有一个事件 onPacket(),如果我使用调试器,我会收到一个字符串,但如果我使用 pos() 搜索或 ShowMessage() 显示字符串,则字符串非常短我没有看到任何#00

我尝试使用 RxChar 事件,但没有被触发,并且 RxBuf 给出了访问冲突。

我使用 Delphi XE 2 组件有什么问题还是我做错了什么?

LE:如果我不在方法末尾插入睡眠,事件 onPacket() 将冻结这是我的代码:

0 投票
3 回答
4091 浏览

c# - 使用 C# 进行 RS-232 通信

大家好,我想使用 c#,VS10 通过 rs-232 串行发送/接收数据......我这样做的代码如下......

我将此应用程序安装在两台电脑上,并使用 rs232(均为女性端)进行通信。但是我通过发送按钮从一台电脑发送的数据没有被另一台电脑接收到......我现在该怎么办......

0 投票
1 回答
4354 浏览

delphi - 如何以另一种形式使用 RxChar ComPort

我有德尔福代码的问题......我有代码:

主要形式

儿童表格:

我想以子形式显示从我的设备输入的数据到备忘录。我将 comport 组件放在主窗体中。但是当我运行程序时,它说:

项目 Data.exe 引发异常类 EAccessViolation,并带有消息“模块“Data.exe”中地址 00466051 的访问冲突。读取地址 000002F8'。进程停止。使用 Step 或 Run 继续。

我该如何解决这个问题?

0 投票
1 回答
877 浏览

windows - TDataPacket 和 TComPort 等到收到数据包

我正在开发 ecr 软件。

该软件与具有 com 端口的硬件对话。

我在 delphi 中编程,我正在使用 TComPort 和 TDataPacket 组件。

我有一个问题(我想,或者我不明白 tdatapacket 是如何工作的)。

为了打印收据,我必须向硬件发送一些由协议规则格式化的字符串。

打印的协议是这样的:

我:ENQ

硬件:确认

我:STX + 字符串 + 校验和(字符串)+ ETX

硬件:确认

我:STX + 字符串 + 校验和(字符串)+ ETX(结束字符串)

HW:确认并打印收据

我写了这段代码:

并在数据包事件上的数据包上:

但是如果我尝试打印 ack 的值,我总是有空字符串,我做错了什么?

0 投票
3 回答
2219 浏览

delphi - 尝试使用 TComDataPacket 读取 ASTM 1391 数据时 TComPort 数据丢失

我在我的一个应用程序中使用各种医疗仪器TComPortTComDataPacket与之通信。我有几行代码,TComDataPacket.OnCustomStart根据TComDataPacket.OnCustomEnd仪器类型标记数据包的开始和结束。对于具有固定开始和结束字符对(例如STX/ ETX)的简单数据包,一切正常。

我尝试使用相同的方法添加对 ASTM 1391 协议的支持。ASTM 1391 数据包由一个ENQ、一个或多个以 开头STX和结尾的数据包CR LF和一个EOT标记数据传输结束的数据包组成。并且响应ENQand CR LF, andACK应该被发回。仪器和计算机之间的对话非常简单的示意图如下所示:

  • 安装:ENQ
  • 主持人:ACK
  • 安装:STX........CR LF
  • 主持人:ACK
  • 安装:STX...................CR LF
  • 主持人:ACK
  • 安装:STX..................................................CR LF
  • 主持人:ACK
  • 安装:STX........CR LF
  • 主持人:ACK
  • 安装:EOT

这是 my OnCustomStartOnCustomEndOnPacketevents 中的代码:

我的问题是,如果我不Sleep()使用大于 500 in 的值进行调用,则OnCustomStartin设置为only。由于我在很多不同的计算机和不同的仪器上都遇到过这个问题,甚至在我的带有环回虚拟串行端口的测试机器上,我的猜测是这与or的内部结构有关。谁能指出我正确的方向?OnPacketStrSTXTComPortTComDataPacket

0 投票
0 回答
709 浏览

delphi - 访问 ComDataPacket.OnPacket 中的 UI 控件是否需要线程同步?

我的表格上有一个ComPort1和一个,并且。我看到有一个属性,我猜想在.ComDataPacket1ComDataPacket1.ComPort:= ComPort1;SyncMethodTComPortComPort1.Connected:=true;

最近我意识到,来自OnExecuteIndyIdTCPServer组件事件的每个 UI 访问都需要与 MainThread 同步,那么 TComPort 是否如此?如何做到这一点(Indy 有一门课可以做到这一点)?

我正在像这样从 com 端口读取数据(数据作为数据包发送,因此ComDataPacket1非常有用):

我正在做一个项目,有时我会收到著名的“您的应用程序已停止工作”消息框(当我的程序关闭时)。我怀疑这个错误是因为这个。

0 投票
1 回答
1406 浏览

delphi - 在 delphi dll 中使用 tcomport 时出错

我在处理一个小 dll 并在其上使用 TComport 组件。我在这个 dll 中有一个函数,它接受一些参数并返回一个字符。我在项目中添加了一个数据模块,并在其上放置了 TComport 和 TComDataPacket。一切正常,但 TComport 无法捕获任何事件。例如,我想从 TComDataPacket 组件的 OnPacket evet 中的设备中获取字符串。任何建议我为我糟糕的英语道歉。

0 投票
2 回答
10042 浏览

delphi - 串口读取

我正在尝试从串行线 RS232 上的主机读取一个简单的字符串。两者的接收 - 传输参数相同:

我试图发送这个字符串:

!A243B324C213D300#

我用 '!' 和'#'作为标题并完成以确保字符串将被完全接收。问题是我可以在第 15 个字符 (3) 之前接收到字符串。

我知道这一点,因为如果我使用此代码:

我再看看吧


!A243B324C213D3

00#


我试图扩展 comport 的缓冲区,但没有结果。

那么为什么我不能一次收到完整的字符串呢?

我在这里找到了这个库,直到现在它都可以正常工作:

http://sourceforge.net/projects/comport/

0 投票
1 回答
2376 浏览

delphi - 在delphi中读取Tmemo的最后一行

经过很长时间的尝试....决定寻求帮助。

我正在尝试阅读发送到 Delphi 中的 Tmemo 的最后一行。我正在将代码行一一发送给开发人员。登上开发。board 每次都需要发送不同的代码行。我的最终目标是读回开发人员的最后一行。板送回。

例如

设置 ATT = 7 --->> \sent to dev. 木板

开发。董事会答复

OK <----- \ 从开发者那里收到。木板

发送下一行代码。

或者

再次发送“set att = 7”命令。


到目前为止,我已经完成了我需要的大部分工作。我只是无法让 Delphi 阅读 tmemo 的最后一行。

我试过了

节目信息仅供我自己参考……我知道它会将接收到的数据反弹回来,仅供参考。

奇怪的是它有时会起作用,而且那一行。Count 有时也会退回信件,所以我认为我的做法完全错误......