Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.11;
Скачать: CL | DM;

Вниз

Поток обработки данных СОМ-порта, в чем дело?   Найти похожие ветки 

 
л   (2003-05-28 06:28) [0]

Железка работает следующим образом:
Я кидаю ей команду , она через каждые 5 мсек кидает мне наверх 5байт, вверху все это обрабатываеться драйвером порта(CommPortDriver)компонента такая,для приема организую отдельный поток,если ловлю CommPortDriver1.ReadData(e,n),е=nil постоянно
в чем дело?
CommPortDriver1.Readchar(e)работает нормально данные видит , почему не работает ReadData,

uses
Graphics, SysUtils, Classes,Controls,SyncObjs;

type
TCCC = class(TThread)
private
st: string;
SSS:Pchar;
e: pChar;
Event: TEvent;

{ Private declarations }
protected
procedure Execute; override;
public
procedure Add;
constructor Create;
destructor destroy;
end;
var
x:integer;
S:STRING;
n,r,I:integer;
rrr:string;

implementation
procedure TCCC.Execute;
begin
S:="";
x:=0;
while not terminated do
Begin{ Place thread code here }
Form1.CommPortDriver1.ReadData(e,n);
s:=s+string(e);
r := pos( "#", s );
while (length(s)>=10) do
begin
delete( s, 1, R-1 );
rrr:=(copy( s, 2, 4 )); //
IF (pos( "#", RRR )=0)and(length(s)>=10)AND(RRR[1]="0")AND(length(RRR)=4) THEN
BEGIN synchronize(Add);
delete( s, r, 5 );
END
ELSE delete( s, 1, LENGTH(RRR) );
end;
END;
END;

constructor TCCC.Create;
begin
inherited Create(True);
Form1.CommPortDriver1.Connect;
FreeOnTerminate := True;
Suspended := False;

end;

destructor TCCC.Destroy;
begin
Form1.CommPortDriver1.Disconnect;
inherited;
end;

procedure TCCC.Add;
var
rez:real;
ttt:string;
BEGIN
if x<=500 then
begin rez:=Hextoint(rrr)*5/1024-2.495;
form1.graf1.Canvas.LineTo(x+47,trunc((REZ*(-50)*index)+159));
x:=x+1;
end
else
BEGIN
form1.graf1.SeriesList[0].Clear;
form1.graf1.Canvas.LineTo(47,trunc(+159)) ;
x:=0;
END;
end;

end.


 
jack128 ©   (2003-05-28 09:40) [1]

1)Сразу бросается в глаза :
ты не выделяешь память под переменную е
2)s:=s+string(e); // преобразование к типу string не нужно (я бы даже сказал вредно)
3)Form1.CommPortDriver1.ReadData(e,n);
Где проверка сколько реально пришло символов???


и еще, давай более осмысленные имена переменным - будут проще и тебе и другим


 
л   (2003-05-28 11:10) [2]

ну скажем мне в данный момент не важно сколько пришло байт, поэтому и не проверяю,
и зачем выделять память под е ,это транспортная переменная
меня интересует почему е=nil


 
old_monkey   (2003-05-28 17:32) [3]

e=nil - это и значит, что память не выделена.


 
Tano ©   (2003-05-28 18:44) [4]

Delphi HELP: A PChar is a pointer to a null-terminated string of characters...
ИМХО:
Если e:PChar, то как минимум надо сделать SetLength(e, 1)

Я так понимаю этой функции нужен указатель на буффер, можешь попробовать иначе:
var
Buf :array[0..N-1] of Bytes;
при вызове:
CommPortDriver1.ReadData(@Buf,n)
мне обычно помогало, но это удобно, если макс. длина пакета (N) известна и не гигантская.



 
jack128 ©   (2003-05-28 19:04) [5]

to л
Могу сказать. что у тебя проблемы не с портами, а с динамической памятью...


 
л   (2003-05-29 08:46) [6]

tano,спасибо я так и сделал овел память под буфер но теперь
Form1.CommPortDriver1.ReadData(@e,n)всегда равен #0 ????


 
Мое имя   (2003-05-29 09:46) [7]


> зачем выделять память под е ,это транспортная переменная

)


 
Tano ©   (2003-05-29 16:16) [8]

Я имел ввиду:
либо
e:PChar, SetLength(e,1), ReadData(e,n)
либо
Buf:array, ReadData(@Buf,n)

потому, что e-сама является указателем на выделенную память (у нас - на 1 байт), а Buf - обычная переменная и ее адрес, указатель на нее мы можем передать конструкцией @Buf

Если это уточнение не поможет, тогда извеняйте.
Удачи!



Страницы: 1 вся ветка

Текущий архив: 2003.08.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
1-33125
silenser
2003-07-30 10:39
2003.08.11
7-ая Delphi


3-33073
Ivan1973
2003-07-18 20:49
2003.08.11
TADOTable


11-33089
asp
2002-12-01 22:08
2003.08.11
TabControl


14-33280
8UnG
2003-07-22 21:31
2003.08.11
Com-port!!!


14-33366
zzet
2003-07-25 14:41
2003.08.11
За державу обидно.