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