Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Com port listening

Îåêßíçóå áðü ôï ìÝëïò DaltonGR. Τελευταία δημοσίευση από το μέλος Παναγιώτης Καναβός στις 10-09-2010, 20:18. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-09-2010, 12:37 59903

    Com port listening

    Καλημέρα,
    Θέλω να φτιάξω μια εφαρμογή που όταν ανοίγει(form load)  να ακούει σε συγκεκριμένη COM Port, και οτιδήποτε ενέργεια και να κάνω απο την εφαρμογή να ακούει και να στέλνει μηνύματα απο αυτή την πόρτα. Να μπορούν όμως και απο άλλες φόρμες της εφαρμογής να στέλνουν μηνύματα απο αυτή την πόρτα. Πώς μπορώ να υλοποιήσω κάτι τέτοιο.

    Ευχαριστώ εκ των προτέρων.
  •  10-09-2010, 08:38 59931 σε απάντηση της 59903

    Απ: Com port listening

    DaltonGR:
    Καλημέρα,
    Θέλω να φτιάξω μια εφαρμογή που όταν ανοίγει(form load)  να ακούει σε συγκεκριμένη COM Port, και οτιδήποτε ενέργεια και να κάνω απο την εφαρμογή να ακούει και να στέλνει μηνύματα απο αυτή την πόρτα. Να μπορούν όμως και απο άλλες φόρμες της εφαρμογής να στέλνουν μηνύματα απο αυτή την πόρτα. Πώς μπορώ να υλοποιήσω κάτι τέτοιο.

    Ευχαριστώ εκ των προτέρων.

    Δημιουργησα μια κλάση myPort,
    Public Class myPort
        Public comPort As Integer = 0
        Public baudrate As Integer = 0
        Public timeout As Integer = 0
        Public comm As GsmCommMain

        Public Sub New()

        End Sub
    End Class

    στην mainForm μου το αρχικοποιώ,
    Private porta As New myPort()
    την οποία και ανοίγω στο load event της φόρμας.

    Η ερώτηση μου είναι πώς μπορεί μια child form που ανοίγει να την χρησιμοποιήσει. Δέν μπορεί να την ανοίξει μιας και είναι ήδη ανοικτή απο την main form. Οπότε πώς μπορώ να το κάνω αυτό.

    Ευχαριστώ και πάλι.
  •  10-09-2010, 09:15 59932 σε απάντηση της 59931

    Απ: Com port listening

    Καλημέρα,

    Θα ήθελα να ξεκινήσω λέγοντας ότι η σειριακή επικοινωνία είναι αρκετά πιο "ιδιότροπη" σε σχέση με την δικτυακή. Αυτό οφείλεται στο γεγονός ότι μία σειριακή θύρα μπορεί να χρησιμοποιηθεί (κάποιος μπορεί να συνδεθεί επάνω της) μόνο μία φορά.

    Άρα, το πρόβλημα είναι πως θα μπορέσεις να το ξεπεράσεις αυτό το περιορισμό:

    • Θα πρέπει να φτιάξεις κάποιο proxy object - κάποιο object που να υλοποιεί το singleton pattern - και θα έχει πρόσβαση στην σειριακή σου, και μέσω αυτού θα πρέπει να κάνεις εσύ όλες τις διαδικασίες που χρειάζεσαι. Έτσι θα μπορέσεις να χρησιμοποιείς τα events του για να έχεις πρόσβαση στην σειριακή σου.

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  10-09-2010, 09:48 59933 σε απάντηση της 59932

    Απ: Com port listening

    αυτό που βασικά έχω είναι μια κεντρική φόρμα που με την βοήθεια ενός timer ακούει την σειριακή για μηνύματα. Η θύρα είναι πάντα ανοικτή. Υπάρχει η δυνατότητα αποστολής μηνυμάτων απο νέα φορμα. Όταν ανοίγω την φόρμα την νέα λογικό δεν μπορώ να στείλω μήνυμα εφόσον είναι ήδη ανοικτή η θύρα. βρήκα ένα παράδειγμα σε C# το οποίο το υλοποιεί αυτό αλλά δεν δουλεύει σε vb.net.
    public class CommSetting
    {
    public static int Comm_Port=0;
    public static Int64 Comm_BaudRate=0;
    public static Int64 Comm_TimeOut=0;
    public static GsmCommMain comm;

    public CommSetting()
    {
    //

    // TODO: Add constructor logic here

    //

    }
    }
    μόνο με την υλοποίηση singleton κλάσης γίνεται αυτό; Μήπως έχεις κάποια link να διαβάσω γιατί εκεί δεν ξέρω απολύτως τίποτα..

    Ευχαριστώ και πάλι.
  •  10-09-2010, 10:47 59935 σε απάντηση της 59933

    Απ: Com port listening

    Καταρχήν, δεν υπάρχει κανένας λόγος να φτιάξεις δική σου κλάση αφού υπάρχει ήδη η System.IO.Ports.SerialPort . Επιπλέον, δεν υπάρχει λόγος να προσπαθείς να ανοίξεις και να χρησιμοποιήσεις την πόρτα από πολλές πόρτες ταυτόχρονα. Μάλιστα πρόκειται για πολύ κακή λύση. Αυτό που πρέπει να κάνεις είναι να φτιάξεις και να χρησιμοποιείς την πόρτα από ένα και μοναδικό σημείο, π.χ. σε μία singleton κλάση, ή στην parent φόρμα (μπρρρ). Μετά, όποιος θέλει να κάνει κάτι με την πόρτα στέλνει ένα μήνυμα (καλεί μία μέθοδο) στην κλάση και αυτή μόνο θα στείλει ή θα λάβει μέσω της πόρτας. 

    Τέλος, όπως έχουμε πει και πάρα πολλές φορές σε αντίστοιχες ερωτήσεις, είναι λάθος να προσπαθείς από μία φόρμα να πειράξεις ή να διαβάσεις απευθείας πεδία και properties μίας άλλης φόρμας. Κανονικά μία φόρμα ΔΕΝ πρέπει να έχει πεδία ή λογική παρά μόνο όσα χρειάζεται για να δείξει ό,τι θέλει να δείξει. Αν θέλεις να περάσεις δεδομένα σε μία φόρμα, η parent φόρμα θα πρέπει να τις τα περάσει π.χ. μέσω εντός αντικειμένου ή properties. 

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-09-2010, 11:11 59936 σε απάντηση της 59935

    Απ: Com port listening

    Ευχαριστώ για την απάντηση, συμφωνό απόλυτα με αυτό που λές, πρέπει να φτιάξω μια singleton κλάση η οποία θα ανοίγει την port με το άνοιγμα της εφαρμογής και θα την διατηρεί έτσι καθόλι την διάρκειά της. Θα κλείενι κατά το κλείσιμο της εφαρμογής. Μέχρι εδώ καλά, θα φτιάξω και μεθόδους για να κάνουν ότι χρειάζομαι, έτσι;; Το πρόβλημα είναι δεν ξέρω καθόλου απο singleton class. Εχετε κάποιο Link για να δώ μερικά παραδείγματα και αν γίνεται για την χρησιμότητα τους σε serial ports.

    Ευχαριστώ και πάλι για την βοήθεια σας.
  •  10-09-2010, 13:33 59941 σε απάντηση της 59936

    Απ: Com port listening

    Ένα παράδειγμα υλοποίησης singleton pattern σε VB.NET μπορείς να δεις σε αυτή την δημοσίευση.

    Για να μπορέσεις να δουλέψεις με την σειριακή θα πρέπει να κάνεις expose τους event handlers της κλάσης της σειριακής θύρας από την singleton κλάση.

    Δεν ξέρω αν μπορείς να τα καταφέρεις από μόνος σου, αλλά για βοήθεια εδώ είμαστε...

     

    George J.


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  10-09-2010, 14:03 59942 σε απάντηση της 59903

    Απ: Com port listening

    Αν σου φαίνεται δύσκολο το Singleton μπορείς απλά να δηλώσεις τη serialPort static.
    Πρόσθεσε μια public συνάρτηση (static) στη κύρια φόρμα.
    Μπορείς να την καλείς από παντού :  π.χ.  Form1.SendMyMessage(string s);
  •  10-09-2010, 14:52 59943 σε απάντηση της 59942

    Απ: Com port listening

    Καλά, εδώ δεν λέμε ότι είναι κακή ιδέα να "δένεις" τη μία φόρμα με την άλλη? Άσε που αν την πόρτα τη χειρίζεται η parent κλάση δεν υπάρχει κανένας απολύτως λόγος να κάνεις κάτι expose ως static. Απλά, όταν δημιουργείς την child φόρμα της περνάς ως παράμετρο π.χ. στον constructor ή σε κάποιο property, την SerialPort
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  10-09-2010, 15:19 59944 σε απάντηση της 59943

    Απ: Com port listening

    Εννοούσα static για να μην χρειάζεται η κάθε φόρμα (θα είναι πολλές απ' ότι κατάλαβα) να έχει reference το instance της κύριας (μπορεί να μην είναι parent για όλες).

    Κατά τ άλλα δε χρειάζεται να την χειρίζεται η parent και σίγουρα η λύση με singleton είναι πιο σωστή. 

  •  10-09-2010, 20:18 59948 σε απάντηση της 59944

    Απ: Com port listening

    Το μεγάλο πρόβλημα με αυτό που προτείνεις είναι ότι η child φόρμα θα πρέπει να είναι δεμένη χειροπόδαρα με την parent. Μία αλλαγή στην parent θα μπορεί άνετα να προκαλέσει compile error στην child. Δεν είπε κανεις να περάσει reference της parent στην child, αλλά να περάσει την SerialPort, ή ακόμα καλύτερα ένα αντικείμενο, π.χ. Messenger το οποίο κρύβει την πόρτα και αναλαμβάνει αυτό να πάρει και να στείλει τα μηνύματα. Αυτό μπορεί άνετα να το δημιουργήσει η κύρια φόρμα και να το δώσει σε όποια άλλη φόρμα το χρειάζεται. Έτσι και οι άλλες φόρμες δεν θα χρειάζεται να ξέρουν πως είναι γραμμένη η parent αλλά και θα υπάρχει σαφής έλεγχος της SerialPort (πότε ανοίγει, κλείνει και γιατί), κάτι το οποίο είναι αδύνατο αν αυτή είναι static.



    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems