ג'אווה זוכה לתמיכה סדרתית עם החבילה החדשה javax.comm

ממשק ה- API של Java Communications (aka javax.comm) הוא סיומת סטנדרטית המוצעת המאפשרת למחברים של יישומי תקשורת לכתוב תוכנות Java אשר ניגשות ליציאות תקשורת באופן שאינו תלוי בפלטפורמה. ניתן להשתמש ב- API זה לכתיבת תוכנת הדמיית מסוף, תוכנת פקס, תוכנת קורא כרטיסים חכמים וכן הלאה.

פיתוח תוכנה טובה פירושו בדרך כלל שיש ממשקים מוגדרים בבירור. התרשים ברמה הגבוהה של שכבות ממשק ה- API מוצג באיור זה.

במאמר זה נראה לכם כיצד להשתמש ב- javax.comm כדי לתקשר עם מכשיר טורי המבוסס על RS-232. נדון גם במה מספק ה- API של javax.comm ומה הוא לא מספק. אנו נציג תוכנית דוגמא קטנה המציגה כיצד לתקשר ליציאה הטורית באמצעות API זה. בסוף המאמר נפרט בקצרה כיצד API זה של javax.comm יעבוד עם מנהלי התקנים אחרים, ונעבור על הדרישות לביצוע יציאה מקורית של API זה למערכת הפעלה ספציפית.

שלא כמו מנהלי התקנים קלאסיים, המגיעים עם מודלים משלהם לתקשורת של אירועים אסינכרוניים, ממשק ה- API של javax.comm מספק ממשק בסגנון אירוע המבוסס על מודל האירועים של Java (חבילה java.awt.event). נניח שאנחנו רוצים לדעת אם יש נתונים חדשים שיושבים על מאגר הקלט. אנו יכולים לגלות זאת בשתי דרכים - באמצעות סקרים או הקשבה . עם הסקר, המעבד בודק את המאגר מעת לעת כדי לראות אם ישנם נתונים חדשים במאגר. עם ההאזנה, המעבד ממתין לאירוע שיתרחש בצורה של נתונים חדשים במאגר הקלט. ברגע שמגיעים נתונים חדשים למאגר, הוא שולח התראה או אירוע למעבד.

בין הממשקים הסידוריים השונים הקיימים, שניים מהפופולריים ביותר הם תקני RS-232C ו- RS-422, המגדירים את רמות האות החשמלי ומשמעותם של קווי אות שונים. ממשקים טוריים במהירות נמוכה בדרך כלל מעבירים נתונים כגל מרובע, עם תיאום שעון המסופק על ידי סיביות התחלה ועצירה.

RS-232 מייצג תקן ממליץ 232 ; ה- C פשוט מתייחס לתיקון האחרון של התקן. היציאות הטוריות ברוב המחשבים משתמשות בקבוצת משנה בתקן RS-232C. התקן המלא של RS-232C מציין מחבר "D" בעל 25 פינים, מתוכם 22 פינים. לרוב הפינים הללו אין צורך לתקשורת רגילה למחשבים אישיים, ואכן, רוב המחשבים החדשים מצוידים במחברים זכר מסוג D עם 9 פינים בלבד. למידע נוסף על RS-232, עיין בסעיף משאבים.

הערה: להבנה של מה מנהלי התקנים אחרים עשו בעבר, עיין termioבעמוד הידני של יוניקס או OpenBSD יוניקס, וריאציה של מקור מנהל ההתקן של BSD יוניקס. זה זמין בחינם באינטרנט. אנא עיין בסעיף משאבים למידע נוסף.

ממשק ה- API של javax.comm: מה מסופק

