שְׁאֵלָה:
בשרת האינטרנט של Arduino Due יש עיכוב של 5 שניות ב- Windows, רק כאשר הוא מחובר דרך יציאה מקורית
Jerry
2015-12-02 03:09:45 UTC
view on stackexchange narkive permalink

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

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

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

ב"הגדרות צריכת החשמל "של Windows הגדרתי את המחשב לעולם לא ילך לישון, וגם בהגדרות המתקדמות" הגדרות מתקדמות "השבתתי את ה- USB" סלקטיבי השעיה ".

האם יש לך רעיונות מדוע יהיה עיכוב מוזר זה רק ב- Windows ורק כאשר הוא מחובר דרך היציאה המקורית?


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

ראשית, קוד הפיתון. שים לב שאם סקריפט הפיתון לא מופעל לעולם, אין עיכובים בשרת Arduino והכל עובד כצפוי.

  ייבא סדרתי, sysSERIALPORT = "COM5" # שנה את זה ליציאה הטורית שלך. ! # הגדר porttry סדרתי: ser = serial.Serial (SERIALPORT, 115200, פסק זמן = 0) למעט serial.SerialException: sys.exit () ser.write ("שלום עולם") הדפס ("שלום עולם") ser.close ()  

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

אם אתה מגיב על כל שורות "SerialUSB.print" שנמצאות בכל מקום בלולאה (במקרה הפשוט הזה, יש רק שורה אחת בכתובת: "SerialUSB.println (data);" בפונקציה processData), דף האינטרנט לעולם לא קופא, גם אם אתה מריץ את קוד הפיתון בתדירות גבוהה.

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

  #include <Ethernet.h>byte mac [] = {0x04, 0xBA, 0xB0, 0xCC, 0xDF, 0x04}; EthernetServer server (80); EthernetClient client; const byte MAX_INPUT = 25; // עבור הגדרת processIncomingBytevoid () {SerialUSB.begin (115200); Ethernet.begin (mac); SerialUSB.print ("השרת נמצא ב"); SerialUSB.println (Ethernet.localIP ());} // סוף תהליך setupboolIncomingByte (const byte inByte) {char char input_line [MAX_INPUT]; סטטי לא חתום int input_pos = 0; switch (inByte) {case '\ n': // סוף טקסט input_line [input_pos] = 0; // סיום בתים null אם (input_pos == 0) להחזיר true; // יש שורה ריקה // הושג המסוף! עיבוד קו קלט כאן ... תהליך דאטה (קלט_קו); // איפוס מאגר לפעם הבאה input_pos = 0; לשבור; מקרה '\ r': // מחק הפסקה חזרה מרכבה; ברירת מחדל: // המשך להוסיף אם לא מלא ... אפשר לסיים בתים null אם (input_pos < (MAX_INPUT - 1)) input_line [input_pos ++] = inByte; לשבור; } // סוף מתג להחזיר שקר; // עדיין אין שורה ריקה} // סוף התהליך IncomingByteWebvoid processData (const char * data) {// הערה: מכיוון שאין דוגמאות GET בדוגמה הפשוטה הזו, הסרתי את החלקים לעיבוד GET.
SerialUSB.println (נתונים); if (strlen (data) < 4) return;} // end of processDataWebvoid loop () {client = server.available (); אם (לקוח) {בוליאני עשה = שקר; while (client.connected () &&! done) {while (client.available () > 0 &&! done) done = processIncomingByte (client.read ()); } // סוף בזמן שהלקוח מחובר לקוח.println ("HTTP / 1.1 200 OK"); client.println ("סוג תוכן: טקסט / HTML"); client.println (); client.print ("<html><body>"); client.print ("<a href = \" / \ ">Reload< / a>< / body>< / html>"); עיכוב (10); client.stop (); }} // סוף לולאה  

זו כבר לא טכנית בעיה עבורי, למעט שהייתי צריך להגיב על כל הצהרות "SerialUSB.print" שלי. אבל אני מעוניין ללמוד מה גורם להתנהגות מוזרה זו.

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

איך יציאת ה- USB קשורה ל- Due הפועל כשרת אינטרנט ?!
נקודה טובה! אני מניח שזה מוסיף לתעלומה! אני לא מצליח להבין מדוע יהיה עיכוב (רק לאחר שהייתי סרק) ביציאה המקורית, אך אין עיכוב ביציאת התכנות ... ורק ב- Windows.
אך עדיין לא הזכרת * כיצד * אתה הופך את ה- Due לשרת אינטרנט. זה רמז עדין לומר "** עלינו לראות ולהבין את ההתקנה שלך ואת הקוד שלך **" לפני שנוכל לעזור לך.
אני מצטער. אני משתמש במגן אתרנט. התקנה זו עבדה ללא רבב במשך חודשים על לינוקס, ועובדת בסדר ב- Windows רק כאשר ה- Due מחובר דרך יציאת התכנות. הקוד שלי ארוך מכדי לפרסם או לפשט אותו לפורום, אך בעצם זה שום דבר ייחודי, והוא בעיקר רק משתמש בקוד מהמדריכים של ניק גמון. אני מעדיף לחבר אותו דרך היציאה המקורית מכיוון שחלק מלחצני הכפתור שלי שולחים הקשות על המחשב. לעתים נדירות אני לוחץ על הכפתורים האלה (רק פעם או פעמיים ביום), ולכן ספק ששליחת הקשות קשורה לעיכוב.
מחדש "הקוד שלי ארוך מכדי לפרסם" - דפי arduino.stackexchange משתמשים בחלונות גלילה כדי להציג קוד. אם הבעיה היא בעיית קוד, הראה את הקוד. אנשים העונים על שאלות יעילות לעיתים קרובות אוהבים לקבוע בעצמם מה ניתן לשלול - בדרך כלל הם ראו מאות מקרים שבהם מישהו אומר "זה לא יכול להיות" אבל זה
אוקיי, תודה על העצה. אנסה לעצב את הקוד לפרסום כאן בהמשך. זה ייקח לי זמן מה, אז אני לא מתאר לעצמי שאשלים את זה עד מחר.
גיליתי מידע חשוב חדש: יש סקריפט פיתון ששולח נתונים לדואר דרך היציאה הטורית בכל דקה. כשאני עוצר את המשימה המתוזמנת מלהפעיל את סקריפט הפיתון, אין עיכובים נוספים עבור שרת האינטרנט. בכל פעם שצירפתי את ה- Due דרך יציאת התכנות, לא היה לי סקריפט הפיתון לשלוח את הנתונים ליציאה ההיא, ואני די בטוח שבגלל זה מעולם לא היה עיכוב ביציאת התכנות. כשערכתי את סקריפט הפיתון כדי לשלוח נתונים למספר יציאת התכנות של ה- Due, הייתה לכך השפעה של איפוס ה- Due בכל דקה. (המשך ...)
לכן כאשר ה- Due מחובר דרך היציאה המקומית, סקריפט הפיתון בסופו של דבר גורם לעיכובים ארוכים. כאשר הוא מחובר דרך יציאת התכנות, סקריפט הפיתון גורם לכך שה- Due יתאפס אחת לדקה. כאשר סקריפט הפיתון מושבת אז אין בעיות. אני די בטוח שזו בעיה בקוד הפיתון שלי, ולכן אני לא בטוח אם הוא שייך לכאן. נתקלתי בבעיות אחרות בהעברת קוד הפיתון שלי ל- Windows, ולמדתי כי סקריפטים של פיתון זקוקים לשינויים מסוימים במעבר מלינוקס ל- Windows. BTW התסריט בעצם שולח נתוני מזג אוויר ודואר אלקטרוני אל ה- Due.
אם תוכנית ה- Due שלך ​​כתובה כראוי, היא לא אמורה לגרום לעיכובים. אם הוא לא כתוב כמו שצריך (והקוד הסידורי לעתים קרובות כל כך * לא * כתוב כהלכה), אפשר לראות עיכובים. פרסם את קוד ה- Due שלך ​​- לפחות החלק ממנו שעוסק בסידורי.
תודה @Majenko. אני חושב שצמצמתי אותו, ובקרוב אוכל לשתף איזה קוד שמשכפל את הבעיה המדויקת. בעיקרון הרישום קופא רק על 'SerialUSB.print ("מה שלא יהיה"); `. כשאני מגיב על כל אלה מחוץ לקוד שלי, אז הכל עובד בצורה מושלמת. נראה שאין בעיה עם 'Serial.print' או 'Serial2.print'.
הכנתי גרסה פשוטה המשחזרת את הבעיה, והוספתי את הקוד לפוסט שלמעלה. תודה לכולם שקראו!
שקול גישה חלופית לבעיה. הפסדתי עבודה של כשבועיים בהנחה שהרשת של Windows 7 עובדת. כאשר השתמשתי ב- wireshark (במחשב Windows ובמחשב לינוקס עצמאי המחובר באמצעות רכזת Ethernet), גיליתי ש- Windows יכול להיכשל ברשת ולא ממש לספר לך על כך. הצלחתי להריץ פינג מ- Windows. נראה שהוא עושה כמה ניסיונות. עם זאת, wireshark לא ראה שום ניסיון מצד Windows להכניס דבר לרשת. אז פנינו ללינוקס כדי לסיים את עבודות הפיתוח. הימור שלי, Windows נכשלה לרגע ברשת שלך.
@Jerry - האם אתה מתחבר באמצעות כתובות IP או שמות? גם IPv4 או IPv6?
@Matt - כתובות IP בלבד ו- IPv4.
@Jerry - לעזאזל, חשבתי שזה יכול להיות בעיה של WINS והוספת המארח שלך ל- / etc / hosts אולי תיקנה את זה.
@Matt - תודה ששיתפת את הרעיונות שלך. אשמח בסופו של דבר להבין זאת יום אחד. גיליתי מניסיונות של אנשים אחרים שיש כמה מוזרויות מוזרות עם ה- Arduino Due, וכעת כשהלוח הופסק באופן רשמי מקו המוצרים של Arduino, אני לא מצפה שהבאגים הזרים יתגברו. אני עדיין פתוח לרעיון שייתכן שזו בעיית רשת של חלונות, וכל פעם אני עושה ניסויים עם זה (כולל אלה שהוצעו כאן), אך עד כה לא מצאתי דבר.
אחד תשובה:
st2000
2016-06-28 06:14:48 UTC
view on stackexchange narkive permalink

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

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

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

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

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



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