Delphi 10.4解释TidTCPServer

Delphi 10.4解释TidTCPServer,delphi,tcpserver,Delphi,Tcpserver,我知道有很多这样的问题,但我找不到我具体问题的答案。 我想读取RFID读卡器发送的数据。 我以前从未使用过像TidBytes这样的类型,也不知道如何解释规范 规格如下: 事件数据 领域 大小(字节) 描述 时间 4. 储量数据类型 数据大小 1. 数据缓冲区数组的大小(0~16)。 数据缓冲区 16 数据缓冲区阵列(卡UID或扇区数据)。 设备名 16 名称(字符串类型) 西德 4. 保留 首先,TIdTCPServer是一个多线程组件,它的OnConnect、OnDisconnect、OnEx

我知道有很多这样的问题,但我找不到我具体问题的答案。 我想读取RFID读卡器发送的数据。 我以前从未使用过像TidBytes这样的类型,也不知道如何解释规范

规格如下:

事件数据

领域 大小(字节) 描述 时间 4. 储量数据类型 数据大小 1. 数据缓冲区数组的大小(0~16)。 数据缓冲区 16 数据缓冲区阵列(卡UID或扇区数据)。 设备名 16 名称(字符串类型) 西德 4. 保留
首先,
TIdTCPServer
是一个多线程组件,它的
OnConnect
OnDisconnect
OnExecute
OnException
事件是在为管理每个已接受的客户端连接而创建的工作线程上下文中触发的。因此,从主UI线程外部直接访问UI控件是不安全的。您必须同步对它们的访问,例如使用
TThread.synchronize()
TThread.Queue()

因此,您显示的代码需要看起来更像这样:

过程Ttid.IdTCPServerExecute(AContext:TIdContext);
变量
缓冲区:TIdBytes;
s:字符串;
i:整数;
开始
AContext.Connection.IOHandler.ReadBytes(缓冲区,41);
s:=IntToHex(缓冲区[0],2);
对于i:=1到高(缓冲区)do
s:=s+''+IntToHex(缓冲区[i],2);
TThread.Synchronize(nil,
程序
开始
备忘录1.行。添加;
结束
);
结束;
也就是说,您可以通过
TIdTCPServer
实现该RFID规范。请注意,在读取字节时,您必须考虑RFID数据的“数据缓冲区”字段是可变长度的(您的原始代码根本没有考虑到这一点):

  • TIdIOHandler
    有许多方法可以读取各种数据类型,包括固定大小的整数:
过程Ttid.IdTCPServerExecute(AContext:TIdContext);
变量
iTime,XID:UInt32;
数据:TIdBytes;
DeviceName:字符串;
开始
使用AContext.Connection.IOHandler do
开始
iTime:=ReadUInt32;
ReadBytes(数据,ReadUInt8);
DeviceName:=读取字符串(16);
XID:=ReadUInt32;
结束;
...
结束;
  • Indy的
    IdGlobal
    单元具有类似的功能,用于从
    TIdBytes
    缓冲区中读取各种数据类型:
过程Ttid.IdTCPServerExecute(AContext:TIdContext);
变量
iTime,XID:UInt32;
缓冲区,数据:TIdBytes;
DeviceName:字符串;
偏移量:整数;
开始
使用AContext.Connection.IOHandler do
开始
读取字节(缓冲区,5);
ReadBytes(缓冲区,ReadUInt8+20,True);
结束;
设置长度(数据、长度(缓冲区)-25);
偏移量:=0;
iTime:=BytesToUInt32(缓冲区、偏移量);
包括(抵销,4);;
CopyTIdBytes(缓冲区、偏移量、数据、0、长度(数据));
Inc(偏移量、长度(数据));
DeviceName:=BytesToString(缓冲区,偏移量,16);
公司(抵销,16);
XID:=BytesToUInt32(缓冲区,偏移量);
...
结束;

如果在每个字节转换后添加逗号,则更容易计算收到的字节。所以,使用这个:
s:=s+IntToStr(buffer[i])+','或者,使用
IntToHex()
函数。如果将卡ID的四个字节中的每一个都转换为十进制,您将看到第一个卡ID(十进制字节值62,3191148)在第二次和第三次扫描中以相反的字节顺序出现。将二进制数据转换为十六进制或十进制形式的字符串和vv是需要掌握的基本技能。谢谢,这很有帮助,我看不到“向上投票”的箭头,因此很抱歉使用此评论来感谢您…欢迎您。评论中的答案无法获得选票以赢得声誉,因此我只能怪自己没有提供正确的答案;)为了满足我的好奇心,时间场应该如何解释?我不知道。我所感兴趣的是一个稳定和唯一的ID。所以我可以在我自己的软件中处理它。我在Delphi中获得了TimeTIMPS等…请根据Tom Brunberg的评论更新您的问题,并显示您收到的数据的十六进制表示形式。