كيف يمكنني التعامل مع البوابة التفرعية LPT بواسطة توابع الاسمبلي في C Builder
كيف يمكنني التعامل مع بوابة الLPT
جرب هذا الموقع:
http://www.epanorama.net/circuits/parallel_output.html
انا لا أعرفه و لم أقرأه, و لكن دلني عليه أحد اصدقائي.
السلام عليكم و رحمة الله و بركاته..
بالنسبة للوصول لمنفذ الطابعة في البويلدر سي++ فيلزمك استعمال دوال باستعمال لغة الأسمبالي لأنها فعالة وسريعة وستعوضع بكفائة عن الدوال القديمة التي ربما لن تجدها مدعومة في إصدارات بورلاند بويلدر وهي outportb و inportb بالنسبة لإرسال و استقبال بيانات Byte, و inpw و outpw للبيانات بWord.
أنا أستعمل مركب كتبته لبورلاند ديلفي تستطيع ترجمته بسهولة إلى لغة سي++ و الوصول لكل منافذ وأرجل المخرج المتوازي للطابعة.
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
جرب الكود ده
unsigned char InPort(unsigned short portaddr)
{
unsigned char buf;
_asm xor ax,ax
_asm mov dx,portaddr
_asm in al,dx
_asm mov buf,al
return buf;
}
void OutPort(unsigned short portaddr, unsigned char dataval)
{
_asm mov dx,portaddr
_asm mov al,dataval
_asm out dx,al
}السلام عليكم
للاسف السؤال غير واضح والاجابات تتحدث عن شيئين مختلفين, هل تريد القيام بفتح إتصال معى lpt من داخل الوندوز 32 بت ام تريد ان تستخدم بيئة الدوس؟؟
لو كنت تريد ان تستخدم بيئه الدوس فيمكنك إتباع طريقة الاخ asm4all وتستخدم in و out للتعامل معى المنفذ. والمثال الذى طرحه الاخ asm4all سيعمل بدون اى مشاكل.
اما إذا كنت تريد التعامل معى البيئه المحميه للوندوز فلن تستطيع التعامل مباشرتاً معى المنافذ, لانها بيئه محميه, وإنما تتعامل معها كملفات وتستخدم لذالك الداله openFile; هناك مكتبات يمكنك إضافتها لتتعامل معى المنافذ وتسمح لك باستخدام in و out ولكنها ليست إتصال مباشر كما كان الحال فى بيئة الدوس, وإنما هى مكتبات توحى لك انك على إتصال مباشر, انا شخصياً افضل إستخدام طريقه الملف والتعامل معى المنافذ على هذا الاساس يسهل الكثير.
والسلام
لا إله إلا الله محمد رسول الله
busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.
أستسمح منك يا أخي أحمد. لكن ما قصده الأخ السائل هو كيفية الوصول إلى منفذ الطابعة بدون استعمال أية بروتوكولات سواء كانت البيئة هي الدوس أو حتى في بيئة Win32.
فما جاء به Asm4all صحيح في كل بيئة.
فقط أنه في WinNt و Windows 2000 وكذلك winXP لن يستطيع الولوج واستعمال المنفذ دون استعمال دوال Api وهي التي ذكرتها OpenFile. هذه الدوال بالنسبة لي هي دوال عقيمة لا تتيح لك التصرف مع منفذ الطابعة بالحرية الكاملة.
في بويلدر سي++ يمكنك كتابة دوال الني أعطاك Asm4all على هذا النحو:
/****************************************************************
* Port Read byte function *
* Return: byte value from given port *
****************************************************************/
unsigned char __fastcall PortIn(unsigned short wAddr)
__asm
{
mov dx,ax
in al,dx
}
/****************************************************************
* Procedure d'ecriture d'un octet sur le port E/S *
* Parametre: adresse du port, octet de sortie
****************************************************************/
void __fastcall PortOut(unsigned short wAddr, unsigned char Value);
__asm
{
xchg ax,dx
out dx,al
}هذه الكتابة لإنني استعملت وسم __fastcall, وهذا يفيد أن المصرف سيستعمل باراميترات الدالة مباشرة باستعمال مسجلات المعالج registers مباشرة على التوالي Ax ثم Dx, و الناتج التي ترجعه الدالة سيكون في Ax.
هذا فقط في Borland أما في VisualC++ فالأمر يختلف لأن مايكروسفت تستعمل البتاراميترات من dx و cx
تم تعديل هذه المشاركة بواسطة ikossan في 24 مارس 2005 في 03:16
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
هذا الكود لمعرفة عنوان منفذ الطابعة الموجود في الحاسب.
هذه الدالة تأخذ كباراميتر رقم المنفذ( من 1 إلى 3) وترجع عنوان المنفذ:
/******************************************************************
* get the LPT Port adresse Quiqly *
* Run well only for Win9X. *
* parameter: PortNo number of the port( 1 to 3) *
* return: Adress port from given number of port in the AX Register*
******************************************************************/
unsigned short __fastcall GetPortAddress(unsigned char PortNo): word
__asm
{
push es
push ebx
mov ebx, PortNo
shl ebx,1
mov ax,40h // Dos segment adress
mov es,ax
mov ax,ES:[ebx+6] // get port adress in 16Bit way
pop ebx
pop es
}
//---------------------------------------------------------------------------:D
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
معلومه جديده اخى مراد, انا لم اكن اعلم ان البورلاند سى بلس بلس يسمح بإستخدام in و out, وحتى الميكروسوفت اسمبلر لا تسمح بذالك, على كدا الواحد ينتقل لإستخدام بورلاند سى بلس بلس.
لا إله إلا الله محمد رسول الله
busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.
استعمال in وout غير مرتبط بالبرمجة ببويلدر سي++!! يمكنك استعمال هتين التعليمنين كيفما تشاء و في اية لغة برمجة تقبل لغة التجميع.. أنا شخصيا استعملتها في بورلاند ديلفي..لكن فقط في منصة Win32 مثل Win9x و WinMeو Dos.. لكن لايمكنك استعمالها في Win2K أو WinXp.
سأتغيب عن المنتدى وستكون لي زيارات خفيفة بين الحين و الحين
يا صاحب الهم إن الهم منفرج.....................أبشر بخير فإن الفارج الله.
اليأس يقطع أحيانا بصاحبه..........................لا تيأس فإن الكافي الله.
الله يحدث بعد العسر ميسرة.........................لا تفزعن فإن الصانع الله.
إذا بليت فثق بالله وارض به...................فإن الذي يكشف البلوى هو الله.
و الله ما لك غير الله من أحد.......................فحسبك الله في كل لك الله
أخوكم مراد
السلام عليكم
نعم اخى مراد هذا ما قصدته, اعذرنى فانا لم استخدم 95 و98 منذ اكثر من 4 سنوات لذالك نسيت انه يمكنك إستخدام هذه الدوال, المهم عندى هو اكس بى و 2000 لانه الاكثر إنتشاراً, الان إتفقنا ان هذه الدوال لا تستطيع إستدعائها فى بيئه الانظمه الجديده إلا عن طريق vxd او تحويل البرنامج إلى ring 0 .
والسلام
لا إله إلا الله محمد رسول الله
busbar : يجب ان تدرك انه هناك حد ادنى للمعرفة المطلوبة قبل البدء في عمل أي شئ.
كما زكر الأخ مراد الكود سيعمل سواء في الدوس او الويندوز غير نظام nt
وللتعامل مع نظام nt يتم عمل driver للمنفذ , وع أني رأيت كود لهذه الوظيفه الا أنني أرى أنها صعبه ( مش داخله دماغي يعني )
عموما ده تعديل بسيط يمكن تجربته كمثال كامل
#include <stdio.h>
void outport(unsigned int port,unsigned char data)
{
_asm mov dx, port
_asm mov al, data
_asm out dx, al
}
unsigned char inport(unsigned int port)
{
_asm mov dx, port
_asm in al, dx
}
int main(void)
{
outport(888,255);
printf("\nThe Input Value From Port 0x378 is %x\n",
inport(0x378));
return 0;
}هذا الموضوع مغلق.
