שְׁאֵלָה:
כיצד שורת קוד זו מגלה אם מחובר ממשק סדרתי?
Cybergibbons
2014-02-26 04:48:32 UTC
view on stackexchange narkive permalink

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

הקוד נמצא ב- Github כאן. קו 111 הוא קו העניין:

  if (Serial) debug = 1; אחר ניפוי באגים = 0; // אם UART סדרתי ל- USB מחובר, הצג ניפוי O / P.  

אז, שאלה פשוטה: ברמת חומרה ותוכנה, איך זה עובד? אני לא יכול לראות שום דבר ב- HardwareSerial או בזרם שיחזיר נכון / שקר אם משהו היה מחובר או לא.

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

  debug boolean; const int toggle = 6; setup void () {if ( סדרתי) ניפוי באגים = 1; אחר ניפוי באגים = 0; pinMode (החלף, OUTPUT); digitalWrite (החלף, LOW); אם (ניפוי באגים) {Serial.begin (9600); Serial.println ("התקנה"); digitalWrite (לעבור, HIGH); עיכוב (1000); digitalWrite (החלף, LOW); }} loop loop () {if (debug) {Serial.println ("Loop"); digitalWrite (לעבור, HIGH); עיכוב (1000); digitalWrite (החלף, LOW); עיכוב (1000); }}  
Sidenote: עבור RS232 המסורתית, הדרך היחידה לקבוע באמת אם משהו מחובר היא לשלוח נתונים ולראות אם אתה מקבל תגובה. אין מנגנון זיהוי חיבורים אוניברסלי אחר. זו הסיבה שמכשירים טוריים בחלונות עדיין מתגלים כעכבר. מערכת ההפעלה מניחה קבוצה מסוימת של תווים משמעה שיש עכבר, מכיוון שאין לה דרך אחרת לאשש הנחה זו, היא פשוט פועלת איתה.
שתיים תשובות:
#1
+12
Peter Bloomfield
2014-02-26 07:19:05 UTC
view on stackexchange narkive permalink

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

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

#2
+4
asheeshr
2014-02-26 21:08:50 UTC
view on stackexchange narkive permalink

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

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

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

הנה סקיצה לדוגמא המציגה את אותו הדבר:

  int debug = 0; setup void () {pinMode (13, OUTPUT); Serial.begin (9600); // המתן ארבע שניות או עד שהנתונים יהיו זמינים בסידורי, // המוקדם מבין השניים. בעוד (Serial.available () == 0 && millis () <4000); // על פסק זמן או זמינות נתונים, אנחנו מגיעים לכאן. אם (Serial.available () >0) {// אם נתונים זמינים, אנו נכנסים לכאן. מבחן int = Serial.read (); // לאחר מכן ניקוי מאגר הקלט Serial.println ("DEBUG"); // תן משוב המציין ניפוי מצב = 1; // אפשר איתור באגים}} לולאה בטלה () {if (debug == 1) Serial.println ("ON"); digitalWrite (13, HIGH); עיכוב (1000); אם (debug == 0) Serial.println ("OFF"); // כבה אם הסידורי אינו זמין digitalWrite (13, LOW); עיכוב (1000); }  
זו פחות או יותר הטכניקה בה אני משתמש בקוד שלי.
אימה, אתה יכול גם להפעיל פלט סדרתי ברגע שהוא מקבל דמות. או השתמש במצבי בנייה שונים (ב- IDE מתקדם), או שאולי אפילו לבדוק אם מתח הכניסה מגיע מה- USB.


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...