שְׁאֵלָה:
האם זה בסדר ל- Serial.print (הודעה), כאשר כבל ה- USB אינו מחובר למחשב מארח?
David Cary
2016-02-21 02:09:09 UTC
view on stackexchange narkive permalink

לעיתים קרובות שמתי חבורה של Serial.print (F ("הודעות ניפוי באגים")) ברישום הארדואינו שלי.

בדרך כלל ההודעות האלה עולות בכבל USB מחשב מארח כך שניתן יהיה לראות את ההודעות האלה על הצג הסדרתי.

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

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

האם זה משנה אם אני משתמש בתואם (1) "שבב בודד" ל- Arduino, כאשר המעבד כולל USB שבב, לעומת (2) Arduino -תואם עם "שבב ממשק USB USB" ו"שבב מעבד "נפרדים? (על ידי" תואם שבב יחיד לארדואינו ", אני מתכוון לדברים כמו Arduino Leonardo, Arduino Yún, LilyPad Arduino USB, Arduino Micro, Teensy-LC וכו '. .)

אחד תשובה:
BrettAM
2016-02-21 02:41:43 UTC
view on stackexchange narkive permalink

זה בסדר לכתוב נתונים סדרתיים ללא שום דבר מחובר.

במקרה (2) "Arduino + USB interface interface", ל- arduino אין מושג אם משהו מחובר או מקשיב ליציאה הטורית. . הקוד ישדר את הבתים ויפעל בדיוק זהה בין אם מחובר לכל דבר ובין אם לאו.

במקרה (1) "ארדואינו עם USB מובנה" יש לו מושג כלשהו, ​​אבל פשוט מפיל בתים שהולכים שישודר כאשר יציאת ה- USB אינה מחוברת.

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

ככל שיכולתי לדעת USB-Serial (מקרה 1) מאגרים רק נתונים נכנסים. מכיוון שהשיחות ל סדרתי. {הדפס, כתוב} קוד> לא עושות דבר כשאינן מחוברות, הן עשויות לקחת פחות זמן ממה שהן היו עושות אחרת. אם הקוד שלך באמת לא בטוח לגבי התזמון, זה עלול לגרום לבעיה, אבל אני בספק אם זה יקרה.

דוגמאות רבות שמגיעות עם ה- Arduino IDE כוללות את קוד הקוד הבא שמשהה תואם USB מקורי ל- Arduino עד חיבור ה- USB מאותחל:

  תוך כדי (! Serial) {; // המתן להתחברות היציאה הטורית. דרוש ליציאת USB מקומית בלבד}  

קוד זה מונע מהארדואינו לעשות דבר עד לכבל ה- USB מחובר. השאיר או מחק את 3 השורות האלה אם ברצונך שהארדואינו יפעל "stand- לבד "ללא חיבור כבל USB ( ספר בישול של Arduino עמ '117) - לאחר שתמחק שורות אלה, אם תחבר מאוחר יותר כבל USB, ה- USB יאותחל כהלכה, ו אז תראה בצג הסידורי שלך את כל מה שנדפס על ידי מאוחר יותר סדרתי פקודות .print () הפועלות. (נבדק על LC Teensy).

"כשהוא מלא, סידורי. {הדפס, כתוב} ימתין" - כדי להבהיר, הוא מתמלא בגלל המהירות (כלומר אתה מדפיס מהר מדי) לא בגלל שאין שום דבר מחובר.
במקרה (1), כאשר אתה אומר "טיפות בתים שעומדות להיות משודרות כאשר יציאת ה- USB אינה מחוברת" אתה מתכוון שהוא משדר אותם (אולי לכלום) באמצעות TX חומרה?
מצטער, @NickGammon, אבל נראה לי שלפחות על לוח מבוסס ליאונרדו (עם תמיכה ב- USB ב- CPU), אם אני מעלה סקיצה מורכבת למדי עם שפע של Serial.print (נבדק גם ב- 9600 וגם ב- 115200), אני ראה כי: 1) אם אני מפעיל את הלוח, עם USB חיצוני מחובר למחשב; הכל עובד בצורה מושלמת. ועדיין לעבוד אם אני "מנתק" את הכבל; 2) אם אני מפעיל את הלוח _ללא כבל כלשהו שמחובר, הלוח לעולם לא ייכנס אפילו לולאה הראשית ()! - נראה לי שכאשר חיץ "מתמלא" הכל תלוי. האם זו התנהגות צפויה (... שעלי לעקוף ברמת האפליקציה)?
לשרטוטים עם שבבים בסגנון לאונרדו עם USB מובנה יש לעיתים קרובות לולאה בהתקנה: "while (! Serial.available ()) {}" אשר נועל לולאה ללא הגבלת זמן עד שהחיבור הטורי נוצר באמצעות ה- USB. הלולאה הזו היא שגורמת להופעתה לתליה. בשאר הלוחות המתקשרים חוזרים מיד וכל הנתונים שנשלחים פשוט נעלמים "מקצה החוט" אם שום דבר אינו מחובר לחשמל. תמיד תוכל לבצע את היציאה מהלולאה לאחר (נגיד) 10,000 חזרות, או לאחר שחלפו כמה שניות. .


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