עבור לתוכן

שליחת נתונים בין תוכנות

Featured Replies

פורסם

יש לי 2 תוכנות

כאשר אחת אמורה ליצר מידע וכתובה ב C#,

השניה אמורה לקלוט את המידע לעבד אותו ולהחזיר לתכנה הראשונה תשובה וכתובה ב C++.

איך אני יכול לשלוח את המידע בין 2 התוכנות?

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

פורסם

הדרך הפשוטה ביותר לדעתי היא לייצג את המידע בקובץ XML והמידע המועבד יחזור גם ב XML.

אתה גם יכל ליצור תקשורת בין שתי התוכנות (בעזרת Sockets) אבל זה כבר יותר מסורבל.

פורסם
  • מחבר

אז מה בעצם לחפש?

כלומר איך נקרא הנושא?

איזו פקודה או ספריה ב C\C++\ DOTNET אחראית על יצירת ואחזור מידע ל XML?

והאם אני צריך לדעת איך XML עובד בשביל זה?

פורסם

אתה צריך להוסיף את System.Xml לפרוייקט שלך.

אם לא עבדת מעולם עם XML ואתה לא יודע מה זה אתה יכל להכנס לפה כדי לקבל בסיס לנושא.

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

דוגמא מגוגל ל C#:

http://www.csharphelp.com/archives/archive199.html

פורסם
  • מחבר

כן, קלטתי. תודה רבה לך.... אם רק המזגן במחלקה היה עובד כראוי..

פורסם

אם המידע שלך די פשוט (נניח אם זה סתם רשימה של מחרוזות או מספרים) אז לא כדאי XML, פשוט כי הטיפול בו מורכב מדי.

XML ב-C# זה דווקא די פשוט, אבל ב-C++ זה זוועה (לא נראה לי שיש שם חבילה סטנדרטית ל-XML בכלל).

XML מומלץ אם המידע שאתה רוצה להעביר הוא יחסית מורכב, או שאתה מתכנן להרחיב אותו בעתיד.

השאלה היא איך נראית תכנית העיבוד שלך (זו שכתובה ב-C++).

אם היא תכנית שכל פעם עולה, מבצעת את העיבוד, ואז נסגרת, אז הכי פשוט להעביר לה את המידע באמצעות קובץ (פשוט לדאוג שהתכנית תקבל כפרמטרים קובץ לקרוא ממנו וקובץ לכתוב אליו). התכנית שב-C# יכולה לקרוא לתכנית הזו באמצעות Process.Start.

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

במקרה ששתי התוכניות רצות על מחשבים שונים, הפתרון הראשון לא ממש יעבוד היטב, אלא אם אתה מתכנן להריץ את תכנית העיבוד דרך remote connection כלשהו. אם אתה לא יכול, אז אתה חייב להשתמש בפתרון השני. דרך לעקוף את זה (ולהימנע משימוש ב-socketים ב-C) היא באמצעות תוכנית נוספת ב-C#, שתשב על אותו המחשב כמו תכנית העיבוד ותוכל להעביר אליה קבצים, ומצד שני תדבר עם התכנית הראשונה באמצעות socketים.

פורסם

זה נשמע לי כמו תוכנת client - server סטנדרטית... לדעתי הפתרון הכי טוב זה פשוט לפתוח stream socket (כלומר TCP ). אני לא יודע בדיוק מה וכמה אתה רוצה להעביר, אבל לדעתי אם אתה מחפש ביצועים מומלץ שתבנה מיני פרוטוקול שיעבוד מעל TCP כי XML זה פורמט יחסית שמן במיוחד כשאין הרבה מידע.

פורסם
  • מחבר

העברת הנתונים תתבצע דרך פרוטוקול MIL-STD1553

אבל כרגע אני רוצה למטרות DEBUG

להעביר מהתוכנה בC# רשומה אחת פשוטה בקצב של 60HZ. לכיוון אחד.

ולהחזיר מהתכנה ב C++ ערך TRUE אם התוכנה מתבצעת בהצלחה.

שני התוכנות פועלות תמיד.

פורסם

העברת הנתונים תתבצע דרך פרוטוקול MIL-STD1553

אבל כרגע אני רוצה למטרות DEBUG

להעביר מהתוכנה בC# רשומה אחת פשוטה בקצב של 60HZ. לכיוון אחד.

ולהחזיר מהתכנה ב C++ ערך TRUE אם התוכנה מתבצעת בהצלחה.

שני התוכנות פועלות תמיד.

חשבתי שזאת רשת שמשתמשת ב TCP/IP... אין לי מושג מה זהMIL-STD1553 ואיך העסק הזה עובד.

אבל אם זאת רק רשומה פשוטה (וקטנה) אחת כל פעם אני לא רואה ממש סיבה לפתוח steam . אם היית ברשת TCP/IP הייתי ממליץ לך להשתמש ב UDP .אחרי ה header לשים ID של 32 ביט שיזהה שזה מידע שבא מהתוכנה שלך. כמה ביטים שיסמנו את סוג הבקשה (במקרה שלך זה שאלה/תשובה ועוד כמה לעתיד). ואז כמה אפסים (אם תרצה בעתיד תוכל להשתמש בהם כ flages נוספים) ואז המחרוזת שלך.

למטרת DEBUG כש 2 התוכנות רצות על אותה מכונה אתה יכול להשתמש ב named pipe, ב linux זה מאוד פשוט.

לגבי ווינדוס לא יודע, אבל אתה יכול גם להשתמש בסתם קובץ, למרות שזה מכוער. אתה גם יכול לבנות שרת UDP (מקומי) שזה מאוד פשוט...

פורסם

אתה בטח עובד על מבדקים

פורסם

אז אתה אומר ליצור קובץ ולקרוא ממנו את המידע?

כן, בערך. PIPE זה סוג של קובץ (לפחות במערכות NIX* לא יודע לגבי ווינדוס). הרעיון הוא שזה יעבוד כ FIFO (ראשון נכנס ראשון יוצא, כמו צינור...) ו 2 התוכנות יוכלו להשתמש בו. זה בדיוק מה ש named pipes עושים.

אתה גם יכול להשתמש בקובץ רגיל אבל זה מכוער יותר ויוצר לך קצת יותר עבודה. עדיף כבר לבנות שרת UDP מקומי, זה ממש קל הנה לדוגמה שרת UDP פשוט עם winsock :

http://www.codeproject.com/internet/udptime.asp

אבל שוב לדעתי הכי פשוט ויעיל זה named pipe

פורסם

אתה לא רוצה XML על mil-std 1553.

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

mil-std-1553 מאוד מוגבל מבחינת קצב התעבורה עליו וה-timeout-ים, ואל תשכח שמדובר ב-BUS שחולקים אותו מספר התקנים. אתה לא רוצה לסתום את כל המערכת.

כמו כן מהיכרות עם mil-std-1553 ועם סוג המערכות שעובדות איתו אז זמן העיבוד והזכרון הדרושים ל-XML הוא פשוט לא סבירים למטרה זו.

לבסוף, גם אם אתה בונה מערכת פרטית מבודדת משלך על הBUS הזה (לא סביר אלא אם זה איזה תרגיל), עדיף שתתרגל לעבוד עם מידע בינארי כמו שעובדים איתו בכל שאר המקומות.

תגדיר מבנים בינאריים וסדר של בתים (בגדול 1553 הוא big endian). בקוד C++ זה לא קשה לקרוא אותם. בקוד C# אתה יכול להשתמש ב-binaryreader.

בינתיים תשלח אותם מעל socket-ים. אח"כ תוכל לשלוח אותם מעל 1553.

ארכיון

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

דיונים חדשים