Форум: "Система";
Текущий архив: 2003.08.11;
Скачать: [xml.tar.bz2];
ВнизПоток обработки данных СОМ-порта, в чем дело? Найти похожие ветки
← →
л (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c