الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس : الحزمة javax.comm

مغلق
بدأه nardien28 في 6 سبتمبر 2006 · 11 رد · 4,276 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

تعريف :

هي واجهة التطوير البرمجية API المعنية بتقنيات الاتصالات ( منافذ الاتصال ) في لغة البرمجة جافا

تعمل مع أنظمة التشغيل Windows و Solaris .

توجد العديد من الاجهزة والأدوات (هاردوير) منفصلة عن جهاز الحاسوب مثل الطابعات ، المايك ، الكاميرا الرقمية ، الهاتف ، الروبوت ، الماسح الضوئي ، الهاتف ، الدارات الكهربائية ، الأجهزة الحاسوبية الكفية .......الخ

هذه ال API توفر للمطورين حلول برمجية للوصول الى هذه الأجهزة عبر مصادر الاتصال (منافذ الحاسب)

هذه الحزمة تدعم كل من المنافذ التسلسلية (منفذ الطابعة COM) المعيرة بالمعيار RS232 والمنافذ التفرعية(LPT) المعيرة بالمعيار IEEE-1284

وذلك يشمل دعم كل الانشطة التقليدية المتعلقة بهذه المنافذ مثل الاعدادات المتعلقة بها Configuration , ارسال البيانات واستقبالها ... الخ

تعتمد واجهة التطوير هذه المنهجية البرمجية المساقة بالأحداث Event-Driven

أمثلة لهذه الأحداث :

الأحداث المتعلقة بملكية منافذ الاتصال (احتكارها من قبل تطبيق برمجي ما) والأحداث المتعلقة بحالات هذه المنافذ .

ان ميزة مراقبة المنافذ تجعل التطبيق البرمجي ينتظر المنفذ حتى يكون جاهزا للإستخدام (غير مستخدم من قبل تطبيق اخر) حيث تستطيع عندئذ الAPI ارسال الأحداث الى التطبيق .

ملاحظة هامة : بالرغم من ان منفذ USB هو المنفذ الاساسي لكثير من الأجهزة هذه الايام الا انه حتى اليوم لم تدعمه الحزمة javax.comm ولكنها وضعته في خططها المستقبلية للإصدارات القادمة من هذه الحزمة .

تجهيز بيئة العمل

أولا : ( في حال عدم توافر أي بيئة لتطوير جافا ) تنزيل Java Development Kit (JDK) وتنصيبه ( ابتداء من الاصدار 1.1.6 فما فوق )

ثانيا : تنصيب الحزمة javax.comm بالطريقة التالية :

  • قم بتنزيل الملفات المرفقة وفك الضغط
  • انسخ الملف win32com.dll وضعه في المجلد bin الموجود في ال JDK وضع نسخة اخرى منه في المجلد في المجلد bin الموجود في ال المجلد jre الموجود في ال JDK وضع نسخة اخرى منه في المجلد في المجلد System32 الموجود في ال المجلد Windows
  • انسخ الملف comm..jar وضعه في المجلد lib الموجود في ال JDK وضع نسخة اخرى منه في المجلد في المجلد ext الموجود في ال المجلد lib الموجود في المجلد jre الموجود في ال JDK
  • انسخ الملف javax.comm.properties وضعه في المجلد lib الموجود في ال JDK وضع نسخة اخرى منه في ال المجلد lib الموجود في المجلد jre الموجود في ال JDK
  • اعد تشغيل الجهاز Restart

comm.zip

javax.comm.zip

win32com.zip

تم تعديل هذه المشاركة بواسطة nardien28 في 6 سبتمبر 2006 في 11:22

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#2

يسعدني أن أكون أول من يرد على هذا الموضوع .. ألف شكر وننتظر المزيد

فحنوت ألثم جرحه الرعافَ فانتكأت جراحي..

وهمت على خدي الدموع فقلت يا روحي وراحي..

هلّا رحمتَ قلوبنا .. وعدلت عن هذا الرّواحِ ِ ..؟

فأجابني البطل المسجّى هازئاً بيَ .. باقتراحي

كفكف دموعك ليس في عبراتك الحرّى ارتياحي

هذي سبيلي .. إن صدقت محبتي .. فاحمل سلاحي

Sun Certified Java Programmer

#3

بنية الحزمة javax.comm

تحوي واجهة التخاطب البرمجية javax.comm ثلاث مستويات من الصفوف :

  • الصفوف عالية المستوى مثل CommPortIdentifier و CommPort تنظم الوصول الى منافذ الاتصال وملكيتها (احتكارها من قبل تطبيق برمجي ما)
  • الصفوف المنخفضة المستوى مثل SerialPort و ParallelPort التي تمثل واجهة برمجية للتعامل مع منافذ الاتصال الفيزيائية .
  • صفوف مستوى التحكم Driver-Level تمثل واجهة تخاطب بين الصفوف المنخفضة المستوى ونظام التشغيل وهي تمثل قسم تحكمي من واجهة التطوير البرمجية حيث لا علاقة للمبرمج به ولا يستخدمه في البرمجة .

