در بخش اول امکانات مودم رو بررسی کردیم و با چند تا دستور AT تونستیم بفهمیم که آیا مودم ما Caller ID و Voice داره یا نه . در این بخش می خوام شروع به ساخت برنامه بکنم . توجه داشته باشید که من از روش تجربی و تحقیقی خودم برای ایجاد این برنامه استفاده می کنم . البته سعی می کنم عمومیت بیشتری بهش بدم . اما شما می تونید این کدها رو هر جور که صلاح می دونید استفاده کنید . ممنون میشم اگه اشکالات روبهم گوشزد کنید تا این آموزش بهتر و بهتر بشه .
ایجاد برنامه :
1-دلفی رو باز کنید و یه پروژه جدید ایجاد کنید .
2-
مانند شکل زیر به KDTele Tab
برید و KDSerialPort
رو انتخاب کنید و روی فرمتون قرار بدید .
3-در مرحله بعد نیاز داریم که KDSerialPort رو تنظیم کنیم . برای این کار KDSerialPortی که روی فرم گذاشتید انتخاب کنید و به پنجره object inpector برید . در لیست Property های KDSerialPortPropertyی به نام ManualSettings هست . بازش کنید و در قسمت Port عدد 3 رو وارد کنید .
نکته : این عدد 3 چی هست ؟ هر مودمی که روی سیستم نصب میشه یک Port رو برای خودش اشغال می کنه . در حالت عادی مودم Port 3 یا Com 3 رو برای خودش اشغال می کنه که پیش فرض اکثر مودمها هم هست . به همین دلیل من خواستم عدد 3 رو وارد کنید . اما از کجا بفهمیم Port مودم ما چی هست . برای اینکار به مسیر زیر برید :
Control Panel > Phone And Modem Option > Modems Tab >
در این پنجره نام مودم های نصب شده بر روی سیستم لیست شده و در مقابلش هم لیست portهایی که مودم اشغال کرده هم لیست شده . از اینجا می تونید بفهمید که مودم روی کدام Port نصب هست . تصاویر زیر مطالب بالا رونشان می دهند .
4-خب Port که تنظیم شد . نیاز به نوشتن مقداری کد داریم . از این به بعد تصور من اینه که شما می دونید Property و Event چی هستند و در دلفی کجا قرار دارند . با این تصور من فقط توضیح متنی میذارم . خب اول KDSerialPort رو انتخاب کنید . به object inspector برید و Events رو انتخاب کنید . onPortState رو از بخش Events دوبار کلیک کنید تا محیط کد نویسی دلفی باز بشه . این Event این امکان رو به شما میده که وضعیت port ی که روش کار می کنید رو براتون مانیتور کنه . حالا این دستور رو براش بنویسید :
procedure TForm1.KDSerialPort1PortState(Sender: TObject;
PortState: TPortState; Param1: Integer);
begin
case PortState of
psOpened : ShowMessage('پورت باز شد');
psClosed : ShowMessage('پورت بسته شد');
psError : ShowMessage('خطا در فعاليت پورت');
end;
end;
این قطعه کد وضعیت Port رو براتون بر می گردونه من از MessageBox استفاده کردم . شما از هر چی که دوست دارید می تونید استفاده کنید .
5-روی فرمتون کلیک کنید . به object inspector برید و از Events های فرمتون OnShow رو انتخاب کنید و دوبار کلیک کنید تا محیط دلفی باز بشه . این کد رو در این بخش بنویسید :
procedure TForm1.FormShow(Sender: TObject);
var
pORes : Integer;
begin
if KDSerialPort1.IsOpened then
begin
KDSerialPort1.Close;
end
else if not KDSerialPort1.IsOpened then
begin
pORes := KDSerialPort1.Open(0);
if pORes = 0 then
begin
KDSerialPort1.SendString('AT' + #13);
KDSerialPort1.SendString('AT&F*C1&D2' + #13);
KDSerialPort1.SendString('AT+GCI=B4' + #13);
KDSerialPort1.SendString('AT+VCID=1' + #13);
end;
end;
end;
نکته :
1-اگر کمی دقت کنید می بینید که این کدها همان دستورات AT هستند که در بخش قبل در Hyper Terminal نوشتیم و اجرا کردیم . پس اگر مودم شما این دستورات را پشتیبانی می کنه این ها رو اینجا بنویسید .
2-در این کد من اول بررسی کردم که Port باز هست یا نه . دلیلش هم اینه که ممکنه مودم توسط برنامه دیگه ای در حال اجرا باشه . در اینصورت Port در حالت Busy هست . برای همین اول بررسی می کنم که باز هست یا نه و اگه باز بود با دستور KDSerialPort1.Close; پورت رو می بندم .
3-در بخش بعدی بررسی می کنم اگه پورت باز نبود . ابتدا پورت رو با دستور KDSerialPort.Open(0); باز می کنم . و بعد دستورات AT رو توسط KDSerialPort.SendString(); به مودم ارسال می کنم تا مودم رو برای فعالیت آماده کنم .
نکته : اگر دقت کنید میبینید که قبل از KDSerialPort.Open(0); یک متغیر عددی آوردم . این دستور در صورت موفقیت یا عدم موفقیت یک عدد رو بر می گردونه که با اون عدد میشه در مورد خطاها تصمیم گیری کرد . لیست خطا های مربوط به KDTele رو در پایان این آموزش براتون میارم.
i.در آخر اگر مقدار pORes = 0 بود دستورات AT رو به مودم ارسال می کنم تا مودم به محض برقراری تماس ورودی بتونه شماره تماس گیرنده رو شناسائی کنه .
6-ما دستورات مورد نیاز رو به مودم ارسال کردیم . اما در برنامه چه جوری بفهمیم که مودم در حال زنگ خوردن هست و چه اتفاقی برای مودم داره میفته . برای اینکار ابتدا باید KDSerialPortی که روی فرم گذاشتید رو انتخاب کنید و به object inspector برید و Events رو انتخاب کنید . در بخش Events یک Event به نام onReciveData وجود داره که اطلاعات روی پورت یا مودم رو براتون می خونه .اما چه جوری باید این اطلاعات رو ببینیم . اول از همه یک Memo از Standard Tab روی فرمتون بذارید . سپس روی onReciveData مربوط به KDSerialPort 2 بار کلیک کنید تا محیط کد نویسی دلفی باز بشه . حالا این کد رو در این بخش بنویسید :
procedure TForm1.KDSerialPort1ReceiveData(Sender: TObject;
DataPtr: Pointer; DataSize: Integer; var DisplayHandle: HWND;
var IsDisplayUNICODE: Boolean);
begin
DisplayHandle := Memo1.Handle;
KDSerialPort1.BufferIn.FindString(0, '', False);
end;
نکته : حتما در بخش Property مربوط به KDSerialPort در object inspector در گزینه Bufferln گزینه Enabled = True باشه . اما در مورد این کد :
1-در این Event 2 تا متغیر داریم به نام های DisplayHandle و IsDiplayUNICODE که یکی از نوع HWND هست و یکی از نوع Boolean .
DisplayHandle : این امکان رو به شما میده تا اتفاقات روی پورت و یا مودم در یک Memo یا ListBox نمایش بدید و از اتفاقات مطلع بشید .
IsDisplayUNICODE : این متغیر برای زمانی هست که روی پورت و یا مودم اطلاعات غیر از کاراکترهای English روی مودم ارسال باشه . با True یا False کردن این گزینه این امکان رو می تونید کنترل کنید .
2-DisplayHandle که مشخص هست من به Memo نسبت دادم . اما خط دوم این Event اطلاعات مورد نیاز از روی پورت یا مودم رو می خونه . عدد 0 به نشانه اینه که از Index 0 رشته هایی که برگشته اند شروع به خوندن کن . ‘’ در این بخش شما هر کاراکتری رو می تونید قرار بدید کثلا" اگر دنبال کلماتی که با N شروع می شوند می گردید . اونجا باید ‘N’ رو وارد کنید . اما گزینه آخر این گزینه برای اینه که مشخص کنید که حساس به کلمات باشه یا نه . یعنی Case Sensetive باشه یا نه من اینجا False گذاشتم تا حساسیتی به بزرگی و کوچکی کلمات نشان نده و همه رو برام لیست کنه . خب از اینجا به بعد می خوام شماره سریال رو پیدا کنم و تو یک MessageBox نمایش بدم . در ادامه همون کد قبلی این کد رو هم اضافه کنید .
نکته : این روش اختصاصیه منه . شما از هر روش دیگه که دوست دارید می تونید استفاده کنید .