View Full Version : مشکل با کامپوننت CPort (ComPort) و دلفی 7
sara66
یک شنبه 08 خرداد 1390, 18:03 عصر
سلام ، من کامپوننت Comport را از سورس فورج دانلود کردم و روی دلفی 7 نصب کردم ، یک کامپوننت Comport و یک کامپوننت ComTerminal روی صفحه قرار دادم ، کامپ.ننت ComTerminal اطلاعات دریافتی از پورت سریال را نشون میده اما وقتی توی این دو اونت زیر از کامپوننت Comport کدهای زیر را می نویسم هیچی دریافت نمی کنم ، چکار کنم که بتونم بدون استفاده از ComTerminal اطلاعات ارسالی از پورت سریال را دریافت کنم ؟
procedure TForm1.ComPort1RxBuf(Sender: TObject; const Buffer;
Count: Integer);
var
s:String;
begin
ComPort1.ReadStr(s,count);
Memo1.Text:=S;
end;
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
s:String;
begin
ComPort1.ReadStr(s,count);
Memo1.Text:=S;
end;
راستی ، ControlDTR و ControlRTS از کامپوننت ComPort فعال هستند
اگر هم کامپوننت بهتری برای کار با پورت سریال در دلفی 7 دارید بگید
vcldeveloper
دوشنبه 09 خرداد 1390, 01:20 صبح
اگر راهنمای خودش رو دقیق مطالعه کنید، جواب اینجور سوالات رو به راحتی درش پیدا می کنید. در راهنمای این کامپوننت توضیح داده شده که اگر TComPort به یک کنترل دیگه مثل TComTerminal متصل باشه، اولا رویداد OnRxChar اصلا فراخوانی نمیشه، و ثانیا، در رویداد OnRxBuf هم داده موجود در بافر ورودی قابل خواندن نیست، چون این داده قبل از اجرای رویداد OnRxBuf توسط کنترل متصل به TComPort خوانده شده. اما TComPort یک کپی از اون داده را در قالب پارامتر Buffer به کد مربوط به رویداد OnRxBuf ارسال میکنه، در نتیچه برنامه نویس باید در کد مربوط به این رویداد، داده را از متغیر Buffer بخونه، نه اینکه خودش متد ReadStr رو فراخوانی کنه!
چکار کنم که بتونم بدون استفاده از ComTerminal اطلاعات ارسالی از پورت سریال را دریافت کنم ؟
نیازی به TComTerminal نیست. با همون TComPort به تنهایی می تونید از طریق رویدادهای OnRxChar و OnRxBuf داده دریافتی رو بخونید. کار با OnRxChar ساده تر از OnRxBuf هست؛ کافی متد ReadStr رو در کد مربوط به این رویداد فراخوانی کنید.
sara66
دوشنبه 09 خرداد 1390, 08:10 صبح
سلام ، مرسی ، من اول کد های بالا را برای امتحان توی هر دو Event نوشتم ، و بعد چون جواب نگرفتم از TComTerminal استفاده کردم ، یعنی یک بار بدون استفاده از TCOmTerminal کد های بالا را نوشتم اما هیچکدوم عمل نکرد ، جالب ابنجاست اصلا رویداد OnRxChar فراخوانی نمیشه (TcomTerminal هم روی صفحه نیست)! و هنگام دریافت اطلاعات از پورت سریال فقط رویداد OnRxChar فراخوانی میشه ، توی این رویداد نه کد های بالا کار می کنه و نه اینکه میشه متغیر Buffer را به یک متغیر String داد (وقتی میخوام Buffer را توی متغیر String بریزم ، خطا میده و اصلا برنامه کامپایل نمیشه )!
nightHunter
سه شنبه 07 تیر 1390, 18:58 عصر
آیا میتوان از این کامپوننت درون Console Application هم استفاده کرد ؟
vcldeveloper
دوشنبه 03 مرداد 1390, 12:52 عصر
آیا میتوان از این کامپوننت درون Console Application هم استفاده کرد ؟
بله، میشه.
mmjoon
دوشنبه 22 آبان 1391, 10:21 صبح
سلام، من دارم رو يه پروژه كه از پورت com استفاده ميكنه كار ميكنم.از comport تو برنامه استفاده كردم، با استفاده از تابعreadstr يه رشته رو از پورت com خوندم و بعدش اطلاعات مورد نيازم رو از اين رشته استخراج كردم.مشكلي كه هست دفعه دوم كه ميخوام يه رشته جديد بخونه همون رشته قبلي رو ميخونه.بايد كلا از برنامه خارج شم و دوباره برنامه رو اجرا كنم تا رشته جديد رو بخونه.لطفا راهنماييم كنيد
BORHAN TEC
دوشنبه 22 آبان 1391, 10:41 صبح
سلام
سلام، من دارم رو يه پروژه كه از پورت com استفاده ميكنه كار ميكنم.از comport تو برنامه استفاده كردم، با استفاده از تابعreadstr يه رشته رو از پورت com خوندم و بعدش اطلاعات مورد نيازم رو از اين رشته استخراج كردم.مشكلي كه هست دفعه دوم كه ميخوام يه رشته جديد بخونه همون رشته قبلي رو ميخونه.بايد كلا از برنامه خارج شم و دوباره برنامه رو اجرا كنم تا رشته جديد رو بخونه.لطفا راهنماييم كنيد
شما باید بافر مربوط به اون پورت رو خالی کنید:
FComPort.ClearBuffer(True, True);
mmjoon
چهارشنبه 08 آذر 1391, 11:32 صبح
سلام،من كد مربوط به خالي كردن بافر رو استفاده كردم،اما مشكلم حل نشد،كدي كه من استفاده كردم به صورت زير هستش،ميشه لطفا كمك كنيد
ComPort.Open;
str:='';
d:='';
ComPort.ReadStr(Str, 20);
/////////////////////////////////
for i:=strlen(pchar(str)) downto 1 do
begin
if (str[i-1]+str[i]='kg') then
begin
if (str[i-2]>='0')and(str[i-2]<='9') then
d:=str[i-2]+d;
if (str[i-3]>='0')and(str[i-3]<='9') then
d:=str[i-3]+d;
if (str[i-4]>='0')and(str[i-4]<='9') then
d:=str[i-4]+d;
if (str[i-5]>='0')and(str[i-5]<='9') then
d:=str[i-5]+d;
if (str[i-6]>='0')and(str[i-6]<='9') then
d:=str[i-6]+d;
end;
end;
if d<>'' then
begin
DBEdit2.Text:=d;
end
else
DBEdit2.Text:='0';
BORHAN TEC
پنج شنبه 09 آذر 1391, 09:34 صبح
سلام
از روشی که در تاپیک زیر عنوان کرده ام استفاده کنید:
http://barnamenevis.org/showthread.php?368108
موفق باشید...
mmjoon
سه شنبه 14 آذر 1391, 07:31 صبح
سلام
از روشی که در تاپیک زیر عنوان کرده ام استفاده کنید:
http://barnamenevis.org/showthread.php?368108
موفق باشید...
سلام آقاي عشايري،ممنون از راهنمايي هاي مفيدتون
من از كدي كه شما تو تايپك بالا گذاشته بودين استفاده كردم،تو Memo اطلاعاتي رو كه از پورت ميخونه درست نمايش ميده،فقط اگه ميشه در مورد استخراج بخشي از اطلاعاتي كه از پورت خوانده ميشه اگر لطف كنيد راهنمايي كنيد ممنون ميشم،من سعي كردم اطلاعات مورد نيازم رو از رشته str1 كه توي كد شما استفاده كردين استخراج كنم،اما هميشه درست جواب نميده،فكر كنم چون رشته str1 مدام آپديت ميشه اين مشكل پيش مياد
BORHAN TEC
سه شنبه 14 آذر 1391, 08:19 صبح
سلام
دوست عزیز شما باید با توابع رشته ای این کار را انجام دهید و راه دیگری هم وجود ندارد. تمام تلاش خودتان را برای این کار به کار بگیرید و اگر موفق به انجام این کار نشدید یک تاپیک جدید ایجاد کنید و متن خوانده شده از پورت را با توضیحات کامل بنویسید تا بتوانیم راهنمایی کنیم.
موفق باشید...
lida vahidi
جمعه 22 دی 1391, 14:26 عصر
سلام
من يك برنامه نوسي plc هستم و ميخوام از كامپوننت comport استفاده كنم ولي وقتي ميخوام كامپوننت رو كامپايل و اينستال كنم خطا ميگيره لطفا من رو راهنمايي كنيد ممنون ميشم
BORHAN TEC
جمعه 22 دی 1391, 15:01 عصر
سلام
به نظر شما ما بدون اینکه متن خطا رو بدونیم چه کاری از دستمون بر میاد؟؟؟ :متعجب:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.