ממשק ה- API של javax.comm מספק את הפונקציונליות הבאה למפתחים:

  • מפרט API מלא ליציאות תקשורת טוריות ומקבילות. (במאמר זה אנו שוקלים יציאות טוריות בלבד.) ללא ממשק API משותף במאמצי הפיתוח שלך, עומס העבודה יגדל מכיוון שתצטרך לספק תמיכה למכשירים טוריים.

  • שליטה מלאה בכל פרמטרי המסגור הסדרתי (ביטים להפסקת שידור, זוגיות, סיביות / מסגרת) וכן שליטה ידנית או אוטומטית בקווי בקרת הזרימה. בדרך כלל, ב- RS-232, ישנם שני קווי איתות והשאר מיועדים לקווי בקרה. תלוי בסוג התקשורת (סינכרוני או אסינכרוני), מספר קווי הבקרה שנבחרו עשוי להשתנות. ממשק API זה מספק גישה לאותות הבקרה הבסיסיים.

    הסטה קצרה כאן עשויה לעזור לך להבין משהו על זוגיות ולהתחיל ולעצור ביטים. זוגיות נוספה ל- RS-232 מכיוון שקווי תקשורת יכולים להיות רועשים. נניח שאנו שולחים ASCII 0 , שב hex הוא שווה ל- 0x30 (או 00110000 בינארי), אבל בדרך מישהו עובר על ידי אוחז במגנט וגורם לאחת מהסיביות להשתנות. כתוצאה מכך, במקום לשלוח 8 סיביות כמתוכנן, נוסף סיבית נוספת למחרוזת הסיביות הראשונה שנשלחה, מה שהופך את סך כל הסיביות שנשלחו שווה או אי זוגית. וואלה ! יש לך זוגיות.

    סיביות התחלה ועצירה נוספו לפרוטוקול התקשורת הטורי כדי לאפשר למקלטים לסנכרן עם התווים הנשלחים. זוגיות של ביט אחד אינה מאפשרת תיקון שגיאות - רק גילוי. פתרונות לבעיה זו מגיעים מפרוטוקולים שמונחים על גבי ממשקי ה- API הסדרתיים. רוב התקשורת הסדרתית משתמשת בימינו בפרוטוקולי חסימות עם בדיקות בדיקה (פונקציה מתמטית שניתן ליצור על המקלט ולהשוות אותה לבדיקת השידור המשודרת) המאפשרים לזהות שגיאות בקבוצות סיביות גדולות יותר. כאשר אתה מתקשר עם ספק שירותי האינטרנט שלך באמצעות PPP, יתכן שחבילות יהיו 128 בתים לחבילה עם סכום בדיקה. אם הם תואמים, אתה בטוח 99.999% שהנתונים בסדר.

    ישנם מקרים בהם תוכנית זו אינה פועלת. לדוגמא, כאשר שולחים פקודות קריטיות למכשירים שנמצאים רחוק מאוד במערכת השמש, ניתן להשתמש בפרוטוקולי תיקון קדימה . יש צורך בפרוטוקולים לתיקון קדימה מכיוון שלא יכול להיות זמן להעברה חוזרת, ובמרחב יש הרבה רעש אלקטרומגנטי.

    אוקיי, חזרה לרשימת הפונקציות שמספק ה- API של javax.comm!

  • קלט / פלט בסיסי באמצעות תת-מחלקה של זרמי Java IO. עבור קלט ופלט, ה- API של javax.comm משתמש בזרמים; הרעיון של זרמים צריך להיות מוכר לכל מתכנתי Java. חשוב לעשות שימוש חוזר במושגי Java בעת בניית פונקציונליות חדשה או שממשקי ה- API יהפכו לבלתי מסובכים.

  • זרמים הניתנים להרחבה כדי לספק בקרת זרימת לקוח ובקרות סף. לדוגמה, ייתכן שתרצה התראה כאשר ישנם 10 תווים במאגר או כאשר נותרו רק 10 מיקומים לתווים. בקרת זרימה חשובה כאשר שני המכשירים המחוברים באמצעות ממשק אינם יכולים לעמוד בקצב אחד עם השני. ללא בקרת זרימה, אתה יכול לקבל צפות או underruns . במצב חריגה, קיבלת נתונים לפני שעובדו כך שהם אבדו; בתחתית היית מוכן לנתונים אבל זה לא היה זמין. בדרך כלל תנאים אלה מתרחשים ב- USART (משדר מקלט אסינכרוני מקלט סינכרוני אוניברסלי), שהוא חומרה הממירה בתים לצורת גל סדרתי עם תזמון שתואם את קצב השידור.

    ממשק ה- API של javax.comm משתמש במודל האירועים Java כדי לספק הודעה על שינויים שונים בקו האות וכן על מצב חיץ. שינויים במדינה מתייחסים לאותות מוגדרים היטב שצוינו בתקן RS-232. לדוגמא, זיהוי מוביל משמש מודם כדי לאותת שהוא יצר קשר עם מודם אחר, או שהוא זיהה צליל מוביל. יצירת החיבור או איתור צליל נשא הם אירוע. זיהוי אירועים והודעות על שינויים מיושמים ב- API זה.

