Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
3-33050
Z_man7777
2003-07-17 19:40
2003.08.11
Типы полей в InterBase6.0 FireBird


14-33295
LiLa Ananda
2003-07-23 08:47
2003.08.11
Требуются люди, желательно, в огромном количестве!:))


3-33077
Spawn
2003-07-17 19:27
2003.08.11
Сортировка


1-33209
LORD
2003-07-26 18:12
2003.08.11
localhost proba file.exe TO d: proba file.exe


6-33252
SysAdmin
2003-06-05 17:47
2003.08.11
Как отследить траффик в инете





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский