פנייה בקוד ל -USB בסביבת אובונטו

hani76

New member
פנייה בקוד ל -USB בסביבת אובונטו

שלום, אני מתכנתת בשפת C. לאחרונה עובדת בסביבת לינוקס. יחסית חדשה בתחום הלינוקס.
יש לי אפליקציה (בשפת C) שעובדת על מכשיר מסויים עם אובונטו 12.04.
כעת אמורה לחבר למכשיר שלי מסוף דרך ה -USB ולהעביר אליו ולקבל ממנו נתונים. אני אמורה להעביר אליו נתונים, הוא מבצע איתם פעולות ומחזיר לי תוצאות.
שאלתי: כיצד אני בכלל מתחילה "לתקשר" עם המסוף? מה סדר הפעולות שצריכה לעשות ובאילו פונקציות יש להשתמש לשם פתיחת הקשר, העברת הנתונים וכו'...
אשמח לכל עזרה או הפנייה למקור מידע באינטרנט ממנו אוכל ללמוד על הנושא.
תודה רבה!!!
 

BravoMan

Active member
תלוי.

אם המכשיר מדבר בפרוטוקול סיריאלי (Serial over USB), ולא הסירו את הדרייבר הרלוונטי מגרסת Ubuntu שאת מפתחת אליה, אפשר לעבוד איתו כמו עם קובץ רגיל, כי כל דבר בלינוקס הוא קובץ.
&nbsp
ההתקן יופיע בתיקייה dev/ בתור קובץ ווירטואלי ttyUSB0 (ייתכן שהמספר יהיה שונה אם יש עוד התקנים).
&nbsp
אפשר פשוט לפתוח את הקובץ עם הפונקציות של הספרייה הסטנדרטית של C ולכתוב ולקרוא ממנו.
ייתכן שיהיה צורך לקבוע הגדרות תקשורת, ראי כאן:
http://linux.die.net/man/3/tcsetattr
&nbsp
אם המכשיר מתנהג בצורה לא סטנדרטית, או מסיבה כלשהי אין דרייבר סיריאלי, אפשר לנהל את התקשורת ברמה הכי low level שיש בעזרת ספרייה נחמדה מאוד בשם libusb.
http://www.libusb.org
&nbsp
מומלץ להשתמש בגרסה 1.0 החדשה יותר. היא גם מתועדת טוב יותר.
&nbsp
השימוש בה די קל, אבל צריך להבין את כל מבנה ה-USB מהם Interfaces, מזה Endpoints וכו'
&nbsp
זה קצת יותר חומר ממה שאני יכול להסביר ע"ג הפורום, אבל אם כבר עבדת עם התקני USB את אמורה להכיר אותו, לחלופין, אם לא, כל ההסברים זמינים ברשת.
למשל, זה אתר טוב:
http://www.beyondlogic.org/usbnutshell/usb1.shtml
&nbsp
בכל מקרה, המכשיר אמור לבוא עם הוראות.
&nbsp
בהצלחה!
 

hani76

New member
אם הבנתי נכון...

במידה והדרייבר לא הוסר, כל מה שצריך לעשות זה לבצע mount להתקן ולבצע פקודות write/read לפי הצורך? הבנתי נכון?
(יש צורך להגידרו בקובץ FSTAB?)
תודה.
 

BravoMan

Active member
לא.

זו לא מחיצה, אין שם מערכת קבצים, לכן לא צריך ואי אפשר לעשות לזה mount.
&nbsp
אבל זה כן אמור להופיע כמה שנקרא "character device" (בניגוד ל-block device של כוננים למשל), ואפשר, תאורטית, לעשות לזה fread ו-fwrite.
&nbsp
כמובן, השאלה האמתית היא מה המכשיר ומה הפרוטוקול שהוא עובד בו.
 

hani76

New member
...

למרות שמחובר דרך ה USB, לא צריך לבצע mount?
אז אם כך איך אני מזהה אותו? איך אני יודעת מאיפה/לאיפה לבצע READ/WRITE?
(זה מסוף שמחובר למכשיר שלי ואני אמורה לשלוח אליו נתונים ולקבל ממנו תשובה לאחר עיבוד שעשה לנתונים).
תודה!!
&nbsp
 

BravoMan

Active member
mount היא פעולה שעושים למשהו

שאמור להכיל מערכת קבצים.
אין שום קשר ל-USB.

זו פעולה שיכולה לקחת קובץ, או התקן בכל צורת חיבור, או אפילו חתיכה מזיכרון RAM, ולהפוך אותה לחלק ממערכת קבצים.

איך המסוף מזדהה תלוי בפרוטוקול שהוא עובד בו.
בהנחה שהוא עובד בפרוטוקול סיריאלי תקני, הוא אמור להופיע בתור ttyUSBX כאשר X הוא מספר כלשהו, שמתחיל ב-0 ותלוי בהתקנים סיריאלים ע"ג USB אחרים שקיימים במחשב המארח.

הדרך הפשוטה ביותר לזהות אותו היא להריץ את הפקודה הבאה כאשר המכשיר מחובר, וכאשר הוא מנותק ולהשוות מה נשתנה:
ls /dev/ttyUSB*
יש גם אפשרות שהמסוף מדבר על תקן של מודם, ואז הוא יופיע כ-ttyACM0 או כל מספר אחר.

ייתכן אפילו שהוא חושף מספר פורטים, כלומר, יופיעו כמה התקנים תחת dev.

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

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

אגב, האם יש לך דוגמה איך עובדים עם המכשיר ב-Windows?
שם הוא מופיע בתור COM משהו?
 

hani76

New member
במקרה שלי...

המסוף מופיע לי כ ttyACM0 .
מה המשמעות מבחינתי? האם אני יכולה "לדבר" איתו פשוט ע"י open/read/write?
תודה רבה!
 

BravoMan

Active member
זה אומר, שההתקן מזדהה כמודם

ונתפס ע"י מודול cdc_acm.
&nbsp
רוב הסיכויים שהוא אכן מדבר "סיריאלית".
&nbsp
את יכולה לנסות לדבר איתו דרך open / read / write, אבל כמו שאמרתי לך קודם: יכול להיות שצריך קודם כל לקבוע הגדרות נכונות לתקשורת, אחרת היא לא תגיע כמו שצריך.
&nbsp
את ההגדרות הנכונות יצרן המסוף אמור לספק. (boud rate, parity, stop bits).
&nbsp
הקישור הבא עשוי לספק מידע מעניין, אם כי כמובן הוא לא בהכרח רלוונטי לחומרה הספציפית שלך:
https://www.rfc1149.net/blog/2013/03/05/what-is-the-difference-between-devttyusbx-and-devttyacmx/
 

hani76

New member
המשך...

תודה רבה על התשובה!!!
אם אפשר שאלה קטנה נוספת...
כשאני מנסה לעשות מתוך הקוד open ל dev/ttyACM0/, אני מקבלת 1- כאשר errno=13. י(Permission denied). אני רואה שההרשאות של dev/ttyACM0/ הן:
crw-rw---- i אם כך למה מחזיר לי errno=13?
תודה רבה!
 

BravoMan

Active member
הרשאות הן לא הכל...

לא כתבת למי שייך ההתקן, אבל מן הסתם הוא שייך ל-root.
היישום שלך מן הסתם רץ תחת משתמש ברירת מחדל, שהוא אינו root ולא שייך לקבוצה של root, ועל כן אין לו הרשאות לגעת בהתקן.
&nbsp
זה מצב רגיל למדי ב-Ubuntu וגם בהפצות לינוקס אחרות. מי שרוצה לשחק ישירות עם חומרה, רץ כ-root או משתמש במתווך כלשהו כמו libusb (קצת low level מידי למה שאת עושה לדעתי).
&nbsp
תריצי את היישום שלך דרך sudo, זה יפתור את הבעיה בטווח המידי.
בעניין פתרון לטווח ארוך, זה כבר תלוי במוצר ובדרישות הלקוח.
&nbsp
בד"כ פותרים דברים כאלה בעזרת כלל udev, שמזהה התקן ספציפי ע"י vid ו-pid שלו ומשנה את הרשאות הקובץ הווירטואלי בהתאם.
לחלופין, אם יש בעיה, תמיד אפשר לפרוס את היישום עם setuid כ-root, אבל זה יצור חורי אבטחה.
&nbsp
אפשר גם לכתוב רכיב ביניים שהתקשורת תתבצע דרכו.
 

Expect

New member
עוד דרך

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