מה לא מסופק

ממשק ה- API של javax.comm אינו מספק:

  • עיבוד סוג משמעת קו, ניהול חייגן או ניהול מודם. משמעת קו מתייחסת לעיבוד נוסף של תווי קלט או פלט. לדוגמא, אפשרות נפוצה לאחר עיבוד היא המרת CR ל- CR LF. מקורם של מונחים אלה בראשית ימי הטלטיפיות. CR (החזרת מרכבה) פירושו להחזיר את הכרכרה בפשטות לשוליים השמאלים; בעולם הערבי, זה יהיה השוליים הנכונים. LF (הזנת קו) מקדם את אזור ההדפסה באחד. כאשר הגיעו מסכי מפת סיביות ומדפסות לייזר, מונחים אלה הפכו פחות חשובים.

    חייגן וניהול ו וניהול מודם הם יישומים נוספים שיכולים להיכתב באמצעות API javax.comm. ניהול חייגן מספק בדרך כלל ממשק לממשק הפקודה AT של ניהול המודם. כמעט לכל המודמים יש ממשק פקודה AT. ממשק זה מתועד במדריכי מודם.

    אולי דוגמה קטנה תבהיר את המושג הזה. נניח שיש לנו מודם ב- COM1 ואנחנו רוצים לחייג למספר טלפון. יישום ניהול חייגן ג'אווה יבקש את מספר הטלפון וחקר את המודם. פקודות אלה מתבצעות על ידי javax.comm, מה שלא עושה שום פרשנות. לחיוג למספר 918003210288, למשל, הנהלת החייגן כנראה שולחת "AT", בתקווה להחזיר "OK", ואחריה ATDT918003210288. אחת המשימות החשובות ביותר של ניהול חייגן וניהול מודמים היא להתמודד עם שגיאות ופסקי זמן.

  • GUI לניהול יציאות טוריות. בדרך כלל, ליציאות סדרתיות יש תיבת דו-שיח המגדירה את תצורת היציאות הטוריות, ומאפשרת למשתמשים להגדיר פרמטרים כגון קצב שידור, זוגיות וכו '. התרשים הבא מתאר את האובייקטים המעורבים בקריאה ו / או בכתיבת נתונים ליציאה טורית מג'אווה.

  • תמיכה בפרוטוקולי מודם X, Y ו- Z. פרוטוקולים אלה מספקים איתור ותיקון שגיאות תמיכה.

יסודות התכנות