والشكل التالي يبين مخطط الصفوف الأكثر أهمية في الواجهة javax.comm

a5a6e7b61d.gif

يتمحور عمل واجهة التطوير البرمجية javax.comm حول الصف المجرد CommPort (الذي يمثل نموذج عام للاتصالات حيث يحوي طرائق عمومية مثل

()getInputStream و() getOutputStream) وصفان جزئيان يرثانه هما SerialPort و ParallelPort , بواني هذه الصفوف ليست عامة Public وبالتالي إنشاء اغراض من هذه الصفوف يستوجب استخدام الطريقة المصنعة الستاتيكية وفقا لنموذج التصميم SimpleFactory بالشكل التالي :

CommPortIdentifier.getPortIdentifier("اسم المنفذ");

أو للحصول على قلئمة المنافذ المتوافره في الجهاز Enumeration

CommPortIdentifier.getPortIdentifiers();

وباختيارك احد المنافذ التي تعرفت اليها الحزمة واستدعاء الاجرائية الستاتيكية

Open() عبر الصف CommPortIdentifier بذلك يتم انشاء غرض عن الصف CommPort

وبعد ذلك نجري تحويلا قسريا على هذا الغرض المنشأ عن الصف CommPort للحصول على صف جزئي غير مجرد يمثل (ينمذج) قناة اتصال معينة , هذا الصف الجديد قد يكون ParallelPort أو SerialPort

كل من هذين الصفين لديه طرائق تختص بشؤون النوع الذي يشير اليه من المنافذ .

مثلا لدى الصف SerialPort اجرائيات لإعداد بعض التشكيلات الخاصة به مثل معدل البود BaudRate , الإزدواجية Parity ... الخ

وكذلك لدى الصف ParallelPort اجرائيات لتشكيل الاعدادات الخاصة بحالة المنفذ

(لا افهمها لأنه لدي خلفية عن المنفذ التسلسلي فقط )

كلا الصفين يمتلكان اجرائيات تسمح لنموذج الأحداث التقليدي في جافا باستلام اشعارات ببعض الأحداث مثل حجم البيانات المتوافرة للقراءة , وجود أو عدم وجود ذاكرة مخصصة للخرج استقبال البيانات buffer

كذلك الأحداث المتعلقة بحالة المنفذ التسلسلي التي تتغير بتغيرات في الاشارات التحكمية مثل

Carrier Detect CD

Ring Indecator RI

Data Transmit Ready DTR

حيث ان الغرض المنشأ عن الصف SerialPort يقوم بانتاج غرض عن الصف SerialPortEvent الذي يصف هذه التغيرات .

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#4

متابعين معك ان شاء الله ...

و الله يعطيكي العافية .. مواضيعك دائما تستحق القراءة ....

SCJP 5.0

#5

رائع يا أختي nardien28

واتمنى أن تستمري على هذا العطاء الجميل

كالعادة نرجو من الإدارة التثبيت

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#6

تجدون معلومات مفيدة عن المنفذ التسلسلي RS232 باللغة العربية كبحث للأخ محمد الغزالي أرفقه هـــــــــنــــــــــــا

تجدون معلومات مفيدة عن المنفذ التفرعي LPT هـــــــــنـــــــا

أكـــــــــــــــــواد

هذا الكود يطبع على الشاشة اسماء المنافذ المتوافرة على الجهاز

Static Enumeration portList;
Static ComPortIdentifier portId;
portList=ComPortIdentifier.getPortIdentifiers();
while(portList.hasMoreElements()){
portId=(ComPortIdentifier)portList.nextElement();
System.out.println(“Here is a port [”+portId+”]”);
}

هذا الكود لتفتح المنفذ الذي تريده (هنا COM2) للكتابة ووبفتحه سيتم حجزه لعملية الكتابة لمدة 2000 ميكروثانية (انت تحددها) قبل اغلاقه ثانية اذا لم تبدأ عملية الكتابة على المنفذ خلال هذا الزمن (يسمى timeout)

Static ComPortIdentifier portId;
portId=ComPortIdentifier.getPortIdentifiers(“COM2”);
my_serial_port=(SerialPort)portId.open(“SimpleWrite”,2000);

تعريف مجرى بيانات مخصص للخرج على المنفذ (هنا التسلسلي) لعملية الكتابة

Static OutputStream output;
Output= my_serial_port.getOutputStream();

هذا الكود لإعداد التشكيلات الخاصة بالمنفذ التسلسلي الذي تريد استعماله

