PDA

View Full Version : ماندن مقدار قبلی در پورت سریال



omidan321
پنج شنبه 02 خرداد 1392, 12:09 عصر
سلام به همگی
من توی دریافت از پورت سریال مشکل دارم
مشکلم اینه که توی دریافت اولم بدون هیچ مشکلی دریافت دارم وقتی داده های دریافتی رو با داده های ارسالی تطبیق میدم میبینم که مشکلی وجود نداره اما وقتی داده ها رو یک بار دیگه در زمان باز بودن برنامه تغییر بدم و ارسال کنم مقادیر دریافتی همون چیزایی هستن که سری اول دریافت کردم چیزی که من احتمال میدم اینه که خود پورت کام متغیر های دریافتی رو یه جایی ذخیره می کنه که من نمی دونم کجاست از متغیر هامکه تو قسمت rxchar پورت کام استفاده کردم مطمئن هستم که توی اونا ذخیر نمیشه چون بعد از هر بار دریافت اونا رو صفر می کنم
ممنون میشم راهنماییم کنید

BORHAN TEC
پنج شنبه 02 خرداد 1392, 13:45 عصر
سلام
باید ذکر می کردید که از چه کامپوننتی استفاده می کنید.
در حالت کلی شما باید بافر مربوط به پورت را خالی کنید. اکثر کامپوننت های کار با پورت سریال متدی با نام ClearBuffre یا چنین چیزی دارند که بافر مربوطه را خالی می کند.
در ضمن قبلاً من قبلاً کدی را در این زمینه قرار داده بودم که از TComPort استفاده می کرد. با کمی جستجو در سایت می توانید آنرا پیدا کنید.
موفق باشید...

omidan321
پنج شنبه 02 خرداد 1392, 14:29 عصر
از کامپوننت tcomport استفاده می کنم در انتهای دستورات rxchr هم clerabuffer رو انجام می دم اما نتیجه نداره دوباره همون اتفاق می افته اگه منظورمو درست رسونده باشم منتظر یه گرا هستم تا ته خط رو برم
ممنون میشم راهنماییم کنی


توی قسمت comport.OnRxBuf چطور میشه بافر rxchr رو خالی کرد از توی برنامه؟

BORHAN TEC
پنج شنبه 02 خرداد 1392, 14:43 عصر
من کد شما را ندیده ام که بتوانم نظر بدهم. در ابتدای کار کدی که در پست شماره 8 این تاپیک (http://barnamenevis.org/showthread.php?368108) قرار داده ام را تست کنید و اگر درست کار نمی کرد دوباره پست بدهید و کدتان را هم قرار دهید تا بررسی کنیم.

omidan321
پنج شنبه 02 خرداد 1392, 15:09 عصر
procedure dcstr(str: widestring; var comand: string; var msg: widestring; var err:integer; var ip: widestring);
comand:='';
msg:='';
err:=0;
len:=0;
po:=pos('UUUUUUUUUUU',str);
if po<>0 then
begin
str2:=copy(str,po+14,3);
oo:= pos('UUUUUUUUUUU',str)+14;
stra:=copy(str,oo-3,strtoint(str2)+3);
stra:=copy(stra,1,pos('U',stra));
len:=length(stra);
if strtoint(copy(stra,4,3))=len then
begin
comand:='view';
delete(stra,pos('U',stra),1);
msg:=stra;
edit13.Text :=msg;
end;
end

procedure Tsir.ComPortRxChar(Sender: TObject; Count: Integer);
comport.ReadUnicodeString (Str_recive, Count);
edit4.Text :=edit4.Text + Str_recive;
str:=edit4.text;
dcstr(str,comand,msg,err,ip_con);
num_mod1:=length(edit13.Text);
if (comand='view') and (num_tmp>1) then
begin
jk:=1;
num_tmp:=1;

while jk<= length(edit13.Text) do
begin
tmp[num_tmp]:=copy(edit13.Text,jk,6);
num_tmp:=num_tmp+1;
jk:=jk+6;
end; edit13.Text:='';

if copy(tmp[2],1,3)='015' then
begin
per1:=copy(tmp[2],4,3);
per11:=strtoint(per1);
per11:=per11 / 10 ;
per1:=FloatToStr(per11);
xsw:=pos('-',per1);
per1:=copy(per1,1,pos('.',per1)+3);
lev100.Text :=per1;
end
else tozih:='code error';
edit11.Text :=tozih;
end;



مقدار کدی که از کامپیوتر دیگه میدم بهش رو تست کردم همیشه اون مقداری رو که اولین بار بهم نشون داد رو نشون میده وقتی برنامه رو می بندم و دوباره باز می کنم دوباره همون اولین مقداری که گرفته رو باز نشون میده (تعاریف مقادیر رو توی اینجا نزاشتم)
این مقادیر رو یه جایی داره ذخیره میکنه کجا نمیدونم
ایا ممکنه توی رویداد onrxchrbuf ذخیره شده باشه؟

کدهای زیر رو هم با یک دکمه دیگه اجرا کردم اما بازم افاقه نمیکنه

comport.Buffer.Free ;
comport.ClearBuffer(true,true);
comport.Close;
comport.open;