לעתים קרובות מדי, מתכנתים צוללים היישר לפרויקט ומקודדים אינטראקטיבי עם ממשק API על המסך מבלי להקדיש מחשבה לבעיה שהם מנסים לפתור. כדי למנוע בלבול ובעיות אפשריות, אסוף את המידע הבא לפני שתתחיל בפרויקט. זכור, בדרך כלל מכשירי תכנות דורשים שתתייעץ במדריך.

  1. קבל את המדריך למכשיר וקרא את הסעיף בממשק RS-232 ופרוטוקול RS-232. ברוב המכשירים יש פרוטוקול שיש לעקוב אחריו. פרוטוקול זה יישא על ידי ה- API של javax.comm ויועבר למכשיר. המכשיר יפענח את הפרוטוקול, ותצטרך לשים לב היטב לשליחת נתונים הלוך ושוב. אי-הגדרת ההגדרה הראשונית נכונה יכולה להיות שהיישום שלך לא יתחיל, אז קח את הזמן לבדוק את הדברים בעזרת יישום פשוט. במילים אחרות, צור יישום שיכול פשוט לכתוב נתונים ליציאה הטורית ואז לקרוא נתונים מהיציאה הטורית באמצעות ה- API של javax.comm.

  2. נסה להשיג כמה דוגמאות קוד מהיצרן. גם אם הם בשפה אחרת, דוגמאות אלה יכולות להיות שימושיות למדי.

  3. מצא וקודד את הדוגמה הקטנה ביותר שאתה יכול לאמת שאתה יכול לתקשר עם המכשיר. במקרה של מכשירים טוריים, זה יכול להיות כואב מאוד - אתה שולח נתונים למכשיר המחובר ליציאה הטורית ושום דבר לא קורה. לעתים קרובות זו תוצאה של מיזוג שגוי של הקו. הכלל מספר אחד בתכנות המכשירים (אלא אם כן אתה כותב מנהל התקן) הוא לוודא שאתה יכול לתקשר עם המכשיר. עשה זאת על ידי מציאת הדבר הפשוט ביותר שתוכל לעשות עם המכשיר שלך והפעלתו לעבודה.

  4. אם הפרוטוקול מסובך מאוד, שקול להשיג תוכנת מנתח קו RS-232. תוכנה זו מאפשרת לך להסתכל על הנתונים הנעים בין שני המכשירים בחיבור RS-232 מבלי להפריע לשידור.

Using the javax.comm API successfully in an application requires you to provide some type of interface to the device protocol using the serial API as the transport mechanism. In other words, with the exception of the simplest devices, there is usually another layer required to format the data for the device. Of course the simplest protocol is "vanilla" -- meaning there is no protocol. You send and receive data with no interpretation.

Overview of suggested steps for using javax.comm

In addition to providing a protocol, the ISO layering model used for TCP/IP also applies here in that we have an electrical layer, followed by a very simple byte transport layer. On top of this byte transport layer you could put your transport layer. For example, your PPP stack could use the javax.comm API to transfer bytes back and forth to the modem. The role of the javax.comm layer is quite small when looked at in this context:

  1. Give the javax.comm API control of some of the devices. Before you use a device, the javax.comm API has to know about it.

  2. Open the device and condition the line. You may have a device that requires a baud rate of 115 kilobits with no parity.

  3. Write some data and/or read data following whatever protocol the device you are communicating with requires. For example, if you connect to a printer, you may have to send a special code to start the printer and/or end the job. Some PostScript printers require you to end the job by sending CTRL-D 0x03.

  4. Close the port.

Initializing the javax.comm API registry with serial interface ports

The javax.comm API can only manage ports that it is aware of. The latest version of the API does not require any ports to be initialized. On start-up, the javax.comm API scans for ports on the particular host and adds them automatically.

You can initialize the serial ports your javax.comm API can use. For devices that do not follow the standard naming convention, you can add them explicitly using the code segment below.

// Register the device CommPort ttya = new javax.comm.solaris.SolarisSerial("ttya","/dev/ttya"); CommPortIdentifier.addPort(ttya,CommPortIdentifier.PORT_SERIAL); CommPort ttyb = new javax.comm.solaris.SolarisSerial("ttyb","/dev/ttyb"); CommPortIdentifier.addPort(ttyb,CommPortIdentifier.PORT_SERIAL); 

Opening and conditioning devices

This next code sample demonstrates how to add, condition, and open a device. Details on the specific method calls are in the API pages for javax.comm. This example sets the device called XYZSerialDevice to be accessible with name GenericSerialReader. The device connected on this line has a baud rate of 9600, 1 stop bit, a character of 8 bits (yes, they can be smaller), and no parity. The result of all of this is to provide two streams -- one for reading and another for writing.