لمعلومات اكثر عن البرامترات وترتيبها راجع الDocumentation لهذه الحزمة في موقع Sun

my_serial_port.setSerialPortParams(9600, SerialPort.DATABITS_8, 
							   SerialPort.STOPBITS_1, 
							   SerialPort.PARITY_NONE);

عملية الكتابة على مجرى البيانات الذي يمثل الخرج

(سيجري ضخ البيانات عبر المنفذ التسلسلي الى خارج الجهاز عبر قناة RS232 وفقا للإعدادات التي اخترتها للاتصال ) :

Static String msg=”هذا من فضل ربي”;
Output.write(msg.getBytes());

واخيرا اغلاق المنفذ :

my_serial_port.close();

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#7

صحيح .. تذكرت .. لتجريب برامجكم المكتوبة بهذه ال API (المعنية بالمنفذ التسلسلي) على نفس الجهاز LoopBack Function

بستخدام كابل RS232 واجراء التعديل التالي عليه

f2cb076f1b.gif

ومن ثم وصل احد اطرافه الى حد المنافذ التسلسلية في الجهاز .. مثلا COM1

ووصل الطرف الأخر الى منفذ اخر في نفس الجهاز COM2

عندئذ نستخدم احدها للقراءة والأخر للكتابه

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#8

بما ان عنوان الموضوع واضح لا اعتقد بوجود حاجة للتثبيت..

فاي شخص يحتاج الى معلومات حول هذا الموضوع يمكنه استخدام خاصية البحث و سوف يجد الموضوع امامه

يمكن ان نضع له رابط في احدى المواضيع المثبتة...

و شكرا جزيلا للاخت nardien على شرحها الكافي و الوافي

Theory is when you know something, but it doesn't work. Practice is when something works, but you don't know why. Programmers combine theory and practice: Nothing works and they don't know why

#9

قبل كل شيء أهلا وسهلا بمشرفنا رامي بعد الغيبة الطويلة

لم يتبقى الا نموذج الأحداث (كلامي عن المنفذ التسلسلي)

والشكل التالي يبين مخطط الصفوف الذي يبين قسم معالجة الأحداث في هذه الAPI

0e9c4095c5.gif

واستخدامه سهل جدا ..

بجعل صف التطبيق يحقق implement الواجهة SerialPortEventListener وذلك بتحقيق (كتابة الكود) للطريقة

SerialEvent(SerialPortEvent ev)

التي تستخدم غرضا من الصف SerialPortEvent كبرامتر لها وهو المسؤال عن التقاط الأحداث

عبر الطريقة

getEventType()

التي ترجع هذا العدد الذي يعبر عن نوع الحدث حيث تم التعبير عن كل حدث بعدد integer وتم قرنه بأحد حقول الصف

راجع الDocumentation

والكود التالي يبين نموذج معالجة احداث (تحقيق الكود للطريقة SerialEvent ) لا يستجيب لشيء الا حدث وجود بيانات جاهزة للقراءة على المنفذ والاستجابة تكون بقراءتها وتخزينها في readBuffer ومن ثم طباعتها على الشاشة

طبعا لن تنسو كتابة implement SerialPortEventListener عند ترويسة الصف

public void serialEvent(SerialPortEvent event) {
	switch (event.getEventType()) {

	case SerialPortEvent.BI:

	case SerialPortEvent.OE:

	case SerialPortEvent.FE:

	case SerialPortEvent.PE:

	case SerialPortEvent.CD:

	case SerialPortEvent.CTS:

	case SerialPortEvent.DSR:

	case SerialPortEvent.RI:

	case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
		break;

	case SerialPortEvent.DATA_AVAILABLE:
		byte[] readBuffer = new byte[20];

		try {
		while (inputStream.available() > 0) {
			int numBytes = inputStream.read(readBuffer);
		} 

		System.out.print(new String(readBuffer));
		} catch (IOException e) {}

		break;
	}

}

سيمضي ركبنا العملاق لن يركع .. بإيمان لغير الحق لا يصدع

عزيزا شامخا كالمجد بل أروع .. فسجل أيها التاريخ ما تسمع :

فلسطين لنا الآمال والمطمع .. نعاهد أن نحررها وأن ترجع

ونقسم نستعيد الأرض أو نصرع .. ويبقى رمزنا الزيتون والمدفع

Palestine.gif

#10

بجد شكرا جدا على المعلومات دى ويارب فى استمرار على طول

#11

يرجى من nardien28 المساعدة

مشروع تخرج voice mail وعما نجد صعوبة في التعامل مع vavax.comm في استقبال الاتصال و ارسال بيانات و معرفة رقم المتصل يرجى المساعدة

#12

مشكوووووووووووووووور اخى

جزاك الله خير

هذا الموضوع مغلق.

مواضيع مشابهة