עבור לתוכן

איפה נמצא ה-Source של Class Serial?

Featured Replies

פורסם

שלום

איפה נמצא ה-Source של Class Serial?

הקלאס שאנחנו משתמשים בו כדי לעשות למשל

 
Serial.println("hi");

תודה

card

פורסם
  • מחבר

תודה mike

שאלתי לגבי הקלאס, בגלל שיש איתו תופעה מעניינת.

לקלאס Serial, יש event שנקרא serialEvent,

וכדי להשתמש באיבנט הזה, כל מה שצריך הוא לכתוב פונקציה בתוכנית שלך, שנקראת ()serialEvent.

מה שמוזר פה, זה שלא צריך "לרשום" את הפונקציה הזו כמאזינה של האיבנט,

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

לכן זה מוזר לי.

איך שזה לא עובד, זה מאד שימושי,

כי אז אפשר כך לבנות קלאסים לרכיבים/מודולים,

ולאפשר לקלאס שבנינו להקפיץ איבנט,

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

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

פורסם

אולי בסגנון של ה-Virtual function של C++?

אתה לא צריך להרשם, אתה פשוט דורס את המימוש הריק.

אבל אני מסכים שרישום נשמע יותר הגיוני למקרה הזה.

פורסם
  • מחבר

אולי בסגנון של ה-Virtual function של C++?

אבל פונקציה וירטואלית זה בתוך קלאס.

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

ממעבר על הקוד השתמשו שם במשהו שנקרא attribute(weak).

זה כנראה זה..

פורסם

אני לא ממש יודע, אבל מי אמר שהחלק הראשי הוא לא קלאס?

אין לך גישה ל-main, אתה מממש רק שתי פונקציות: setup ו-loop, שגם הן יכולות להיות סוג של פונקציות וירטואליות של הקלאס הראשי.

פורסם

אין "קלאס ראשי".

תעיין בקוד שנמצא פה: https://github.com/arduino/Arduino/blob/master/hardware/arduino/cores/arduino/HardwareSerial.cpp

שים לב ש Serial הוא מחלקה דינמית. באותו הקובץ יש מימוש ריק של serial event שאתה בעצם דורס בקוד שלך. שים לב גם ל define שמגדיר שהפונקציה קיימת. לאחר מכן המחלקה הסטטית HardwareSerial קוראת ל serialEvent (אם ה define קיים, ובדרך כלל הוא כן, רק במקרים קיצוניים הם לא מממשים אותו בעצמם).

Sent from my Nexus 7 using Tapatalk2

פורסם
  • מחבר

באותו הקובץ יש מימוש ריק של serial event שאתה בעצם דורס בקוד שלך.

אבל איך אני דורס אם לא כתבתי "override" כשאני מממש את הפונקציה?

הרי ב-++C, כשאתה דורס פונקציה, אתה צריך לכתוב "override"..

האם יכול להיות שזה קשור לכך שהפונקציה serialEvent() מוגדרת שם עם אטריביוט כזה?:

 
void serialEvent() __attribute__((weak));

שים לב ש Serial הוא מחלקה דינמית.

אתה יכול להזכיר מה זה class דינמי?

פורסם

מדובר בסמל של הקומפיילר (Weak) - זה אומר שאם המתודה לא קיימת, הערך יהיה NULL.

http://en.m.wikipedia.org/wiki/Weak_symbol#section_1

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

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים