مشاهدة النسخة كاملة : سؤال حول دوال الإدخال و الإخرج في Api
نجيب المجيدي
09-12-2003, 01:24 PM
بسم الله الرحمن الرحيم
إخواني المبرمجين اليمنيين و العرب أريد أن أعرض عليكم المشكلة و أتمنى فعلاً أن تتجاوبوا معي و بالذات أخي العزيز رغيد الطيب الذي ساعدني من قبل كثيراً سؤالي هو حول كيفية التحكم بالهارد وير من خلال برنامج -أفضل أن يكون باستخدام لغتي المفضلة VB وتحديداً استخدام دوال api للإدخال و الإخراج و إذا في حد عنده أدوات .ocx جاهزة و لكن مع شرح تصميم الأداة
أثق فيكم كثيراً
و السلام عليكم ورحمة الله وبركاته
3laa3sam
09-12-2003, 10:01 PM
أوكيه....وضح أكثر عشان الواحد يقدر يعرف إنتى عاوز تتحكم بإيه !!!، معاك ع سبيل المثال (التلفون) (الطابعه) (الكاميرا الديجتال) يعني إتكلم إنتى عاوز تتحكم بإيه !!!
نجيب المجيدي
10-12-2003, 12:55 PM
بسم الله
أشكرك أخي الكريم على عرضك المساعدة
و بالنسبة للمنفذ الذي أريد استخدامه فلنفترض منفذ الاتصالات com1
طبعاً المطلوب هو العناوين التي سأستخدمها أي الأرقام بالنظام السادس عشر التي تشير إلى المنفذ المطلوب و أيضا أود أن أشير إلى ملفات الدل حيث أنها تسبب مشكلة في بعض أنظمة التشغيل
عموماً انفرض أنني أريد استخدام نظام windows2000 pro سأقوم بتعريف الدالة بالشكل التالي :
public declaration function inp lib "inpout.dll" (byval portAddress as long)
ولكن عند تشغيل البرنامج تظهر رسالة تفيد وجود خطاْ و يقوم الوندوز بإغلاق البرنامج
في المرة القادمة إن شاء الله سأرسل الشفرة كاملة
3laa3sam
10-12-2003, 09:54 PM
عاوو أقولك معلومه في الاول كنت قرتها مره، المعلومه دي بتقول إن مش كل دوال (API) بتشتغل ع الاصدارات كلها بتاعت الويندوز فبعضها بتشتغل وبعضها لا . عموماً إنتى باين عليك ممتاز في البرمجه بس عارف حاجه انا هارسلك ع البريد الخاص شويه كلام ....اوكيه !!!
نجيب المجيدي
11-12-2003, 02:43 PM
أصل أنا لسه ما شاركت أكثر من ثلاثين مشاركة و النظام هنا يمنعني من مشاهدة رسالتك إلا إذا كنت شاركت أكثر من ثلاثين مشاركة
إيه رأيك
3laa3sam
11-12-2003, 09:58 PM
عارف ...انا كنت شفت كثيييييييييييييييييييييييييييييير من الاعضاء هنا بيدخلوا بس عشان يكتبوا (جزاك الله خير) او (مشكور) او يعني ما لكلام ده.
إيه رئيك تيجي تعمل زيهم في الاول بعديها إبقى أكتب زي متحب !!!!
azizNY
12-12-2003, 03:12 PM
I am looking for the same thing, Using API to insert delete & menus & submenus at runtime
Also Coding those menus at runtime..
But never got it yet
Salam,
نجيب المجيدي
12-12-2003, 07:58 PM
شكراً يا علاء
نجيب المجيدي
12-12-2003, 08:00 PM
وجزاك الله خير
3laa3sam
12-12-2003, 10:04 PM
عارف حاجه ....الكمبيوتر ده زي التمثال ، عارف هتستغرب مالعباره دي بس والله فجد هما هنا بيقولوا لازم المشاركه تكون اكثر من 30 طب إحنا حنتحايل عليهم وهنمشي برضه بسكه القانون ، إعما زي ماكنت قولتلك وسدقني إنتى مش هتكون الاول دنا شفت ياما ناس هنا بتكتب يعني خلينا نقول (مشكور / جزاك الله خير) بس عشان يبقى أكثر مشاركات..............!!!
رغيد الطيب
13-12-2003, 12:42 AM
السلام عليكم ورحمة الله وبركاته ..
الاخ العزيز نجيب ... يسرني بالفعل ان اشارك بما لدي في هذا الموضوع ... غير اني استغرب قولك اني قد ساعدتك من قبل !! ... ذلك اني لا اتذكر اننا قد تقابلنا في مواضيع آخرى سوى موضوع الالغاز البرميجة التي اتحفتنا بمشاركت فيه على الرابط التالي ....
http://www.al-yemen.com/vb/showthread.php?s=&threadid=58780&perpage=10&pagenumber=1
على العموم اخي العزيز يسعدني كثيراً مساعدتك بما مكنني الله فيه واعتذر عما خفي عني في هذا الموضوع ....
اولاً بالنسبة للتحكم في الآلات الخارجية فهناك عدة طرق تعتمد على الهذف والامكانيات المتوفرة فاذا كان المقصود التحكم ببعض الجهزة القريبة من الكمبيوتر فيمكن ذلك عن طريق استخدام منفذ الطابعة (LPT Port) او ما يعرف بـ Parllel Port ( المنفذ المتوازي ) ... ذلك ان بعد المسافة بين الكمبيوتر والجهاز المراد التحكم فيه يسبب خطأ في التوصيلات وانخفاض في الجهد بحسب بعد الجهاز عن الكمبيوتر وذلك عند استخدام المنفذ المتوازي ( منفذ الطابعة ) ...
واما اذا كانت الاجهزة التي تريد التحكم بها اجهزة بعيدة وتحتاج الى موثوقية اكبر فان الحل يكمن باستخدام المنفذ المتسلسل ( Serial Port ) والمعروف بالـ Com ...
ولكل طريقة من الطرق السابقة ما يميزها عن الاخرى فاستخدام المنفذ المتوازي اكثر سهولة خاصة اذا كنت تفتقد الى الخبرة الالكترونية ( اي التعامل مع القطع والدوائر اللأكترونية ) ... وذلك لانه عبارة عن منفذ يحتوي على عدة مداخل او Pins يمكنك استخدامها للتحكم بدوائرك اللاكترونية وبالتالي سهولة في التحكم باكثر من جهاز ... وعلى الصعيد الشخصي فقد كانت لدي تجارب بسيطة سابقة في التحكم ببعض الاجهزة البسيطة في المنزل كجرس المنزل وكذلك بعض اجهزة التحكم البدائية جداً التي قمت بتصميمها والتحكم بها من خلال منفذ الطابعة وبحمد الله كانت تجارب ناجحة ... ولاكنها لاترقى لمستوى يمكنك وصفه بانه تحكم جيد بالاجهزة ... بل بدائي جداً نظراً لعدم تمكني من الناحية الالكترونية ....
ولهذا الار ستحتاج الى الاوامر Inp و Out وهما عبارة عن اوامر API موجودين في الملف Inpout32.dll والذي تجده في الملف المرفق مع ردي هذا بإذن الله تعالى ....
والصيغة التعريفية لهذة الدوال هي كالتالي :
Private Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Integer) As Integer
Private Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
والسبب في عدم عمل الدالة التي قمت متفضلاً بوضع تعريفها في الاعلى يعود الى اسم المكتبة المستخدمة وهي inpout.dll وليس inpout32.dll كما انه ايضاً هده المكتبة عبارة عن اصدارات مختلفة منها من يمكنه التعامل مع عائلة الـ NT كالوينذوز اكس بي و 2000 ومنها من يتعامل مع عائلة الـ 9x مثل الوينذوز 98 و Me ....
واما الملف الذي ارفقته لك فهو ملف عام سيعمل بإذن الملك الحق على جميع الانظمة إن شاء تعالى ....
ولكي تتعامل مع اخراج البيانات استخدم المنفذ رقم 888 وهو منفذ البيانات الرئيسي في المنفذ المتوازي ( منفذ الطابعة ) ... الذي يحتوي على ثلاث منافذ رئيسية ارقامها كالتالي :
DataPort = 888 ' Used As Output Port
StatusPort = 889 ' Used As Input Port
ControlPort = 890 ' Used As Input/Output Port
وعلى الجانب الآخر اذا اردت التعامل مع المنفذ التسلسلي وهو الاكثر موثوقية كما اسلفنا فانك هنا بحاجة الى بناء موائم خاص يقوم بتنظيم العمل بين برنامجك والدائرة او الجهاز المراد التحكم فيه ... ولان المنفذ التسلسلي هو الاكثر موثوقية فهو الاكثر استخداما وكأمثلة عن هذا النوع فخذ مثلاً المودم Modems و الشاشات فهي تعمل على المنفاذ التسلسلية ولها موائماتها الخاصة والمعروف لدينا مثلاً بكرت الشاشة DisplayCard ...
وسبب التعقيد يعود الى ان المنفذ التسلسلي يوجد فيها منفذ خاص بالاخراج ويتم اخراج البيانات عن طريقة بشكل متوالي وبالتالي فاذا كان لديك جهازان تريد التحكم بهما فيجب على بطاقة الموائمة تحديد الجهاز المراد تشغيله بحسب المخرجات اليها من البرنامج فمثلاً اذا كانت القيمة الخارجة لها هي 011 فان المقصود هو الجاهز الاول واما اذا كان المخرج هو 010 فان المقصود هو الجهاز الثاني ومن هذا المثال السابق يمكن الاستنتاج بان الدائرة ( الموجودة في بطاقة الموائمة ) يجب ان تكون ذكية بشكل كافي يمكنها من تحديد الجهاز المطلوب ....
ولكن الحال في المنفذ المتوازي مختلف اذ يمكن ربط كل جهاز بمخرج معين مخرجات منفذ الاخراج رقم 888 او الـ DataPort وبالتالي جعل برنامجك يقوم بالارسال الى المخرج المناسب لتشغيل الجهاز المناسب ...
اخي العزيز وددت ان افيدك اكثر بالنسبة للمنفذ التسلسلي غير ان ضعف خلفيتي الالكترونية تمنعي من ذلك ... غير اني يمكن ان ارشدك الى انه يمكنك الاعتماد على الاداة msComm الموجودة في الفيجوال بيسك الاصدار السادس VB6 ... والتي يمكنك اضافتها من القائمة Project ثم Components ثم اختر Microsoft Comm Control 6.0 ...
هذة الاداة تستخدم للتعامل مع المنافذ التسلسلية ... وذلك عن طريق تحديد رقم المنفذ الذي تريد التعامل معه بالخاصية المسماه CommPort يعني اذا كان الجهاز الذي تريد التحكم فيه في المنفذ Com3 بالتالي قم بتحديد القيمة 3 لهذة الخاصية ثم استخدم الخاصية PortOpen لفتح المنفذ وذلك باسناد القيمة True لها وبعد الانهتاء من استخدام المنفذ ينبغي عليك اغلاقه عن طريق إسناد القيمة False للخاصية الاخيرة واما لاخراج البيانات فقم باستخدام الخاصية Output وللادخال الخاصية input ....
اخي العزيز اكتب لك الان قبيل صلاة الفجر ولايحظرني مثال جدي يمكن ان اضعه لك غير اني ارى ان اضرب هذان المثالان البسيطان لعلهما يفيدانك ...
فمثلا هذة الدالة البسيطة تقوم بمعرفة حالة جهاز الفاكس مودم لديك وتعيد لك اما القيمة Yes والتي تعني انه يعمل بشكل سليم او القيمة No والتي تعني العكس ...
Private Function ModemState(ComPort As Integer) As String
Dim S As String
On Error GoTo Bye
Com.CommPort = ComPort
Com.PortOpen = True
Com.Output = "AT" + vbCr
Do Until Com.InBufferCount >= 2
DoEvents
Loop
S = Com.Input
If InStr(LCase(S), "ok") Then
ModemState = "Yes"
Else
ModemState = "No"
End If
Bye:
Com.PortOpen = False
End Function
الدالة تحتاج الى منك تحديد رقم المنفذ الذي يوجد فيه جهاز المودم في جهازك وهو في جهازي المنفذ Com3 وبالتالي فأن رقمه هو 3 اي انني يمكن ان اكتب السطر التالي لاستخدام الدالة السابقة :
MsgBox ModemState(3)
وكمثال آخر عن الفاكس مودم يمكنك استخدام الدالة التالية لمعرفة اسم الفاكس المستخدم في جهازك :
Function GetModemName(ComPort As Integer) As String
Dim S As String
On Error GoTo Bye
Com.CommPort = ComPort
Com.PortOpen = True
Com.Output = "ATI4" + vbCr
Do Until Com.InBufferCount >= 2
DoEvents
Loop
S = Com.Input
If InStr(LCase(S), "ok") Then
GetModemName = Left(S, InStr(LCase(S), vbCrLf + "ok" + vbCrLf) - 1)
End If
Bye:
Com.PortOpen = False
End Function
واستخدامها سيكون مثل الدالة السابقة تماماً ... اي بالشكل :
MsgBox GetModemName(3)
اذا كتب الله التوفيق لهذة الدالة فسوف يظهر اسم الفاكس مودم التابع لك بإذن الله تعالى مع مراعاة كتابة الرقم الموجود فيه جهاز الفاكس مودم بكمبيوترك بدلاً عن الرقم 3 ...
طبعاً لا املك اي فكرة اذا كانت ستعمل اياً من الدوال السابقة في جهازك ام لا لاني لم اجربها من قبل فهي وليدة اللحظة التي اكتب لك بها هذة الرسالة و قد عملت بشكل جيد في جهازي الان ولعلها تنجح عندك بإذن الله تعالى ....
و تبقى نقطة مهمة يجب ان انوه عنها قبل ان اختم كلامي هذا وهي انني استخدمت في مثالي السابقين الاداة MSCom وقد اسميها في برنامجي بالاسم MSComm1 ويعود السبب في اختياري للفاكس مودم الى انه متوفر في معظم الاجهزة تقريباً لهذا سيتسنى للجميع تجربة الدوال .... ولكن ما يجدر التنويه اليه انك ستحتاج الى تعريف اوامرك الخاصة عندما تتعامل مع جهازك الخاص ( الجهاز الذي تريد التحكم فيه ) ...
بكلام آخر استخدمت انا الامر "AT" و ارسلته للفاكس مودم وهو امر معرف مسبقاً عنده ويستطيع التعرف عليه ولكن عندما تقوم ببناء جهازك الخاص او اي جهاز آخر تريد التعامل معه يجب عليك معرفة الاوامر التي يعمل بها هذا الجهاز ثم استخدامها في برنامجك ...
اخي العزيز تمنيت ان يكون لدي اشياء اكثر استطيع ان اقدمها ... ولكن ما باليد حيلة ولك مني الدعاء بالتوفيق إن شاء الله تعالى ....
ولا انسى ابداً ان اشكر الاخ العزيز علاء على حبه للمساعدة دائماً حيث نجده دائماً عندما نحتاجه ... فجزاه الله عنا كل الخير ....
والسلام عليكم ورحمة الله وبركاته ...
نجيب المجيدي
13-12-2003, 05:56 PM
شكراً جزيلاً على هذه المعلومات يا رغيد
وأنا في انتظار مثال كامل منك في الوقت اللي تحبه
يعني ما في داعي تتعب نفسك
أنا عارف انك مشغول بالدراسة كان الله في عونك
و السلام عليكم
رغيد الطيب
13-12-2003, 08:34 PM
السلام عليكم ورحمة الله وبركاته ....
اخي العزيز نجيب ... سرني تفهمك ظروف الدراسة كثيراً ... و يسرني اكثر ان اقدم لك يد العون فيما استطيع ... ولكن كما اسلفت ان الموضوع يحتاج بالفعل الى خبرة في اللكترونيات اذا كنت تنوي ان تتحكم بجهاز انت تصممه ...
اما اذا كنت تريد التحكم بجهاز مصمم مسبقاً من احدى الشركات فينبغي عليك ان تطلع على الاوامر التي يدعمها الجهاز المحدد ثم بعد ذلك تتعامل مع الاداه MSComm للتخاطب مع الجهاز الخارجي ..
كما اريد ان اللفت انتباهك ان الدالة السابقة تعمل فقط مع المودم والسبب انني استخدمت اوامر يعرفها المودم وهو ما يحصل عندما اريد ان اتصل بالانترنت فأن متصفحك يرسل رسالة خاصة الى جهاز المودم وكذلك الحالى اذا اردت ان اجعل برنامجي يتصل عبر خط التلفون فيجب ان استخدم الامر المناسب الذي يفهمه المودم ... وهكذا الحال مع باقي الاجهزة ....
لهذا يجب عليك معرفة الاوامر التي يدعمها الجهاز الخارجي الذي تريد التحكم فيه من قبل الشركة المصنعة او من اي مصدر آخر ...
هذا ما يمكنني ان اقدمه لك اخي العزيز .. واتمنى لك التوفيق ...
كما انك نسيت ان تخبرني هلى عملت الدالتين السابقتين معك بشكل جيد أم لا ؟
والسلام عليكم ورحمة الله وبركاته ....
3laa3sam
13-12-2003, 10:50 PM
بشكرك يأستاذ رغيد ع الكلام اللطيف بتاعك ، اما الاخ نجيب انا يعني كان نفسي نخس سواء بالمجال ده وطبعاً تحت إشراف الاستاذ رغيد الطيب (حفظه الله) بس يعني انا هختصر المشوار وعاوزك تدوز ع كتاب إسمه (فيجوال بيسك التحكم بالالات) وانا هجيبه يمكن بعد يومين وهباشر أقراء فيه وأجرب وهقولك أول باول ولما أوصل لنتيجه هحطها هنا ...ماشي !!!
إنتا في الوقت ده...جرب وأبحث كويس ع الكتاب عشان إحنا نمشي مع بعض ، يالا بقى شد حيلك ياعم نجيب .
نجيب المجيدي
22-12-2003, 07:54 PM
في الحقيقة لم أستطع الحصول على الكتاب يا علاء
ولكن أرجو منك إبلاغي في حال حصلت أنت عليه ولك جزيل الشكر و التقدير
3laa3sam
03-02-2004, 07:22 AM
السلام عليكم ورحمه الله وبركاته
اخي العزيز نجيب المجيدي....أنا أسف لعدم الرد عليك مبكر هذا لانشغالي بهذه الايام لكن عموماً انا قد تحصلت على الكتاب وهوا موجود معي وقد قرات عده تشابترز فيه لكن انا قد أعدته لصاحبه من جديد .
عموماً...يمكننا أنا نتواصل ونتبادل الحديث عن هذا الموضوع على البريد الخاص.
نجيب المجيدي
05-02-2004, 01:52 PM
منتظر منك رسالة
وشكراً
امين وبس
02-03-2004, 11:16 AM
اخي العزيز هناك العديد من الطرق في اتمام عملية التحكم والسيطرة في المجال الخارجي عبر منافذ الكمبيوتر ومنها المنافذ com 1 منفذ الطابعة الذي يحتوي على 8 مداخل 8 مخارج ويمكت تحويلها الى عدد كبير من الاوامر الادخال والاخراج
وهوا يستخدم دوال api وحقيقة مش كل دوال تعمل على كل الانظمة
هذة الدالة تعمل على win98 وا me وهوا عبارة عن ملف dll
يتم وضعة في مجلد system
وتقوم بتعريف الدالة
وبعد ذلك تستطيع التحكم بالمنافذ بالطريقة السهلة
Modules
Public Declare Sub Out Lib "inpout32.dll" Alias _
"Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)
بعد ذلك قم بوضع زر امر على الفورم
واكتب فية
Out &H378, 1
هذا يعني اعطاء المنفذ الاول اشارة
وهنا المنافذ الارضية
وقد ارفت لكم مثال للعمل من ملف dll
وهذا المثال يخص عملية اخراج الاوامر
وهناك مثال اخر يخص ادخال الاوامر الى الكمبيوتر
على فكرة لكن تستطيع معرفة النتائج الا باستخدم ثنائي باعث الضواء
ولكم خالص التحيات
نجيب المجيدي
02-03-2004, 08:06 PM
أشكر لك اهتمامك ..
vBulletin® v3.8.5, Copyright ©2000-2010, Jelsoft Enterprises Ltd.