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

 

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

Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

Îåêßíçóå áðü ôï ìÝëïò dimos8enis. Τελευταία δημοσίευση από το μέλος KelMan στις 05-03-2009, 11:50. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-02-2009, 12:24 48380

    Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    Normal 0 false false false MicrosoftInternetExplorer4 /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Κανονικός πίνακας"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;}

    Καλημερα
    ειμαι καινουριος στο φορουμ
    Εχω μια ερωτηση για ενα προγραμμα που εχω γραψει σε VB.NET (2008).
    Το προγραμμα κανει το εξης:
    Πολυπλεκει σειριακα δεδομενα απο πολλες θυρες και τα εξαγει σε μία από την οποία αντίστροφα τα δεδομένα οδηγούνται στην κατάλληλη θύρα.

    Το πρωτο προβλημα ειναι πως αν υπαρχει πολυς φορτος δεδομενων το προγραμμα ειτε κολλει και κλεινει, ειτε "κραταει" τα δεδομενα και τα εμφανιζει ολα μαζι αφου κλεισω τη θυρα που εχει προβλημα. Το παραπανω προβλημα το αντιμετωπισα με χειρισμο του συμβαντος SerialErrorReceived οπου κανω reset τη θυρα καθε φορα που εγειρεται το συγκεκριμενο συμβαν.

    Το δευτερο προβλημα εχει να κανει με τις εικονικες σειριακες θυρες. εχω ενα converter serial to ethernet (ADAM 4571) το οποιο θελω να χειριστω μέσω εικονικης σειριακής θύρας. Τα απαραιτητα προγραμματα δίδονται μαζί με τον μετατροπεα. Το προβλημα ειναι οτι όχι μόνο δεν μπορεί να ανοίξει τη θύρα, αλλα δεν εκτελει καθόλου το κομματι κώδικα που βρίσκεται μετα από την εντολη comport.Open().

    Οσον αφορα το πρωτο προβλημα θα ηθελα να εξαλειψω το reset, ωστε να λειτουργει απρόσκοπτα και να μη διακόπτεται η επικοινωνια σε τακτα διαστηματα, ενω για το δευτερο θα ηθελα να μπορω να ανοίξω την εικονική σειριακή θύρα μέσω του προγράμματος ωστε να επικοινωνήσω με τις υπόλοιπες θύρες και να στειλω δεδομενα στο ethernet. Ειμαι σχεδον πεπεισμενος οτι δε φταιει ο κωδικας αλλα το περιβαλλον .ΝΕΤ αλλα ειναι πολυ δυσκολο να μεταφρασω ενα τοσο μεγαλο προγραμμα. Υπαρχει μηπως αλλη λυση?
    Ευχαριστω εκ των προτερων


    Δημοσθενης Κ.
  •  12-02-2009, 13:39 48384 σε απάντηση της 48380

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    dimos8enis:
    Ειμαι σχεδον πεπεισμενος οτι δε φταιει ο κωδικας αλλα το ιδιο το περιβαλλον .ΝΕΤ αλλα ειναι πολυ δυσκολο να μεταφρασω ενα τοσο μεγαλο προγραμμα. Υπαρχει μηπως αλλη λυση?
    Ευχαριστω εκ των προτερων

    Μάλλον απίθανο έως εντελώς απίθανο. Αν θέλεις να βγάλεις άκρη θα πρέπει να αποκλείσεις αυτό το ενδεχόμενο και να δεις τί συμβαίνει αλλού.

    Κατά πάσα πιθανότητα (95%) το πρόβλημα θα βρίσκεται στον κώδικα σου (που δεν μας παραθέτεις). Μπορεί να χειρίζεσαι τη σειριακή με λάθος τρόπο, μπορεί ο driver να έχει συγκεκριμένους περιορισμούς, μπορεί απλά να χάνονται πακέτα! Κανείς δεν εγγυάται ότι η σειριακή δεν θα εμφανίσει προβλήματα, γι αυτό και υπάρχει το parity bit. Πόσο μάλλον όταν δουλεύεις με virtual serial. Μπορεί να γεμίζει ο buffer της σειριακής. Μπορεί το πρόγραμμα σου να είναι επικοινωνεί σύγχρονα με το port και απλά να κολλάει αυτό όταν υπάρχει μεγάλος φόρτος. μπορεί, μπορεί, μπορεί ....

    Το άλλο 5% είναι o ίδιος ο driver. Οι εταιρείες που φτιάχνουν multi-serial ή serial-over-ethernet συσκευές αρκετές φορές δεν δίνουν σημασία στους drivers. Κατά κανόνα αγοράζουν κάποιο chipset και αλλάζουν τα logo και copyright strings στο driver toolkit του driver toolkit που δίνει ο προμηθευτής του chipset. Μου έχει τύχει στο παρελθόν ακριβώς τέτοια ιστορία, με Microsoft certified driver παρακαλώ. Ο driver δεν ενεργοποιούσε το handshaking και έπρεπε ο δικός μας κώδικας να ελέγχει το RTS για να σταματήσει να στέλνει δεδομένα, αντί να σταματάει αυτόματα να στέλνει όταν έπαιρνε χαμηλό RTS από την άλλη πλευρά. Αναγκαστήκαμε να τους στείλουμε το ίδιο το sample που περιλαμβανόταν στο MSDN για να τους πείσουμε ότι αυτοί έχουν πρόβλημα, και ότι δεν είμασταν εμείς ελέφαντες.

    Αν θέλεις να πεισθείς ότι δεν φταίει το .NET, ξαναγράψε τον κώδικα σου σε native μορφή, π.χ. C++ ή VB6 και δοκίμασε το. Προσωπικά νομίζω ότι θα είναι χάσιμο χρόνου. Από την άλλη, αν θα πρέπει να επικοινωνήσεις με την εταιρεία που έφτιαξε τη σειριακή, καλό είναι να τους στείλεις κώδικα ο οποίος να εμφανίζει το πρόβλημα, αλλιώς δεν πρόκειτα να σου δώσουν σημασία.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  12-02-2009, 18:03 48394 σε απάντηση της 48384

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    μετα απο ορισμενες δοκιμες που εκανα αναθεωρησα την αρχικη μου σκεψη, και πιστευω οτι φταιει το class file που μαλλον ειναι ελλιπες. Νομιζω οτι χρειαζεται καποιου τυπου συνδεσμο με το kernel32.dll αλλα δεν ξερω πως να το κανω...
    Μολις βρω χρονο θα παραθεσω το κομματι κωδικα που εχει το προβλημα, δηλαδη την υπορουτινα comport_DataReceived που ενεργοποιειται με την υπαρξη δεδομενων στο buffer της σειριακης.
    Το buffer δε γεμιζει σιγουρα γιατι το μεγαλωσα οσο δεν παει και δεν ειδα καμια διαφορα, πχ αυτη τη στιγμη παιζει στα 256Κ!
    Να πω την αληθεια δεν ξερω αν επικοινωνει το προγραμμα με τη θυρα συγχρονα η ασυγχρονα, παντως το μοντελο που με ενδιαφερει ειναι το ασυγχρονο, χωρις flow control.
    Τωρα οσον αφορα το θεμα των drivers δε νομιζω να φταιει κατι τετοιο γιατι με hyper terminal και αλλα προγραμματακια διαχειρισης σειριακων θυρων δουλευει μια χαρα. εκτος αν δεν ειναι συμβατοι με .ΝΕΤ η κατι τετοιο.
    Προσωπικα θεωρω πολυ τελευταια λυση την μεταφραση του κωδικα σε αλλη γλωσσα

    Δημοσθενης Κ.
  •  12-02-2009, 19:22 48396 σε απάντηση της 48394

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    Και στη δική μου περίπτωση έπαιζε σωστά το HyperTerminal! Αλλιώς δεν θα την θεωρούσα κουφή και δεν θα την ανέφερα.

    Όσον αφορά το class file, αν εννοείς την κλάση SerialPort δεν υπάρχει τέτοιο θέμα, ούτε χρειάζεται να μιλήσεις εσύ απευθείας στο kernel32.dll. Κοιτάς πάλι να βρεις πρόβλημα στο .NET ενώ κατά 95% δεν είναι εκεί το θέμα. Τέλος, το αν μιλάς σύγχρονα ή ασύγχρονα στη θύρα μόνο εσύ το ξέρεις, γιατί απλά πρέπει να το ορίσεις εσύ. Το ότι δουλεύεις με event δεν σημαίνει ότι δουλεύεις ασύγχρονα. Το event πάλι στο ίδιο thread θα τρέξει. Αν ο κώδικας στο event handler καθυστερεί, όλα τα events από τα υπόλοιπα ports θα περιμένουν να τελειώσει πριν εκτελεστούνε. Αυτό βέβαια δεν διαφέρει σε τίποτε από την VB6, όπου και εκεί όλα τα events εκτελούνταν στο ίδιο thread.

    Για να πετύχεις ασύγχρονα Read/Write θα πρέπει να μιλήσεις στις σειριακές ως streams μέσω του BaseStream property και να χρησιμοποιήσεις τις BeginRead/BeginWrite.

    Αλήθεια, τί error εμφανίζεται στο ErrorReceived event? Αυτό θα σου πει πρώτα απ' όλα τί συμβαίνει, αν είναι δηλαδή Parity error ή buffer overrun. Το μόνο σίγουρο με μία σειριακή είναι ότι θα βγάλει errors. Ανάλογα με το error μπορείς να αποφασίσεις να καθαρίσεις τον buffer με τις DiscardInBuffer/DiscardOutBuffer.

    Επίσης, μην απορρίπτεις τόσο εύκολα την περίπτωση του buffer overrun. Αφού λες ότι δεν υπάρχει flow control, ποιός ελέγχει ότι όσα πράγματα στέλνεις όντως έφτασαν στην άλλη άκρη και ότι το άλλο μηχάνημα δεν μπούκωσε?


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  13-02-2009, 00:14 48400 σε απάντηση της 48396

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    Οταν λεω για το class file δεν εννοω την κλαση της VB.NET αλλα την κλαση που εχω βρει και τροποποιησει για τον χειρισμο της καθε σειριακης θυρας. Αρα δε φταιει η .NET κατα τη γνωμη μου.
    Απλα βρηκα ακομα μια κλαση η οποια εχει κατι σαν συνδεσμους μεταβλητων της κλασης σε στοιχεια του kernel32. αυτο δεν το καταλαβα καλα...
    Τωρα, με τις θυρες δεν επικοινωνω μεσω BaseStream αλλα κατευθειαν μεσα στο συμβαν SerialDataReceived κανω ReadTo, μεθοδος η οποια μου δουλευει αντιθετα με την ReadExisting. (Timeout=-1 αλλιως εχω προβλημα)
    Δεν μπορεσα να δω ποιο συγκεκριμενο Error εμφανιζεται, παρα μονο καποιες φορες το debugger με εχει πεταξει στο κομματι κωδικα που χειριζομαι το IO.IOException μεσα στην Try...Catch που χρησιμοποιω.
    Παντως το DiscardInBuffer το χρησιμοποιω καλου κακου οταν κανω reset τη θυρα, δηλαδη σε καθε exception.
    Στις σειριακες θυρες εχω βαλει μοντεμ οποτε δε με ενδιαφερει τι θα γινει οταν φυγουνε τα δεδομενα απο τον υπολογιστη...

    Δημοσθενης Κ.
  •  25-02-2009, 18:37 48732 σε απάντηση της 48394

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    για να επανελθω στο θεμα,
    χρησιμοποιω το class file απο το εξης tutorial... http://www.dreamincode.net/forums/showtopic37361.htm
    η μεθοδος ειναι απλα η openport.
    επισης, πως μπορω να κανω την επικοινωνια ασυγχρονη? τι αλλαγες χρειαζομαι στον κωδικα?
    τι μπορει να συμβαινει?

    Δημοσθενης Κ.
  •  25-02-2009, 20:56 48734 σε απάντηση της 48732

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    Το tutorial που αναφέρεις δεν χρησιμοποιεί κάποια δικιά του κλάση αλλά την System.IO.SerialPort. Απλά φτιάχνει μία κλάση η οποία βολεύει τον αρθρογράφο και μέσα χρησιμοποιεί την SerialPort.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  26-02-2009, 00:24 48737 σε απάντηση της 48734

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    το ξερω, δε λεω οτι φταιει η  System.IO.SerialPort

    Δημοσθενης Κ.
  •  28-02-2009, 13:21 48792 σε απάντηση της 48737

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    δοκιμασα να προσθεσω εικονικες σειριακες θυρες, απλες με software και δουλευουνε μια χαρα.
    σκεφτηκα μηπως φταιει η επικοινωνια με το δικτυο. ειναι πιθανο να χρειαζεται να κανω import καμμια library για να δουλεψει κατι τετοιο?

    Δημοσθενης Κ.
  •  05-03-2009, 11:33 48921 σε απάντηση της 48792

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    εκανα μεταφραση ενα κομματι του προγραμματος σε C# και δουλευει αψογα!!! τωρα γιατι συμβαινει αυτο στην VB.NET δεν μπορω να καταλαβω...

    Δημοσθενης Κ.
  •  05-03-2009, 11:50 48923 σε απάντηση της 48921

    Απ: Virtual Serial Port over Ethernet χειριζομενη απο προγραμμα γραμμενο σε VB.NET

    Αν δημοσιεύσεις τα κομμάτια κώδικα, μπορούμε να δούμε τη διαφορά στην υλοποίηση...


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems