שליחת נתונים בין תוכנות - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


HaEsrimVeArba

Recommended Posts

יש לי 2 תוכנות

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

אתה צריך להוסיף את 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, ב זה מאוד פשוט.

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

קישור לתוכן
שתף באתרים אחרים

ארכיון

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

×
  • צור חדש...