Ошибка при использовании tcomport в Delphi DLL
Я работаю над небольшой DLL, и я использую компонент TComport на нем. У меня есть функция в этой DLL, которая принимает некоторый параметр и возвращает символ. Я добавляю Datamodule в проект и помещаю в него TComport и TComDataPacket. все работает хорошо, но TComport не может поймать события. например, я хочу взять строку с устройства в OnPacket evet компонента TComDataPacket. любое предложение мои извинения за мой плохой английский.
library VoteService;
uses
System.SysUtils,
System.Classes,
Extra in 'Extra\Extra.pas',
Un_Dm in 'DataModule\Un_Dm.pas' {DM: TDataModule},
CPort in 'CPort\CPort.pas';
var ComPort1 : TComPort;
ComDataPacket1 : TComDataPacket;
{$R *.res}
function getVote(personnelCode:Pchar; docCode: Pchar):Integer; stdcall;
var
intStatus, intIdentifier: Integer;
strStatus_message: string;
Port: TPort;
StopBits: TStopBits;
Parity: TParityBits;
DataBits: TDataBits;
BaudRate: TBaudRate;
i, j : Integer;
begin
Answer := 0;
SerialPortSetting(Port, StopBits, Parity, DataBits, BaudRate);
dm := TDM.Create(nil);
try
DM.ComPort1.Port := Port;
DM.ComPort1.StopBits := StopBits;
DM.ComPort1.Parity.Bits := Parity;
DM.ComPort1.DataBits := DataBits;
DM.ComPort1.BaudRate := BaudRate;
DM.ComPort1.Connected := True;
DM.ComPort1.WriteStr('*');
DM.ComPort1.Close;
DM.ComPort1.Open;
for i := 0 to 5 do
begin
j := 0;
while Answer = 0 do
begin
//setAnswer;
end;
Result := Answer;
end;
finally
dm.Free;
end;
end;
exports
getVote;
begin
end.
1 ответ
Моя проблема решена. На самом деле проблема была не в DataModule, но я не смог поймать какие-либо события ComPort в проекте Dll. Наконец-то я понял, что должен использовать цикл и проверять непрерывность, пока не получу ожидаемое значение. Я поставил правильный код здесь,
Спасибо вам всем.
library VoteService;
uses
System.SysUtils, DateUtils,
System.Classes,
Extra in 'Extra\Extra.pas',
Un_Dm in 'DataModule\Un_Dm.pas' {DM: TDataModule},
CPort in 'CPort\CPort.pas';
{$R *.res}
function getVote(personnelCode:Pchar; docCode: Pchar; waitSecound : Integer):Integer; stdcall;
var
intStatus, intIdentifier: Integer;
strStatus_message: string;
Port: TPort;
StopBits: TStopBits;
Parity: TParityBits;
DataBits: TDataBits;
BaudRate: TBaudRate;
s : string;
tmpTime : TTime;
begin
Answer := 0;
SerialPortSetting(Port, StopBits, Parity, DataBits, BaudRate);
dm := TDM.Create(nil);
try
DM.ComPort1.Port := Port;
DM.ComPort1.StopBits := StopBits;
DM.ComPort1.Parity.Bits := Parity;
DM.ComPort1.DataBits := DataBits;
DM.ComPort1.BaudRate := BaudRate;
DM.ComPort1.Connected := True;
DM.ComPort1.WriteStr('*');
DM.ComPort1.Close;
DM.ComPort1.Open;
tmpTime := Now;
s := '';
repeat DM.ComPort1.ReadStr(s, len);
until (SecondsBetween(Now, tmpTime) > waitSecound) or (length(s)>0);
if s = '' then
Result := 0
else
Result := StrToInt(s);
finally
dm.Free;
end;
end;
exports
getVote;
begin
end.