איך אתה משדר וקורא uint16_t מעל I2C?
אני מנסה לקרוא שני ערכי uint16_t ממכשיר עבדים ואני רואה קריאות שטויות.
זה הקוד על העבד שלי Arduino Uno:
#include <Wire.h>void send_wire_int (uint16_t num) {// שלח בתים נמוכים Wire.write ((uint8_t) num); // שלח בתים גבוהים מספר >> = 8; Wire.write ((uint8_t) num);} // זה נקרא ממארח I2C. הימנע I2C_Send () {// send_wire_int (acount_abs); // שלח מקודד ספירה. // send_wire_int (bcount_abs); // שלח ספירת מקודד B. send_wire_int (0); send_wire_int (0);} הגדרת חלל () {Wire.begin (30); // אתחל את ספריית I²C והגדר את כתובת העבדים Wire.onRequest (I2C_Send); // להגדיר עבד I²C להעביר ISR Wire.flush (); Wire.setTimeout (1000L);} loop loop () {// stuff}
כל מה שהוא עושה זה לחכות שהמאסטר יבקש נתונים. במקור, היא שלחה את הערכים של שני רושמים בחזרה, אך גם ערכים אלה היו מבולבלים או שאינם משתנים, לכן שיניתי אותה רק כדי להחזיר 0s בחזרה, אך עדיין אני מקבל את הערכים המשובשים הזהים.
זהו הקוד ב- Arduino Uno המאסטר שלי:
#include <Wire.h>uint16_t receive_wire_int () {while (Wire.available () < 1) {} // קרא בתים נמוכים לתוך rxnum uint16_t rxnum = Wire .לקרוא(); while (Wire.available () < 1) {} // קרא בתים גבוהים לתוך rxnum rxnum + = Wire.read () << 8; החזר rxnum;} הגדרת חלל () {Wire.begin (); // הצטרף לאוטובוס i2c (כתובת אופציונלית עבור מאסטר) Wire.setTimeout (1000L); Serial.begin (9600); // התחל סדרתי עבור פלט} loop void () {Serial.println ("בקשת נתונים ..."); Serial.flush (); Wire.requestFrom (30, 4); uint16_t acount = receive_wire_int (); uint16_t bcount = receive_wire_int ();
Serial.println (String ("acount:") + String (acount) + String ("bcount:") + String (bcount)); עיכוב (500);}
כפי שאתה יכול לראות, הוא פשוט מבקש את שני ערכי uint16_t בארבעה בתים, ולאחר מכן מדפיס אותם לסדרה (מסוף המחשב הנייד שלי).
הפלט שאני רואה הוא:
acount: 65280 bcount: 65535
מתי הייתי מצפה:
acount: 0 bcount: 0
מה אני עושה לא בסדר?