• Αναλύστε τη δραστηριότητα σειριακής θύρας

    Το Serial Port Monitor μπορεί να συνδεθεί σε μια θύρα COM, ακόμα κι αν είναι ήδη ανοιχτή από κάποια εφαρμογή, και να ξεκινήσει αμέσως την παρακολούθηση. Όλα τα δεδομένα που διέρχονται από την παρακολουθούμενη θύρα COM θα εμφανίζονται στο πρόγραμμα παρακολούθησης. Δεδομένου ότι τα πάντα καταγράφονται σε πραγματικό χρόνο, θα μπορείτε να εντοπίσετε προβλήματα αμέσως. Για τη σύγκριση δεδομένων, υπάρχει μια λειτουργία συγχρονισμένης επιλογής των ίδιων IRP σε διαφορετικές προβολές.

    Επιπλέον, μπορείτε να ανακατευθύνετε όλα τα δεδομένα παρακολούθησης σε ένα καθορισμένο αρχείο ή να αντιγράψετε όλα τα εγγεγραμμένα δεδομένα στο πρόχειρο. Το Serial Port Monitor σάς δίνει τη δυνατότητα να παρακολουθείτε και να καταγράφετε όλους τους κωδικούς ελέγχου εισόδου/εξόδου σειριακής θύρας (IOCTL), να παρακολουθείτε όλα τα δεδομένα και τις παραμέτρους τους. Μπορείτε να αποθηκεύσετε οποιαδήποτε συνεδρία παρακολούθησης και να την φορτώσετε την επόμενη φορά, εάν χρειαστεί.

  • Παρακολούθηση πολλαπλών θυρών στην ίδια περίοδο λειτουργίας

    Το Serial Port Monitor έχει ένα μοναδικό λειτουργικότηταπαρακολούθηση πολλαπλών θυρών COM ταυτόχρονα. Τώρα μπορείτε να συλλέξετε δεδομένα σχετικά με τον τρόπο αλληλεπίδρασης των εφαρμογών με δύο ή περισσότερες θύρες και παράλληλα με πολλές συσκευές στην ίδια περίοδο λειτουργίας. Τα δεδομένα παρακολούθησης που λαμβάνονται και αποστέλλονται θα παρουσιάζονται (καταγράφονται) σε ξεχωριστό αρχείο καταγραφής με τη σειρά με την οποία λαμβάνονται, γεγονός που απλοποιεί σημαντικά την ανάλυση.

  • Διαφορετικές επιλογές για την προβολή ληφθέντων δεδομένων

    Μπορείτε να προβάλετε δεδομένα παρακολούθησης σε 4 λειτουργίες ταυτόχρονα: πίνακας, σειρά, απόθεση ή τερματικό, καθένα από τα οποία προσφέρει διαφορετικό τρόπο παρουσίασης των εγγεγραμμένων σειριακών δεδομένων. Το Serial Port Monitor σάς επιτρέπει να επιλέξετε φίλτρα παρακολούθησης, εξοικονομώντας έτσι χρόνο και επιτρέποντάς σας να παρακολουθείτε μόνο τα συμβάντα που σας ενδιαφέρουν. Στις ρυθμίσεις, μπορείτε να επιλέξετε τα δεδομένα που θα εμφανίζονται: δυαδικό, ASCII, διαμόρφωση της θύρας. Οποιεσδήποτε ρυθμίσεις οθόνης μπορούν να εφαρμοστούν απευθείας στην τρέχουσα διαδικασία παρακολούθησης.

  • Προσομοίωση μεταφοράς δεδομένων σε σειριακή συσκευή

    Μπορείτε να στείλετε δεδομένα σε διάφορες μορφές(συμβολοσειρά, δυαδική, οκταδική, δεκαδική, δεκαεξαδική, μικτή) στην παρακολουθούμενη σειριακή θύρα σαν να στάλθηκαν απευθείας από την ελεγχόμενη εφαρμογή χρησιμοποιώντας τη δυνατότητα λειτουργίας τερματικού παρακολούθησης σειριακής θύρας. Με αυτόν τον τρόπο, μπορείτε να παρακολουθείτε την απόκριση της ελεγχόμενης σειριακής συσκευής σε ορισμένες ειδικές εντολές και δεδομένα.

  • Πλήρης υποστήριξη για το πρωτόκολλο δεδομένων Modbus (RTU και ASCII)

    Με τη βοήθεια των νέων φίλτρων Serial Port Monitor θα μπορείτε να αποκρυπτογραφείτε και να αναλύετε δεδομένα Modbus. Το πρόγραμμα θα βοηθήσει όχι μόνο στη δημιουργία σύνδεσης μεταξύ συσκευών RS485/422/232, αλλά και στη διεξαγωγή αποτελεσματικής ανάλυσης των δεδομένων που διέρχονται.

  • Επαναλάβετε και συγκρίνετε συνεδρίες παρακολούθησης

    Το Serial Port Monitor παρέχει τη μοναδική δυνατότητα αναπαραγωγής μιας περιόδου λειτουργίας από μια εφαρμογή σε μια θύρα για καλύτερη ανάλυσησυνεχιζόμενες διαδικασίες. Θα μπορείτε να παρατηρήσετε την αντίδραση της σειριακής θύρας στο πέρασμα των ίδιων δεδομένων, αυξάνοντας έτσι την απόδοση παρακολούθησης. Έχετε επίσης την επιλογή να συγκρίνετε πολλαπλές περιόδους παρακολούθησης και να παρακολουθείτε αυτόματα τη διαφορά μεταξύ τους.

Σήμερα ιούς υπολογιστώνκυριολεκτικά πλημμύρισε τον κόσμο και περιφέρεται ελεύθερα στο Διαδίκτυο, οπότε όταν πρόκειται για θύρες, οι περισσότεροι χρήστες σκέφτονται συχνά λογικές θύρες, οι οποίες σε τεχνολογίες δικτύου όπως το TCP / IP ή το UDP, χρησιμοποιούνται για την οργάνωση καναλιών επικοινωνίας και ξεχνούν τις φυσικές θύρες για τη σύνδεση εξωτερικών συσκευών. Ωστόσο, ακόμη και για τη σύνδεση εκτυπωτών, τα ποντίκια και τα πληκτρολόγια χρησιμοποιούνται όλο και περισσότερο θύρες USB υψηλής ταχύτηταςκαι όλο και λιγότερο συχνά - οι παλιές καλές COM και LPT (σειριακές και παράλληλες θύρες). Ωστόσο, τα τελευταία είναι διαθέσιμα ακόμη και στους πιο σύγχρονους υπολογιστές και, ίσως, ήρθε η ώρα να τα χρησιμοποιήσετε για κάποιον άλλο σκοπό (ας πούμε, για τον έλεγχο μιας ή άλλης εξειδικευμένης συσκευής).

Προκειμένου να παρακολουθείται η ανταλλαγή μεταξύ ενός υπολογιστή και κάποιας συσκευής, τα προγράμματα αναλυτών θυρών είναι ακριβώς αυτό που χρειάζεται.

Φυσικά, υπάρχουν και ειδικές συσκευές (probes) σε πώληση για την παρακολούθηση αναλογικών και ψηφιακών σημάτων (συμπεριλαμβανομένων αναλυτών USB, LPT και COM), ωστόσο, όπως κάθε επαγγελματικό εξοπλισμόείναι αρκετά ακριβά.

Έλεγχος σειριακής θύρας υπολογιστή (COM)

Ένα από τα προγράμματα ανάλυσης σειριακής θύρας γράφτηκε από τον Valery Kovtun (http://valery-us4leh.narod.ru/). Ευχαριστώ για ένα υπέροχο εργαλείο!

Το πρόγραμμα ονομάζεται Com Port Visual Control (http://valery-us4leh.narod.ru/ComVC.html), διανέμεται δωρεάν και προορίζεται για οπτικό έλεγχο, τεκμηρίωση ανταλλαγής δεδομένων και μελέτη των διαδικασιών που συμβαίνουν στον πομποδέκτη UART κατά τη λειτουργία εφαρμογών με χρήση θύρας COM προσωπικός υπολογιστής. Αυτό το πρόγραμμα λειτουργεί σε περιβάλλον Windows 9x/Me/NT/2000/XP και εκτελεί συνεχή προβολή (παρακολούθηση) όλων των καταχωρητών του τσιπ UART. Ο ελεγκτής έχει μορφή 8x8 (οκτώ καταχωρητές των οκτώ bit) και για κάθε καταχωρητή εμφανίζει ανεξάρτητα: την τρέχουσα κατάσταση (ταυτόχρονα σε δεκαδική και δεκαεξαδική μορφή), καθώς και τη λογική κατάσταση. Επιπλέον, το πρόγραμμα μπορεί να γράψει τιμές σε καταχωρητές (επίσης σε δεκαδική και δεκαεξαδική μορφή) και να διαχειριστεί ανάλογα τη λογική κατάσταση. Επιπλέον, παρακολουθεί τις αλλαγές στους καταχωρητές και διατηρεί ένα πρωτόκολλο (LOG) σύμφωνα με τις εντολές του πομποδέκτη του τσιπ UART και επίσης διατηρεί ένα πρωτόκολλο λαμβανόμενων και μεταδιδόμενων δεδομένων σε επίπεδο κωδικών μηχανής. Μετά την εργασία, το πρόγραμμα προβάλλει και αποθηκεύει αρχεία LOG και μπορεί να τα αναζητήσει για τις απαραίτητες πληροφορίες.

Το Com Port Visual Control έχει ενσωματωμένο πομποδέκτη για τυπική ρύθμισηλειτουργίες θύρας: bit δεδομένων, bit διακοπής, ταχύτητα, ισοτιμία, έλεγχος σφαλμάτων, δυνατότητα λήψης και μετάδοσης δεδομένων κειμένου και εντολών μόντεμ, καθώς και ένδειξη για την παρακολούθηση της ενεργής κατάστασης των εντολών UART (υποστηρίζονται 17 βασικές εντολές). Επιπλέον, οι θύρες υπολογιστή παρακολουθούνται με ταυτόχρονη εμφάνιση μιας ομάδας καταχωρητών και bit κατάστασης και διατηρείται ένα πρωτόκολλο για την αλλαγή δεδομένων στον βασικό καταχωρητή.

Ανάμεσα σε τέτοια προγράμματα είναι δωρεάν βοηθητικό πρόγραμμα ComLite32 από Realtime Communications (RTCOMM, http://www.rtcomm.com/), γραμμένο για Windows 95, και την premium πληρωμένη έκδοση, ComLab32 (http://www.rtcard.com/comlab32.html).

Αυτά τα προγράμματα είναι ισχυροί αναλυτές επικοινωνίας σε πραγματικό χρόνο που σας επιτρέπουν να εξερευνήσετε την ανταλλαγή μέσω μιας θύρας COM και να κατανοήσετε πώς λειτουργεί μια συγκεκριμένη συσκευή, ακόμα κι αν δεν υπάρχει τεκμηρίωση για αυτήν. Το πρόγραμμα έχει ένα βολικό και διαισθητικό καθαρή διεπαφή, διευκολύνοντας την παρακολούθηση της ανταλλαγής, τη διαχείριση των θυρών I/O και την παροχή αναλυτικής ηλεκτρονικής τεκμηρίωσης.

Τα προγράμματα ComLite32 και ComLab32 λειτουργούν με τις θύρες RS-232, RS-422, RS-485 και RTX485 (με την τελευταία θύρα να είναι μόνο για ανάγνωση) και σας επιτρέπουν να επικοινωνείτε με αυτές τις θύρες και προς τις δύο κατευθύνσεις. Απαιτήσεις συστήματοςΤα προγράμματα ComLite32 είναι ελάχιστα: μόνο 8 MB RAM, 6 MB χώρος στο δισκοκαι τουλάχιστον μία συσκευή που λειτουργεί με σειριακή θύρα (συμπεριλαμβανομένων των μόντεμ PCMCIA φορητού υπολογιστή).

Και τέλος, θα ήθελα να σημειώσω τα προγράμματα Advanced Serial Port Monitor και Advanced Serial Data Logger από την AGG Software (http://www.aggsoft.ru). Το Advanced Serial Data Logger επεξεργάζεται τα δεδομένα που λαμβάνονται μέσω του RS-232 και τα μεταδίδει σε αρχείο excel, Access ή κάποια άλλη εφαρμογή των Windows. Το πρόγραμμα παρέχει τη δυνατότητα συλλογής δεδομένων από οποιαδήποτε συσκευή σε πραγματικό χρόνο, καθώς και λήψης και μετάδοσης δεδομένων μέσω της διεπαφής RS-232 ή μέσω της διεπαφής RS-485 εάν υπάρχει διαθέσιμος μετατροπέας υλικού. Το Advanced Serial Data Logger συλλέγει δεδομένα από τη σειριακή θύρα, τα επεξεργάζεται σύμφωνα με τις ανάγκες του χρήστη, εξάγει μπλοκ δεδομένων από τη γενική ροή και στη συνέχεια μεταφέρει τα δεδομένα σε οποιαδήποτε εφαρμογή Windows ή DOS - πατώντας τα κατάλληλα πλήκτρα στην εφαρμογή παράθυρο. Τα δεδομένα μεταφέρονται μέσω DDE (Dynamic Data Exchange), ODBC, OLE κ.λπ. Αυτή η λύση μπορεί να χρησιμοποιηθεί σε αυτοματοποιημένα συστήματα συλλογής δεδομένων ή σε συστήματα ανάλυσης κλήσεων PBX.

Το Advanced Serial Data Logger μπορεί επίσης να στείλει αιτήματα και εντολές μέσω σειριακής θύρας για τον άμεσο έλεγχο συσκευών μέσω του πρωτοκόλλου ASCII (προεπιλογή) ή MODBUS. Έτσι, το πρόγραμμα Advanced Serial Data Logger γίνεται διακομιστής I/O. Όσο για τη διαχείριση και τις ρυθμίσεις, είναι πολύ απλές και εύχρηστες. Δεν απαιτείται πρόσθετος προγραμματισμός για την απόκτηση δεδομένων.

Επιπλέον, το Advanced Serial Data Logger μπορεί να λειτουργήσει ως υπηρεσία στα Windows NT/2000/XP/2003, η οποία θα ξεκινήσει κατά την εκκίνηση του συστήματος και θα εγγράψει δεδομένα από τη σειριακή θύρα σε ένα αρχείο στο δίσκο ή σε άλλες καθορισμένες τοποθεσίες ακόμη και πριν από την καταγραφή του χρήστη στο σύστημα (και θα συνεχίσει να λειτουργεί μετά το τέλος της συνεδρίας χρήστη).

Το πρόγραμμα έχει τη δυνατότητα εκτέλεσης πολλαπλών αντιγράφων στον ίδιο υπολογιστή, έτσι ώστε να μπορούν να καταγραφούν πολλές θύρες ταυτόχρονα.

Όσο για το πρόγραμμα Advanced Serial Port Monitor, μπορεί να είναι χρήσιμο τόσο για αρχάριους χρήστες όσο και για επαγγελματίες.

Το Advanced Serial Port Monitor μπορεί να χρησιμοποιηθεί τόσο για την παρακολούθηση της μετάδοσης δεδομένων από άλλες εφαρμογές όσο και για την αποστολή και λήψη δεδομένων μέσω της σειριακής θύρας του υπολογιστή (RS-232). Το πρόγραμμα παρέχει διάφορους τρόπουςαποθήκευση δεδομένων σε ένα αρχείο ή οπτικοποίηση τους στην οθόνη της οθόνης.

Έτσι, μπορείτε να εργαστείτε με όλες τις συσκευές που λειτουργούν μέσω της διεπαφής RS-232 ή RS-485 (RS-422) με τον κατάλληλο μετατροπέα. Θα παρατηρήσετε την ανταλλαγή δεδομένων μεταξύ οποιασδήποτε εφαρμογής των Windows και εξωτερικές συσκευέςσυνδεδεμένο στη σειριακή θύρα. Αυτό μπορεί να είναι είτε μια συσκευή μέτρησης, είτε ένα οικιακό ραδιόφωνο ή ένας άλλος υπολογιστής συνδεδεμένος μέσω καλωδίου μόντεμ z ή μηδενικού μόντεμ.

Το Advanced Serial Port Monitor υποστηρίζει λειτουργία full duplex, δηλαδή, μπορείτε να παρακολουθείτε την ανταλλαγή και προς τις δύο κατευθύνσεις χωρίς να χρησιμοποιείτε άλλα προγράμματα και χωρίς να διακόπτετε άλλες εφαρμογές. Όλες οι πληροφορίες που διέρχονται από τη σειριακή θύρα εμφανίζονται στην οθόνη σε ένα ειδικό παράθυρο και μπορούν να εγγραφούν σε ένα αρχείο. Όλες οι εμφανιζόμενες παράμετροι μπορούν να αλλάξουν κατά τη λειτουργία. Ταυτόχρονα, το πρόγραμμα υποστηρίζει δύο λειτουργίες - αυτόματη και χειροκίνητη, δηλαδή μπορείτε να στείλετε δεδομένα πατώντας το κουμπί "Αποστολή" ή θα σταλούν αυτόματα σε ένα συγκεκριμένο διάστημα (από 10 έως 10.000 ms).

Με τη βοήθεια πρόσθετων μονάδων, μπορείτε όχι μόνο να λαμβάνετε δεδομένα ή να στέλνετε εντολές, αλλά και να μιμείτε την εργασία ορισμένων συγκεκριμένες συσκευέςκαι σε λειτουργία παρατηρητή (αναχαιτιστή) - απλώς παρακολουθήστε την ανταλλαγή δεδομένων μεταξύ μιας εξωτερικής συσκευής που είναι συνδεδεμένη στη σειριακή θύρα και ορισμένων εφαρμογή Windows. Και τέλος, το Advanced Serial Port Monitor έχει τη δική του ενσωματωμένη γλώσσα δέσμης ενεργειών, με την οποία μπορείτε να εκτελέσετε το πρόγραμμα με προκαθορισμένες επιλογές και ενέργειες, καθώς και να εκτελέσετε εντολές από modules.

Έλεγχος παράλληλης θύρας υπολογιστή (LPT)

Ο Valery Kovtun έχει ένα άλλο χρήσιμο πρόγραμμα επικοινωνίας - το LPT 3D Hard Analyzer. Το πρόγραμμα είναι ένας γραφικός αναλυτής αποθήκευσης-παλμογράφος σχεδιασμένος να καταγράφει ψηφιακά σήματα και πρωτόκολλα συσκευών που είναι συνδεδεμένες στην παράλληλη θύρα ενός υπολογιστή στα Windows 95/98/Me/NT/2000/XP.

Το LPT 3D Hard Analyzer λειτουργεί μέσω της θύρας LPT και σας επιτρέπει να αναλύσετε πέντε γραμμές εισόδου (κανάλια) και 12 κανάλια εξόδου (δηλαδή, έλεγχος ψηφιακά σήματααπό υπολογιστή) σε λειτουργία SPP ή χειριστείτε τέσσερις εξόδους και 14 παραμέτρους εισόδουσε λειτουργία EPP. Η αμφίδρομη λειτουργία παράλληλης θύρας EPP είναι διαθέσιμη σε όλους σχεδόν τους υπολογιστές που κυκλοφόρησαν μετά το 1993. Μερικές φορές, ωστόσο, δεν είναι ενεργοποιημένο από προεπιλογή στο BIOS (αυτό πρέπει να ελεγχθεί και, αν είναι δυνατόν, να ενεργοποιηθεί).

Όταν λειτουργεί σε λειτουργία παλμογράφου, το πρόγραμμα θυμάται και τα 17 γραφήματα (γραμμές), το βάθος (εμφανιζόμενο μήκος του γραφήματος στο χρόνο) περιορίζεται μόνο από την ελεύθερη μνήμη του υπολογιστή (και λαμβάνοντας υπόψη το αρχείο σελιδοποίησης στα OC Windows, αυτό θα είναι αρκετές εκατοντάδες megabyte). Υπάρχει επίσης μια επιλογή αυτόματης αποθήκευσης του καθενός ΝΕΑ ΣΕΛΙΔΑσε γραφική μορφή.

Αναλυτής-παλμογράφος LPT 3D Hard Analyzer σχεδιάζει τις αλλαγές δεδομένων σε δισδιάστατη και τρισδιάστατη μορφή και επίσης εμφανίζει δύο ανεξάρτητα διαγράμματα: έναν παλμογράφο 17 καναλιών (bit ανά κανάλι) και ένα γράφημα καταχωρητών θυρών (είσοδος, έξοδος, έλεγχος) . Υπάρχει μια προσαρμογή της ταχύτητας ανάλυσης και εμφανίζεται ο συνολικός αριθμός κύκλων για ολόκληρη την περίοδο προόδου του γραφήματος. Μπορείτε επίσης να προγραμματίσετε τον αριθμό των κύκλων με τη δυνατότητα αντιγραφής γραφημάτων στη μνήμη (το βάθος σχεδίασης περιορίζεται μόνο από τα διαθέσιμα ΕΜΒΟΛΟυπολογιστή). Το πρόγραμμα διαθέτει εργαλεία για την εξοικονόμηση πόρων του συστήματος κατά την ανάγνωση δεδομένων από συσκευές υψηλής ταχύτητας που είναι συνδεδεμένες στη θύρα LPT και συγχρονίζονται με αυτό από αυτό το πρόγραμμα (δηλαδή, μπορεί να χρησιμοποιηθεί σε σχετικά αδύναμους υπολογιστές). Όταν απενεργοποιείτε τη λειτουργία απεικόνισης γραφικών, τα γραφικά αντιγράφονται μόνο στη μνήμη του υπολογιστή - ως αποτέλεσμα, η ταχύτητα του προγράμματος δεκαπλασιάζεται. Στο τέλος της ανάλυσης, το γράφημα προβάλλεται με τον ίδιο τρόπο σαν να είχε μεταβεί στη λειτουργία γραφικής απεικόνισης. Η κύλιση των γραφημάτων πραγματοποιείται ομαλά και σελίδα προς σελίδα ( κάντε δεξί κλικποντίκια). Υπάρχει μια ευέλικτη ρύθμιση της ταχύτητας και του βήματος κύλισης, καθώς και η δυνατότητα αυτόματης συμπίεσης ολόκληρου του γραφήματος σε μία σελίδα. Μπορούν να αποθηκευτούν στιγμιότυπα της κατάστασης της επιλεγμένης σελίδας γραφήματος Μορφές BMPκαι WMF (μετααρχείο Windows) ή ορίστε την αυτόματη αποθήκευση σε ξεχωριστό αρχείο για κάθε νέα σελίδα. Για να δείτε το πακέτο έχει ενσωματωμένα αρχεία γραφικών του προγράμματος περιήγησης.

Η μονάδα ελέγχου θύρας βασίζεται στον κώδικα πυρήνα ενός άλλου προγράμματος του Valery Kovtun - XP LPT, το οποίο χρησιμοποιεί το πρόγραμμα οδήγησης LPT WDMIO I/O.

Το πρόγραμμα XP LPT έχει σχεδιαστεί για να ελέγχει τις παράλληλες θύρες ενός υπολογιστή από τα Windows 9x/2000/XP και έχει τις ακόλουθες δυνατότητες:

  • εκτελεί αυτόματη εγγραφή του προγράμματος οδήγησης στα Windows XP ως διαχειριστής συστήματος.
  • οδηγεί αυτόματο έλεγχοεγκατεστημένα λιμάνια?
  • εκτελεί ταυτόχρονη ανάγνωση των καταχωρητών δεδομένων, ελέγχου και κατάστασης της επιλεγμένης θύρας LPT.
  • εμφανίζει τα περιεχόμενα των καταχωρητών ταυτόχρονα σε διαφορετικές μορφές (δεκαδική και δεκαεξαδική), γεγονός που εξαλείφει την ανάγκη επανυπολογισμού.

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

Όπως έχουμε ήδη αναφέρει, το πρόγραμμα λειτουργεί μέσω του προγράμματος οδήγησης LPT WDMIO I/O και έχει σχεδιαστεί ειδικά για την εκπαίδευση και τον εντοπισμό σφαλμάτων ιδιοπαραγόμενων προγραμμάτων για τον έλεγχο εξωτερικών συσκευών μέσω παράλληλης θύρας σε περιβάλλον Windows.

Ο Valery Kovtun δημιούργησε επίσης το πρόγραμμα PortControl, το οποίο χρησιμοποιείται για τον έλεγχο μιας παράλληλης θύρας με έναν αναλυτή 17-bit του πρωτοκόλλου επικοινωνίας για συσκευές που χρησιμοποιούν τη θύρα LPT του υπολογιστή. Το πρόγραμμα είναι γραμμένο για την οικογένεια λειτουργικών συστημάτων Windows και έχει τις ακόλουθες δυνατότητες:

  • Υπάρχουν τρία ανεξάρτητα κανάλια που μπορούν να χρησιμοποιηθούν για την εισαγωγή της διεύθυνσης της θύρας (καταχώριση), την αυτόματη ανάγνωση δεδομένων από τη θύρα, την εγγραφή δεδομένων στη θύρα σε δεκαδική και δεκαεξαδική μορφή και την εμφάνιση δεδομένων σε μορφές bite, word και Dword.
  • εμφανίζεται η κατάσταση καθενός από τα 17 bit της θύρας LPT και ελέγχονται τα bit εξόδου.
  • Εννέα προγραμματιζόμενες θύρες/τράπεζες μνήμης δεδομένων διαθέσιμες.
  • ένας αναλυτής-παλμογράφος 17 καναλιών της λογικής κατάστασης κάθε bit λειτουργεί με τη δυνατότητα ρύθμισης της ταχύτητας ανάλυσης (σε χρόνο), συγχρονισμού με οποιοδήποτε από τα 17 bit - σύμφωνα με υψηλό επίπεδο(1) και low (0), καθώς και μετρητής μεταδιδόμενων δεδομένων για κάθε bit και πολλές άλλες λειτουργίες για εύκολο έλεγχο και συντονισμό ψηφιακές συσκευέςσυνδεδεμένο σε υπολογιστή.

Αυτό το πρόγραμμα μπορεί να χρησιμοποιηθεί τόσο ως ψηφιακός πολυκαναλικός παλμογράφος όσο και για έλεγχο εξωτερικών συσκευών μέσω υπολογιστή.

Τα προγράμματα ανάλυσης και διαχείρισης λιμένων μπορεί να έχουν διάφορες εφαρμογές. Πρώτον, μπορούν να χρησιμοποιηθούν λεπτομερής έλεγχοςκαι δοκιμή της απόδοσης της παράλληλης θύρας του υπολογιστή, για παράδειγμα, για έλεγχο της απόδοσης της θύρας LPT και του συστήματος συνολικά χρησιμοποιώντας τη λειτουργία Test out. Επιπλέον, είναι βολικό να παρακολουθείτε όλες τις λειτουργίες έγκαιρα χρησιμοποιώντας τον ενσωματωμένο αναλυτή-παλμογράφο 17 καναλιών με δυνατότητα ευέλικτης ρύθμισης για συγκεκριμένο τύπο μέτρησης.

Για την ανάλυση δίαυλων μετάδοσης ψηφιακών δεδομένων υψηλής ταχύτητας που είναι συνδεδεμένοι σε υπολογιστή διαφόρων ραδιοηλεκτρονικών συσκευών και μικροκυκλωμάτων, συνιστάται ένας υπολογιστής με συχνότητα επεξεργαστή τουλάχιστον 300 MHz. Αλλά για συσκευές χαμηλής ταχύτητας, περισσότερα από αδύναμοι υπολογιστέςκάτω από Έλεγχος Windows 95.

Δεύτερον, τα προγράμματα αναλυτών μπορούν να χρησιμοποιηθούν για τον έλεγχο, την ανάλυση, τη διαμόρφωση, την ανάπτυξη, τη δοκιμή και την επισκευή ψηφιακών ραδιοηλεκτρονικών κυκλωμάτων ( μεμονωμένες ενότητες, μπλοκ, διαύλους ελέγχου, πρωτόκολλα ελέγχου συνθεσάιζερ συχνότητας, στοιχεία ελέγχου ψηφιακοί δείκτες, προγραμματιστές ROM κ.λπ.), δηλαδή όπου χρησιμοποιείται ευρέως ψηφιακά μικροκυκλώματα, τα οποία σχηματίζουν σήματα ελέγχου και με κάποιο τρόπο αντιδρούν σε αυτά.

Τρίτον, τα προγράμματα αναλυτών θυρών μπορούν απλώς να χρησιμοποιηθούν για την ανάγνωση πρωτοκόλλων ανταλλαγής. Και με το συγχρονισμό του διαύλου δεδομένων και των σημάτων ελέγχου των συσκευών αποθήκευσης πληροφοριών και αναγνώρισης, μπορείτε ακόμη και να διαβάσετε σήματα υπηρεσίας ή/και να αποκτήσετε πρόσβαση σε κωδικούς πρόσβασης κωδικοποιημένους σε ακολουθίες μηδενικών και μονάδων. Γενικά, αυτά τα προγράμματα έχουν σχεδιαστεί για να ενδυναμώσουν τον ραδιοερασιτέχνη, τον μηχανικό ηλεκτρονικών ή τον μηχανικό σχεδιασμού. Μια οπτική μελέτη των πρωτοκόλλων λειτουργίας των ραδιοηλεκτρονικών συσκευών μπορεί επίσης να είναι χρήσιμη κατά την ανάπτυξη των δικών σας λογισμικόελέγχεται από διαφορετικούς ελεγκτές.

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

Πέμπτον, τα προγράμματα που αναφέρονται θα είναι χρήσιμα για αρχάριους προγραμματιστές. Για παράδειγμα, αν αποφασίσετε να γράψετε μικρό πρόγραμμαγια να ελέγξετε ορισμένες εξωτερικές συσκευές μέσω μιας παράλληλης θύρας, θα είναι πολύ βολικό για εσάς να παρατηρήσετε οπτικά τον αλγόριθμο του προγράμματός σας στην πολυλειτουργική διεπαφή PortControl. Ως αποτέλεσμα, θα μπορείτε να εντοπίσετε και να εξαλείψετε τα λάθη που έγιναν εγκαίρως χωρίς να τα χρησιμοποιήσετε όργανα μέτρησηςστην έξοδο της θύρας και χωρίς παρεμβολές στο κύκλωμα της ελεγχόμενης συσκευής.

Και τέλος για το παράλληλο λιμάνι προτείνει ο Valery Kovtun χρήσιμο πρόγραμμα PinRegistrator, σχεδιασμένος να παρακολουθεί και να καταχωρεί τη λογική κατάσταση των bit της θύρας LPT. Το πρόγραμμα γράφτηκε στα Windows 95/98/Me και καταγράφει την κατάσταση της παράλληλης θύρας αυτόματα ή μη αυτόματα.

Έλεγχος θύρας USB υπολογιστή

Η προαναφερθείσα εταιρεία AGG Software διαθέτει προγράμματα σχεδιασμένα να αναλύουν και να παρακολουθούν θύρες USB, λεωφορεία, ελεγκτές και συσκευές. Για παράδειγμα, το Advanced USB Monitor (http://www.aggsoft.ru/usb-monitor/index.htm) σάς επιτρέπει να καταγράφετε, να αναλύετε, να προβάλλετε και να επεξεργάζεστε την κυκλοφορία USB για αποτελεσματικό εντοπισμό σφαλμάτων και δοκιμές συσκευών USB. Υποστηρίζονται συσκευές που πληρούν όλες τις προδιαγραφές: UHCI- (παλιά συσκευές USBΣυσκευές 1.x που λειτουργούν σε ταχύτητες έως 1,5 Mbps), OHCI- (συσκευές επόμενης γενιάς USB 1.x που λειτουργούν με ταχύτητες έως 12 Mbps) και τέλος συσκευές USB 2.0 EHCI (λειτουργούν σε ταχύτητες έως 480 Mbps). Το Advanced USB Monitor σάς επιτρέπει να επεκτείνετε το εργαστηριακό κιτ εργαλείων τόσο για προγραμματιστές συσκευών USB όσο και για προχωρημένους χρήστες.

Η προηγμένη οθόνη USB μπορεί να εμφανίζει τα μεταδιδόμενα πακέτα δεδομένων με ευανάγνωστο τρόπο, να αποκωδικοποιεί τους περιγραφείς, να εντοπίζει σφάλματα πακέτων και να μετράει την απόδοση της συσκευής. Κατά τη λήψη, τα πακέτα δεδομένων μπορούν να εμφανίζονται σε πραγματικό χρόνο, επιτρέποντάς σας να παρακολουθείτε την κατάσταση των συσκευών. Τα πακέτα δεδομένων αποθηκεύονται με χρονολογική σειρά και περιέχουν πλήρη ενημέρωσησχετικά με τις διευθύνσεις και τα τελικά σημεία. Αυτό καθιστά πολύ εύκολο τον εντοπισμό, το φιλτράρισμα και την αναζήτηση πακέτων. Το πρόγραμμα παρέχει πολλά επίπεδα λεπτομέρειας κατά την εμφάνιση δεδομένων. Η γρήγορη αποκωδικοποίηση της κίνησης USB καθιστά δυνατή την εργασία ακόμη και με τέτοια συσκευές υψηλής ταχύτηταςόπως μονάδες USB ή κάμερες USB. Επιπλέον, η σύλληψη, η παρακολούθηση και η καταγραφή των δεδομένων που συλλέγονται γίνονται σε πραγματικό χρόνο. Με το Advanced USB Monitor, μπορείτε να δείτε την κυκλοφορία όπως συμβαίνει και ταυτόχρονα για μια σειρά συσκευών USB, με πολλαπλά παράθυρα παρακολούθησης ανοιχτά ταυτόχρονα.

Η χρήση προγράμματος οδήγησης πυρήνα λήψης με υποστήριξη για WDM, WMI, Power Management και PNP σάς επιτρέπει να επιτύχετε πλήρη συμβατότητα με λειτουργικό σύστημακαι συσκευές USB για μέγιστη απόδοση.

Το πρόγραμμα σας δίνει επίσης τη δυνατότητα να μετρήσετε την απόδοση οποιασδήποτε συσκευής USB. Η προηγμένη οθόνη USB πλοηγείται εύκολα στην τοπολογία των συσκευών USB και λαμβάνει μια λεπτομερή περιγραφή τεχνικές πληροφορίεςσχετικά με συσκευές όπως μονάδες USB (διεπαφές, καταληκτικά σημεία, πληροφορίες μητρώου, πληροφορίες τάξης και άλλα). Στο τέλος της μελέτης, μπορείτε να λάβετε μια έτοιμη αναφορά για τις συνδεδεμένες συσκευές και την κίνηση USB και στο τέλος της μελέτης, να την εκτυπώσετε σε έναν εκτυπωτή. Επιπλέον, το πρόγραμμα διαθέτει προηγμένες λειτουργίες για την εξαγωγή δεδομένων Μορφές PDF, XML ή Microsoft Word, το οποίο επιτρέπει να μην περιοριστεί η διαδικασία μετά την επεξεργασία δεδομένων μόνο σε αυτό το πρόγραμμα.

Οι παλμογράφοι USB (http://www.usb-osc.narod.ru/) λειτουργούν με την ίδια αρχή με τους παραπάνω αναλυτές-παλμογράφους για την παράλληλη θύρα. Ο παλμογράφος USB προορίζεται κυρίως για ραδιοερασιτέχνες που, λόγω της φύσης της δουλειάς τους, αντιμετωπίζουν την ανάγκη να αναλύουν αναλογικά σήματα χαμηλής συχνότητας, να καταγράφουν μακροχρόνιες αργά μεταβαλλόμενες διαδικασίες και επίσης να εξετάζουν δυαδικά σήματα από διάφορες συσκευές. Επιπλέον, ο παλμογράφος USB μπορεί να χρησιμοποιηθεί ως απλός βολτόμετρο δύο καναλιών για τάσεις στην περιοχή +/-20 V, μετρητής συχνοτήτων για συχνότητες σήματος έως 50 kHz ή αισθητήρας με ηχητική ειδοποίηση.

Έτσι, ο παλμογράφος USB παρέχει τους ακόλουθους τρόπους λειτουργίας:

  • παλμογράφος δύο καναλιών (μετρήσεις δείκτη, συγχρονισμός, μετρήσεις τάσης και συχνότητας σήματος, φιλτράρισμα κ.λπ.).
  • αναλυτής φάσματος δύο καναλιών (μετρήσεις δείκτη, διάφορες λειτουργίες παραθύρου, φιλτράρισμα κ.λπ.).
  • συσκευή εγγραφής δύο καναλιών (μετρήσεις δείκτη, εγγραφή σήματος για αρκετές δεκάδες ώρες κ.λπ.).
  • Λογικός αναλυτής 8/16 καναλιών (μετρήσεις δείκτη, συγχρονισμός, παράλειψη δεδομένου αριθμού παλμών, αναζήτηση ενός δεδομένου λογικού συνδυασμού, διεπαφές αποκωδικοποίησης UART, SPI, I2C, 1-Wire, κ.λπ.).
  • Λογική γεννήτρια 8 καναλιών (ρύθμιση πίνακα σημάτων ή άμεση κατασκευή διαγραμμάτων χρονισμού με το ποντίκι κ.λπ.).

Επιπλέον, ο παλμογράφος USB σάς επιτρέπει να αποθηκεύετε τα αποτελέσματα όλων των μετρήσεων με τη μορφή διανυσματικού ή ράστερ σχεδίου για μεταγενέστερη εισαγωγή σε άλλα προγράμματα ή για αποθήκευση σε αρχείο για μεταγενέστερη ανάλυση. Τα αποτελέσματα όλων των μετρήσεων μπορούν να εκτυπωθούν, να αντιγραφούν στο πρόχειρο, καθώς και να οριστούν συμβάντα και να τα συνοδεύσουν με ένα ηχητικό σχόλιο. Μπορούν να υπολογιστούν διάφορα ψηφιακά φίλτρα και μπορεί να πραγματοποιηθεί αναλογικό φιλτράρισμα και εξομάλυνση χρονισμού παλμογράφου. Η συσκευή σάς επιτρέπει να εμφανίζετε στατιστικά στοιχεία για όλα τα κανάλια του λογικού αναλυτή και της γεννήτριας.

Ωστόσο, οι παλμογράφοι USB δεν είναι πλέον απλά προγράμματα, αλλά συσκευές που κατασκευάζονται με τη μορφή εξωτερικών μονάδων με διασύνδεση USB και συνοδεύονται από παρόχους υπηρεσιών. ενότητες λογισμικού. Δηλαδή, είναι ένα ολόκληρο καθολικό συγκρότημα μέτρησης, που αποτελείται από ένα εξάρτημα μεταγωγής και έναν υπολογιστή. Παρεμπιπτόντως, μπορείτε να ενημερώσετε το υλικολογισμικό μιας τέτοιας συσκευής μέσω ενός διαύλου USB, το οποίο σας επιτρέπει να συμπληρώσετε τις δυνατότητες της συσκευής με οποιεσδήποτε προσαρμοσμένες λειτουργίες.

Τέτοιες συσκευές παράγονται από την ουκρανική εταιρεία Da-Labs (http://www.da-labs.com/) και Ρωσική εταιρεία"Trade-M" (http://motor-master.ru/index.htm/). Η τιμή ενός σετ μιας ρωσικής εταιρείας είναι 1850 ρούβλια. εξαιρουμένης της παράδοσης.

Έτσι, οπλισμένοι με τα απαραίτητα εργαλεία, έχουμε τώρα την ευκαιρία να γράφουμε ανεξάρτητα προγράμματα ελέγχου για διάφορες εξωτερικές συσκευές χρησιμοποιώντας οποιεσδήποτε θύρες του υπολογιστή μας.

Οι σειριακές θύρες αγαπούνται από τους προγραμματιστές για την ευκολία συντήρησης και χρήσης τους.

Και φυσικά, η εγγραφή στην κονσόλα του προγράμματος τερματικού είναι καλή, αλλά θέλω τη δική μου εφαρμογή, η οποία, πατώντας ένα πλήκτρο στην οθόνη, εκτελεί τις ενέργειες που χρειάζεστε;)

Σε αυτό το άρθρο θα περιγράψω πώς να δουλέψετε με το com port σε γλώσσα C++.

Η λύση είναι απλή, αλλά για κάποιο λόγο δεν βρέθηκε αμέσως ένα λειτουργικό παράδειγμα. Για sim το αποθηκεύω εδώ.

Φυσικά, μπορείτε να χρησιμοποιήσετε λύσεις cross-platform όπως το QSerial - μια βιβλιοθήκη σε Qt, μάλλον θα το κάνω, αλλά στο μέλλον. Τώρα μιλάμε για «καθαρά» Windows C++. Θα γράψουμε σε οπτικό στούντιο. Έχω το 2010, αν και αυτό δεν παίζει κανένα ρόλο ...

Δημιουργήστε ένα νέο έργο κονσόλας Win32.

Συμπεριλάβετε αρχεία κεφαλίδας:

#περιλαμβάνω #περιλαμβάνω χρησιμοποιώντας namespace std?

Δηλώνουμε διαχειριστή θύρας com:

HANDLE hSerial;

Το κάνω καθολικά, οπότε δεν χρειάζεται να ανησυχώ για δείκτες όταν το μεταβιβάζω σε λειτουργίες.

int _tmain(int argc, _TCHAR* argv) (

Δεν αντέχω το στυλ προγραμματισμού των Windows. Κάλεσαν τα πάντα με τον τρόπο τους και κάθονταν αγαλλιασμένοι...

Τώρα η μαγεία της δήλωσης μιας συμβολοσειράς με το όνομα της θύρας. Το θέμα είναι ότι δεν είναι σε θέση να μεταμορφώσει τον εαυτό του char.

LPCTSTR sPortName = L"COM1";

Η εργασία με σειριακές θύρες στα Windows λειτουργεί όπως με ένα αρχείο. Ανοίγοντας το πρώτο θύρα com για γραφή/ανάγνωση:

HSerial = ::CreateFile(sPortName,GENERIC_READ | GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);

Έλεγχος της λειτουργικότητας:

If(hSerial==INVALID_HANDLE_VALUE) ( if(GetLastError()==ERROR_FILE_NOT_FOUND) ( cout<< "serial port does not exist.\n"; } cout << "some other error occurred.\n"; }

Τώρα πρέπει να διαμορφώσετε τις παραμέτρους σύνδεσης:

DCB dcbSerialParams = (0); dcbSerialParams.DCBlength=sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) ( cout<< "getting state error\n"; } dcbSerialParams.BaudRate=CBR_9600; dcbSerialParams.ByteSize=8; dcbSerialParams.StopBits=ONESTOPBIT; dcbSerialParams.Parity=NOPARITY; if(!SetCommState(hSerial, &dcbSerialParams)) { cout << "error setting serial port state\n"; }

Στο msdn, συνιστάται να λάβετε πρώτα τις παραμέτρους και μετά να τις αλλάξετε. Εξακολουθούμε να μαθαίνουμε, οπότε κάνουμε ό,τι μας ζητήθηκε.

Τώρα ας δηλώσουμε τη συμβολοσειρά που θα περάσουμε και τις μεταβλητές που είναι απαραίτητες για αυτό:

Χαρακτηριστικά = "Γεια από την C++"; // συμβολοσειρά για να περάσει DWORD dwSize = sizeof(data); // μέγεθος αυτής της συμβολοσειράς DWORD dwBytesWritten; // εδώ θα είναι ο αριθμός των byte που έχουν πραγματικά μεταφερθεί

Αποστολή συμβολοσειράς. Επιτρέψτε μου να σας υπενθυμίσω ότι το παράδειγμα είναι το πιο απλό, επομένως δεν κάνω ειδικούς ελέγχους:

BOOL iRet = WriteFile(hSerial,data,dwSize,&dwBytesWritten,NULL);

Αποφάσισα επίσης να εμφανίσω το μέγεθος συμβολοσειράς και τον αριθμό των byte που στάλθηκαν στον έλεγχο:

Cout<< dwSize << " Bytes in string. " << dwBytesWritten << " Bytes sended. " << endl;

Στο τέλος του προγράμματος, κάνουμε έναν άπειρο βρόχο δεδομένων ανάγνωσης:

while(1) ( ReadCOM(); ) return 0; )

Τώρα η συνάρτηση ανάγνωσης:

Void ReadCOM() ( DWORD iSize; char sReceivedChar; ενώ (true) (ReadFile(hSerial, &sReceivedChar, 1, &iSize, 0); // λάβετε 1 byte εάν (iSize > 0) // print cout αν ληφθεί κάτι<< sReceivedChar; } }

Αυτό είναι στην πραγματικότητα όλο το παράδειγμα.

Σχετικά με το πώς να αναπαραστήσετε όμορφα τα δεδομένα που αποστέλλονται από το Arduin στο Serial. Κατά τη γνώμη μου, τα παιδιά πρόσφεραν μια πολύ όμορφη λύση, η οποία αφενός φαίνεται αρκετά απλή και, αφετέρου, σας επιτρέπει να έχετε ένα εξαιρετικό αποτέλεσμα με ελάχιστη προσπάθεια.

Στα σχόλια του άρθρου, λυπήθηκε που μια τέτοια λύση δεν θα λειτουργούσε στον Firefox και εκφράστηκε η ιδέα ότι "μπορείτε ακόμα να γράψετε έναν απλό διακομιστή ιστού με έξοδο html με βάση αυτό το πράγμα." Αυτή η ιδέα με «γάντζωσε», μια γρήγορη αναζήτηση στο google δεν έδωσε έτοιμη λύση και αποφάσισα να υλοποιήσω την ιδέα μόνος μου. Και να τι προέκυψε από αυτό.

Προειδοποίηση! Η προτεινόμενη λύση σε καμία περίπτωση δεν πρέπει να θεωρείται ολοκληρωμένη. Σε αντίθεση με τον Serial Projector της Amperka, αυτό είναι ένα concept, μια επίδειξη μιας πιθανής προσέγγισης, ένα λειτουργικό πρωτότυπο και τίποτα περισσότερο.

Πριν από λίγο καιρό έκανα ένα έργο στο οποίο χρησιμοποίησα τα ενσωματωμένα επιταχυνσιόμετρα σε ένα smartphone Android για να ελέγξω τους σερβομηχανισμούς που είναι συνδεδεμένοι σε ένα Arduino. Στη συνέχεια, για αυτούς τους σκοπούς χρησιμοποίησα το Scripting Layer για έργα Android (SL4A) και RemoteSensors. Αποδεικνύεται ότι η τυπική βιβλιοθήκη της python περιλαμβάνει το πακέτο BaseHTTPServer, με το οποίο η ανάπτυξη μιας υπηρεσίας Ιστού στην python είναι μια εργασία σε μερικές γραμμές κώδικα.

Δεν υπήρχαν αισθητήρες για το Arduino στο χέρι, επομένως χρησιμοποίησα το εσωτερικό θερμόμετρο που ήταν ενσωματωμένο στο Arduino Uno ως πηγή των εμφανιζόμενων πληροφοριών. Από όσο καταλαβαίνω, δεν είναι πολύ ακριβές και δεν προορίζεται καθόλου για μέτρηση θερμοκρασίας περιβάλλοντος, αλλά θα κάνει για πρωτότυπα.

Μετά από ένα σύντομο γκουγκλάρισμα, εδώ είναι ένα σκίτσο για ένα arduino:

// πηγή: https://code.google.com/p/tinkerit/wiki/SecretThermometer long readTemp() ( μακρύ αποτέλεσμα; // Ανάγνωση αισθητήρα θερμοκρασίας έναντι αναφοράς 1,1V ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(MUX3); καθυστέρηση (2); // Περιμένετε να διευθετηθεί το Vref ADCSRA |= _BV(ADSC); // Convert while (bit_is_set(ADCSRA,ADSC)); αποτέλεσμα = ADCL; αποτέλεσμα |= ADCH<<8; result = (result - 125) * 1075; return result; } void setup() { Serial.begin(115200); } int count = 0; void loop() { String s = String(count++, DEC) + ": " + String(readTemp(), DEC); Serial.println(s) delay(1000); }
Αυτό το σκίτσο ανοίγει μια θύρα COM, τη θέτει σε 115200 baud και, στη συνέχεια, γράφει την τρέχουσα τιμή του ενσωματωμένου θερμομέτρου σε αυτήν κάθε δευτερόλεπτο. (Μη με ρωτάτε σε ποιες μονάδες δίνεται η θερμοκρασία - για την περιγραφόμενη εργασία δεν είναι σημαντικό). Επειδή η τιμή δεν αλλάζει πολύ ενεργά, για καλύτερη ορατότητα των αλλαγών δεδομένων, ο αριθμός γραμμής εμφανίζεται πριν από τη θερμοκρασία.

Για να ελέγξετε ότι ο διακομιστής web θα δώσει μόνο ολόκληρες γραμμές, και όχι μέρη τους, όπως διαβάζεται από τη θύρα COM, η γραμμή
Serial.println(s)
έχει αντικατασταθεί από
for(int i=0; i< s.length(); i++){ Serial.print(s.charAt(i)); delay(200); } Serial.println("");
εκείνοι. η σχηματιζόμενη συμβολοσειρά δεν εξάγεται στη σειριακή θύρα στο σύνολό της, αλλά χαρακτήρα προς χαρακτήρα, με παύσεις 200 ms.

Αρχικά, γράφτηκε ένα πολύ απλό πρωτότυπο διακομιστή web (κάτω αποσυναρμολογείται σε μέρη):
# -*- κωδικοποίηση: utf-8 -*- #-- με βάση: https://raw.githubusercontent.com/Jonty/RemoteSensors/master/remoteSensors.py SERIAL_PORT_NAME = "COM6" SERIAL_PORT_SPEED = 115200 WEB_8SERVER0_time = εισαγωγή , BaseHTTPServer, urlparse import serial ser = None def main(): global ser httpd = BaseHTTPServer.HTTPServer(("", WEB_SERVER_PORT), Handler) #-- λύση για τη λήψη διεύθυνσης IP στην οποία εξυπηρετείται υποδοχή εισαγωγής s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.co.uk", 80)) sData = s.getsockname() print "Serving at "%s:%s"" % (sData, WEB_SERVER_PORT) server = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0) httpd.serve_forever() class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # Απενεργοποίηση καταγραφής αναζητήσεις DNS def address_string(self): return str(self.client)(self.client) self.send_response(200) self.send_header("Content-type", "application/x-javascript; charset=utf-8") self.end_headers() try: while True: new_serial_line = get_full_line_from_serial() αν το new_serial_line δεν είναι κανένα : self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush() εκτός από το socket.error, e: εκτύπωση "Ο πελάτης αποσυνδέθηκε.\n" καταγράφηκε = "" def get_full_line_from_serial() : """ επιστρέφει πλήρη γραμμή από σειριακή ή Καμία Χρησιμοποιεί καθολικές μεταβλητές "ser" και "captured" """ global captured part = ser.readline() if part: captured += part parts = captured.split("\n" , 1); if len(parts) == 2: captured = εξαρτήματα επιστρέφουν εξαρτήματα Καμία εάν __name__ == "__main__": main()
Ας αναλύσουμε το σενάριο κομμάτι-κομμάτι.

Δεδομένου ότι πρόκειται για πρωτότυπο, όλες οι κύριες παράμετροι λειτουργίας (το όνομα της θύρας COM, η ταχύτητά της, καθώς και ο αριθμός της θύρας TCP στην οποία θα εκτελείται ο διακομιστής web) υποδεικνύονται απευθείας στο κείμενο προέλευσης:
SERIAL_PORT_NAME="COM6" SERIAL_PORT_SPEED=115200 WEB_SERVER_PORT=8000
Φυσικά, μπορείτε να κανονίσετε να διαβάσετε αυτές τις παραμέτρους από τη γραμμή εντολών. Για παράδειγμα, με τη βοήθεια της ενότητας argparse, αυτό γίνεται πολύ γρήγορα, απλά και ευέλικτα.

Σε αυτήν την περίπτωση, οι χρήστες των Windows πρέπει να μάθουν στη διαχείριση συσκευών το όνομα της θύρας COM στην οποία είναι συνδεδεμένο το Arduin. Για μένα ήταν "COM6". Οι χρήστες άλλων λειτουργικών συστημάτων πρέπει να χρησιμοποιούν τα εργαλεία του λειτουργικού τους συστήματος. Δεν έχω καθόλου εμπειρία με το MacOS και δεν δούλεψα ούτε με θύρες COM στο Linux, αλλά εκεί, πιθανότατα, θα είναι κάτι σαν "/dev/ttySn".

Στη συνέχεια ακολουθεί ο ορισμός μιας καθολικής μεταβλητής στην οποία θα δεσμευτεί μια παρουσία της κλάσης Serial, η οποία στην python είναι υπεύθυνη για την εργασία με τη θύρα COM:
ser = Κανένας
Στη γραμμή
httpd = BaseHTTPServer.HTTPSserver(("", WEB_SERVER_PORT), Handler)
δημιουργείται ένας διακομιστής web που θα ακούει για αιτήματα στην καθορισμένη θύρα WEB_SERVER_PORT. Και αυτά τα αιτήματα θα αντιμετωπίζονται από μια παρουσία της κλάσης Handler, που περιγράφεται παρακάτω.

Οι ακόλουθες γραμμές είναι ένα μικρό "hack" για την εμφάνιση της διεύθυνσης IP στην οποία εκτελείται πραγματικά ο διακομιστής web που λειτουργεί:
#-- λύση για τη λήψη της διεύθυνσης IP στην οποία εξυπηρετείται υποδοχή εισαγωγής s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.co.uk", 80)) sData = s.getsockname() εκτύπωση "Προβολή στο "%s:%s"" % (sData, WEB_SERVER_PORT)
Από όσο καταλαβαίνω, δεν υπάρχει άλλος τρόπος να μάθω αυτήν την IP. Και χωρίς αυτή τη γνώση, πώς θα έχουμε πρόσβαση στον διακομιστή μας από το πρόγραμμα περιήγησης;

Επομένως, πρέπει να ανοίξετε μια υποδοχή και να συνδεθείτε στον ιστότοπο της Google για να εξαγάγετε πληροφορίες σχετικά με τη δική σας διεύθυνση IP από τα χαρακτηριστικά αυτής της υποδοχής.

Λίγο πιο κάτω, ανοίγει η θύρα COM και εκκινείται ο διακομιστής ιστού:
ser = serial.Serial(SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0) httpd.serve_forever()
Αυτό ακολουθείται από μια περιγραφή της κλάσης που είναι υπεύθυνη για την επεξεργασία των αιτημάτων που λαμβάνονται από τον διακομιστή web που λειτουργεί:
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
Πρόκειται για έναν κληρονόμο της κλάσης που είναι ενσωματωμένη στη λειτουργική μονάδα BaseHTTPServer, στην οποία αρκεί να παρακάμψετε μόνο τη μέθοδο do_GET

Δεδομένου ότι αυτό εξακολουθεί να είναι πρωτότυπο, ο διακομιστής θα είναι «ευτυχισμένος» με οποιοδήποτε αίτημα - ανεξάρτητα από το ποια διεύθυνση URL ζητείται από αυτόν, θα δώσει στον πελάτη όλα τα δεδομένα που διαβάζονται από τη θύρα COM. Επομένως, στο Handler.do_GET, αποκρίνεται αμέσως με έναν κωδικό επιτυχίας και τις απαραίτητες κεφαλίδες:
self.send_response(200) self.send_header("Content-type", "application/x-javascript; charset=utf-8") self.end_headers()
μετά από τον οποίο εκκινείται ένας άπειρος βρόχος, στον οποίο γίνεται προσπάθεια ανάγνωσης μιας ολόκληρης γραμμής από τη θύρα COM και, εάν αυτή η προσπάθεια ήταν επιτυχής, μεταφέρεται στον πελάτη web:
ενώ True: new_serial_line = get_full_line_from_serial() εάν η new_serial_line δεν είναι None: self.wfile.write(new_serial_line) self.wfile.write("\n") self.wfile.flush()
Στο έργο που ελήφθη ως βάση, αυτός ο άπειρος βρόχος «τυλίχθηκε» σε μια προσπάθεια ... εκτός από το μπλοκ, με τη βοήθεια του οποίου υποτίθεται ότι θα χειριζόταν προσεκτικά τη διακοπή της σύνδεσης. Ίσως στο Android (το βασικό έργο αναπτύχθηκε για αυτό), αυτό λειτουργεί καλά, αλλά δεν μου λειτούργησε στα Windows XP - όταν η σύνδεση διακόπηκε, προέκυψε κάποια άλλη εξαίρεση, την οποία δεν έμαθα ποτέ πώς να υποκλέψω. Αλλά, ευτυχώς, αυτό δεν εμπόδισε τον διακομιστή ιστού να λειτουργήσει κανονικά και να αποδεχτεί τα ακόλουθα αιτήματα.

Η λειτουργία λήψης μιας ολόκληρης συμβολοσειράς από μια θύρα COM λειτουργεί με την ίδια αρχή με τους δημιουργούς του Serial Projector:

  • υπάρχει κάποιο παγκόσμιο buffer που αποθηκεύει όλα όσα διαβάζονται από τη θύρα COM
  • κάθε φορά που καλείται η συνάρτηση, προσπαθεί να διαβάσει κάτι από τη θύρα COM
  • αν τα καταφέρει, τότε
    • προσθέτει αυτό που μόλις διαβάστηκε στο καθορισμένο καθολικό buffer
    • προσπαθεί να χωρίσει το καθολικό buffer σε δύο το πολύ μέρη με τον χαρακτήρα τέλους γραμμής
    • αν πετύχει, τότε επιστρέφει το πρώτο μέρος στη διαδικασία κλήσης και χρησιμοποιεί το δεύτερο μέρος ως νέα τιμή του καθολικού buffer
  • Εάν δεν υπάρχουν νέα δεδομένα στη θύρα COM ή δεν βρεθεί ο χαρακτήρας τέλους γραμμής, τότε η συνάρτηση επιστρέφει None:
captured = "" def get_full_line_from_serial(): """ επιστρέφει πλήρη γραμμή από σειριακή ή None Χρησιμοποιεί καθολικές μεταβλητές "ser" και "captured" """ global captured part = ser.readline() εάν part: captured += part part = captured.split("\n", 1); αν len(parts) == 2: captured = εξαρτήματα επιστρέφουν εξαρτήματα επιστρέφουν Κανένα
Ως αποτέλεσμα, αποδείχθηκε ως εξής:

Μπορεί να φανεί ότι στο πρόγραμμα περιήγησης εμφανίζονται γραμμές που διαβάζονται από τη θύρα COM. Δεν καταλαβαίνω τίποτα για το web frontend: JavaScript, Ajax, CSS και DOM είναι ένα σκοτεινό δάσος για μένα. Αλλά μου φαίνεται ότι για προγραμματιστές που δημιουργούν διεπαφές ιστού, αυτό θα πρέπει να είναι αρκετό για να μετατρέψει αυτήν την έξοδο στην ίδια όμορφη εικόνα που παράγει ο Σειριακός Προβολέας της Amperka. Κατά τη γνώμη μου, το καθήκον είναι να δημιουργήσετε ένα σενάριο Javascript που έχει πρόσβαση στον διακομιστή ιστού, διαβάζει μια ροή από αυτόν και εξάγει την τελευταία γραμμή που διαβάστηκε στη σωστή θέση στην ιστοσελίδα.

Για κάθε ενδεχόμενο, αποφάσισα να το παίξω με ασφάλεια και προσπάθησα να κάνω την πρώτη προσέγγιση μόνη μου. Μια όχι πολύ βαθιά αναζήτηση στο Google πρότεινε ότι, στην πραγματικότητα, για τέτοιους σκοπούς, χρησιμοποιήθηκαν τουλάχιστον WebSockets ή Συμβάντα που απεστάλησαν από διακομιστή. Βρήκα αυτό που μου φάνηκε καλή χρήση των Συμβάντων που απεστάλησαν από διακομιστή και αποφάσισα να χρησιμοποιήσω αυτήν την τεχνολογία.

Σημείωση! Αυτή δεν φαίνεται να είναι η καλύτερη λύση, επειδή αυτή η τεχνολογία δεν λειτούργησε στον Internet Explorer 8, ούτε στο πρόγραμμα περιήγησης που είναι ενσωματωμένο στο Android 2.3.5. Αλλά δούλεψε τουλάχιστον στον Firefox 39.0, οπότε δεν «σκάψω» περισσότερο.

Από την άποψη του σεναρίου python, οι αλλαγές στα Συμβάντα που απεστάλησαν από διακομιστή είναι εντελώς μικρές:

  • είναι απαραίτητο να αντικατασταθεί ο τύπος των δεδομένων που δίνονται στον πελάτη:
    γραμμή
    self.send_header("Content-type", "application/x-javascript; charset=utf-8")
    αντικαταστάθηκε από
    self.send_header("Content-type", "text/event-stream")
  • και επίσης πριν από τη γραμμή ανάγνωσης από τη θύρα COM, εισαγάγετε το πρόθεμα "data:" και προσθέστε έναν ακόμη χαρακτήρα νέας γραμμής:
    γραμμές
    self.wfile.write(new_serial_line) self.wfile.write("\n")
    αντικαταστάθηκε από
    self.wfile.write("data: " + new_serial_line) self.wfile.write("\n\n")

Όλα τα άλλα θα μπορούσαν πιθανώς να παραμείνουν αμετάβλητα, αλλά...

Αρχικά, δημιούργησα ένα αρχείο index.html με το ακόλουθο περιεχόμενο:

επί κεφαλής


Το πιο ενδιαφέρον σε αυτό είναι η γραμμή
που σχηματίζει ένα μέρος για την έξοδο της επόμενης γραμμής από τη θύρα COM και ένα σενάριο Javascript

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

Σκόπευα να ανοίξω αυτό το αρχείο σε ένα πρόγραμμα περιήγησης, για παράδειγμα, από δίσκο ή από κάποιον άλλο διακομιστή ιστού, αλλά αυτό δεν λειτούργησε: κατά το άνοιγμα μιας σελίδας από το δίσκο, το σενάριο javascript μόλις είχε πρόσβαση στον εκτελούμενο διακομιστή ιστού Python και αποσυνδέθηκε αμέσως. Δεν κατάλαβα γιατί συνέβαινε αυτό και πρότεινα ότι αυτό μπορεί να είναι κάποιο είδος προστασίας του προγράμματος περιήγησης από διάφορες επιθέσεις. Μάλλον δεν του αρέσει που η ίδια η σελίδα ανοίγει από μια πηγή και το σενάριο διαβάζει δεδομένα από άλλη πηγή.

Ως εκ τούτου, αποφασίστηκε να αλλάξει ο διακομιστής ιστού Python ώστε να εξυπηρετεί και αυτή τη σελίδα html. Τότε θα αποδεικνυόταν ότι τόσο η σελίδα όσο και η ροή διαβάζονται από την ίδια πηγή. Δεν ξέρω αν η υπόθεσή μου σχετικά με την ασφάλεια αποδείχθηκε σωστή ή κάτι άλλο, αλλά με αυτήν την εφαρμογή, όλα λειτούργησαν όπως θα έπρεπε.

Φυσικά, χρειάζεται μόνο να αλλάξετε την κλάση χειριστή αιτημάτων Handler:
class Handler(BaseHTTPServer.BaseHTTPRequestHandler): # Απενεργοποίηση καταγραφής αναζητήσεις DNS def address_string(self): return str(self.client_address) def do_GET(self): if self.path == "/" or self.path == "/index .html": self.process_index() elif self.path == "/get_serial": self.process_get_serial() else: self.process_unknown() def process_index(self): self.send_response(200) self.send_header("Περιεχόμενο -type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(open("index.html").read()) self.wfile.write("\n\ n") self.wfile.flush() def process_get_serial(self): self.send_response(200) self.send_header("Content-type", "text/event-stream") self.end_headers() try: while True: new_serial_line = get_full_line_from_serial() εάν το new_serial_line δεν είναι None: self.wfile.write("data: " + new_serial_line) self.wfile.write("\n\n") self.wfile.flush() εκτός από το socket.error, π.χ. : εκτύπωση "Ο πελάτης αποσυνδέθηκε.\n" def process_unknown(self): self.send_response(404)
Αυτή η επιλογή προϋποθέτει ότι ο διακομιστής ιστού θα ανταποκριθεί μόνο σε δύο αιτήματα: "/index.html" (δίνοντας τον κώδικα html της σελίδας) και "/get_serial" (παρέχοντας μια ατελείωτη ροή συμβολοσειρών που διαβάζονται από τη θύρα COM). Όλα τα άλλα αιτήματα θα απαντηθούν με κωδικό 404.

Εφόσον το index.html εξυπηρετείται από τον διακομιστή ιστού Python, μπορεί να τροποποιηθεί ελαφρώς καθορίζοντας μια σχετική αντί για την απόλυτη διεύθυνση της ροής συμβολοσειράς από τη θύρα COM:
σειρά
var source = new EventSource ("http://192.168.1.207:8000/")
αντικαταστάθηκε από
var source = new EventSource("/get_serial")
Ως αποτέλεσμα, αποδείχθηκε ως εξής:

Εδώ αποφάσισα να σταματήσω. Μου φαίνεται ότι ο όμορφος σχεδιασμός μιας σελίδας θα πρέπει να είναι ήδη αρκετά απλός. Αλλά δεν είμαι ικανός σε HTML ή CSS, οπότε αφήστε κάποιον άλλο να το κάνει. Είδα το καθήκον μου να δείξω ότι η δημιουργία μιας υπηρεσίας web που στέλνει δεδομένα από μια θύρα COM, φαίνεται, δεν είναι καθόλου δύσκολη.

Επαναλαμβάνω για άλλη μια φορά: ο παρουσιαζόμενος κώδικας δεν είναι μια ολοκληρωμένη λύση που μπορεί να «τεθεί σε παραγωγή». Αυτό είναι μόνο ένα πρωτότυπο, το οποίο δείχνει μια θεμελιώδη προσέγγιση για την επίλυση του προβλήματος.

Τι άλλο μπορεί να εργαστεί:

  • Πρώτον, η ανάγνωση δεδομένων από τη θύρα COM στο σενάριο της python γίνεται πολύ "αδέξια" - στην πραγματικότητα, υπάρχει μια συνεχής δημοσκόπηση "υπάρχει κάτι φρέσκο;". Αυτή η προσέγγιση, φυσικά, φορτώνει τον επεξεργαστή και ένας πυρήνας στον υπολογιστή μου είναι 100% κατειλημμένος.
    Μια ανάγνωση αποκλεισμού με χρονικό όριο μπορεί να χρησιμοποιηθεί ως λύση. Για να γίνει αυτό, αρκεί να ορίσετε μια μη μηδενική τιμή (σε δευτερόλεπτα) ως χρονικό όριο κατά το άνοιγμα μιας θύρας COM, για παράδειγμα:
    ser = serial.Serial (SERIAL_PORT_NAME, SERIAL_PORT_SPEED, timeout=0,03)
    Επιπλέον, στην περιγραφή της μονάδας pySerial, υπάρχουν τρία παραδείγματα δημιουργίας μιας γέφυρας: "TCP/IP - σειριακή γέφυρα", "TCP/IP μίας θύρας - σειριακή γέφυρα (RFC 2217)" και "TCP πολλαπλών θυρών /IP - σειριακή γέφυρα (RFC 2217)" - μπορείτε να δείτε πώς οι επαγγελματίες επιλύουν τέτοια προβλήματα.
  • Δεύτερον, μόνο ένας πελάτης μπορεί να λάβει δεδομένα. Μέχρι να κλείσει η σελίδα στον πρώτο πελάτη, δεν μπορείτε να συνδεθείτε σε αυτόν τον διακομιστή και να λάβετε τιμές στον δεύτερο υπολογιστή. Από τη μία πλευρά, αυτό είναι μάλλον σωστό: υπάρχει μόνο μία θύρα COM και υπάρχουν αρκετοί καταναλωτές - ποιος από αυτούς θα πρέπει να δώσει τη γραμμή ανάγνωσης; Εάν πιστεύετε ότι η απάντηση σε αυτή την ερώτηση πρέπει να είναι "όλοι", τότε εδώ είναι οι σκέψεις μου για το θέμα. Μου φαίνεται ότι το πρόβλημα δεν μπορεί να λυθεί μόνο με τη χρήση ενός "τίμιου" διακομιστή web πολλαπλών νημάτων (για παράδειγμα, κάποιου Tornado ή Flask), ο οποίος μπορεί να εξυπηρετεί αιτήματα από πολλούς πελάτες Ιστού ταυτόχρονα. Επειδή δεν μπορείτε να ανοίξετε μια θύρα COM από κάθε νήμα και να διαβάσετε από αυτό - σε αυτήν την περίπτωση, τα δεδομένα από τη θύρα COM θα μεταβούν μόνο σε ένα νήμα / διεργασία. Επομένως, κατά τη γνώμη μου, είναι απαραίτητο να χωρίσουμε το τμήμα διακομιστή σε δύο μέρη:
    • Διακομιστής zmq που λειτουργεί με θύρα COM, διαβάζει γραμμές από αυτήν και τις στέλνει μέσω υποδοχής PUB σε όλους τους ενδιαφερόμενους καταναλωτές
    • Ο διακομιστής ιστού python αντί να συνδέεται στη θύρα COM, συνδέεται με διακομιστή zmq και λαμβάνει δεδομένα από αυτόν
    Εάν δεν είστε εξοικειωμένοι με τη βιβλιοθήκη ZMQ (ZeroMQ), τότε μπορείτε να χρησιμοποιήσετε κανονικές υποδοχές TCP / IP ή UDP, αλλά θα συνιστούσα ανεπιφύλακτα να εξοικειωθείτε με το ZMQ, επειδή αυτή η βιβλιοθήκη διευκολύνει την επίλυση τέτοιων προβλημάτων. Μου φαίνεται ότι με τη βοήθεια του ZMQ, η λύση θα χωρέσει το πολύ σε 20 γραμμές. (Δεν μπορώ να αντισταθώ στο γράψιμο: ακόμα κι αν δεν σκοπεύετε να επιλύσετε την εργασία που περιγράφεται, αλλά η εργασία σας σχετίζεται με προγραμματισμό πολλαπλών νημάτων / πολλαπλών διεργασιών με ανταλλαγή δεδομένων μεταξύ νημάτων / διεργασιών, ρίξτε μια πιο προσεκτική ματιά σε αυτήν τη βιβλιοθήκη - ίσως αυτό είναι αυτό για το οποίο ονειρευόσασταν τόσο καιρό)
  • η ροή δεδομένων εξακολουθεί να είναι μονής κατεύθυνσης - από τη θύρα COM στο πρόγραμμα περιήγησης Ιστού. Δεν μπορείτε ακόμη να στείλετε δεδομένα από το πρόγραμμα περιήγησης στο Arduino. Μου φαίνεται ότι αυτό το έργο δεν είναι επίσης πολύ δύσκολο και, σε αντίθεση με το προηγούμενο, μπορεί να λυθεί μόνο
    • χρησιμοποιώντας έναν διακομιστή πολλαπλών νημάτων
    • βελτίωση της μεθόδου Handler.do_GET ώστε να δέχεται αιτήματα GET με παραμέτρους και να στέλνει τις τιμές ορισμένων από αυτές στη θύρα COM
    Κατά τη γνώμη μου, αν θέλετε να γράψετε ένα πλήρες αναλογικό της οθόνης σειριακής θύρας που βασίζεται στο web που είναι ενσωματωμένη στο Arduino IDE, δεν είναι τόσο δύσκολο. Προσωπικά, για τον εαυτό μου, βλέπω τη δυσκολία μόνο στη δημιουργία ενός κανονικού frontend.
  • δεν είναι ακόμη δυνατό να ορίσετε το όνομα της θύρας COM και τις παραμέτρους λειτουργίας της μέσω του προγράμματος περιήγησης. Από τη μια πλευρά, αυτό φαίνεται λογικό: πώς μπορεί ένας χρήστης στην άλλη πλευρά του πλανήτη μας να γνωρίζει ποια θύρα COM και με ποια ταχύτητα είναι συνδεδεμένο το arduino; Αλλά ο διακομιστής ιστού Python που τρέχει στον ίδιο υπολογιστή ξέρει σίγουρα. Αλλά εάν εξακολουθείτε να είναι επιθυμητό να δίνετε στον χρήστη την ευκαιρία να αλλάξει το όνομα της θύρας COM ή τις παραμέτρους της λειτουργίας της, τότε και πάλι αυτό μπορεί να λυθεί εύκολα με τη βελτίωση της μεθόδου Handler.do_GET
  • python απαιτείται για την εκτέλεση του διακομιστή. Αυτό γενικά δεν είναι δύσκολο, αλλά αν για κάποιο λόγο αυτό δεν μπορεί να γίνει ή δεν το θέλετε, τότε το pyInstaller μπορεί να έρθει στη διάσωση. Με αυτό, το σενάριο Python μπορεί να μεταγλωττιστεί σε ένα εκτελέσιμο αρχείο (στην περίπτωση των Windows - σε .exe), το οποίο είναι εύκολο να αντιγραφεί στον υπολογιστή στον οποίο είναι συνδεδεμένο το arduino.
    Ίσως η καλύτερη λύση θα ήταν να χρησιμοποιήσετε τη γλώσσα Go σε αυτή την περίπτωση. Από όσο ξέρω λύνει καλύτερα το πρόβλημα δημιουργίας αρχείου για "διανομή".
Συμπερασματικά: μπορεί να προκύψει το ερώτημα: «δεν είναι πιο εύκολο να λυθεί αυτό το πρόβλημα μέσω κάποιου έτοιμου cloud;». Γιατί να μην δημοσιεύσετε δεδομένα με δυνατότητα ανάγνωσης από μια θύρα COM στο cloud και στους πελάτες απλώς να έχουν πρόσβαση στην αντίστοιχη υπηρεσία στο cloud; Πιθανώς, μια τέτοια λύση έχει επίσης το δικαίωμα να υπάρχει, αλλά πριν από την εφαρμογή μιας τέτοιας λύσης, πρέπει να απαντηθούν τα ακόλουθα ερωτήματα:
  • Υπάρχουν έτοιμες υπηρεσίες web που μου επιτρέπουν να δημοσιεύω δεδομένα με την ταχύτητα / συχνότητα που χρειάζομαι; Υπάρχουν δωρεάν ανάμεσά τους ή είστε έτοιμοι να πληρώσετε τα ανάλογα χρήματα;
  • Είστε έτοιμοι για το γεγονός ότι σε περίπτωση πτώσης του cloud ή σύνδεσης με αυτό, θα μείνετε χωρίς δεδομένα
  • Δεν σε ενοχλεί που για να μεταφέρουν δεδομένα από το ένα δωμάτιο στο άλλο θα διασχίσουν τον ωκεανό ή τη μισή ήπειρο δύο φορές;

Φτάσαμε λοιπόν στη θύρα COM. Αλλά με αυτό, όλα δεν είναι τόσο απλά όσο με το LPT και η πλήρης χρήση του θα απαιτήσει πολύ περισσότερη προσπάθεια. Το κύριο εμπόδιο είναι το κύριο πλεονέκτημά του - μεταφορά δεδομένων σε σειριακή μορφή. Εάν στο LPT ένα byte δεδομένων μεταδίδεται σε 8 γραμμές, ένα bit η καθεμία, και η κατάσταση κάθε γραμμής μπορούσε εύκολα να προβληθεί, τότε σε μια θύρα COM, τα byte δεδομένων μεταδίδονται κομμάτι προς bit κατά μήκος μιας γραμμής (σε σχέση με τη γείωση, φυσικά ) και δείτε τι μεταδίδεται μόνο από τα LED δεν θα λειτουργήσει. Για να γίνει αυτό, χρειάζεστε μια ειδική συσκευή - έναν μετατροπέα της σειριακής ροής δεδομένων σε παράλληλη, το λεγόμενο. USART (Universal Synchronous/Asynchronous Receiver Transmitter). Για παράδειγμα, περιλαμβάνεται στη μητρική πλακέτα υπολογιστή εξοπλισμένου με θύρα COM, σε οποιονδήποτε σοβαρότερο μικροελεγκτή.


Ελπίζω να είστε ακόμα αποθαρρυμένοι στο mastering της θύρας COM. Δεν είναι όλα τόσο ζοφερά. Μερικά αποτελέσματα μπορούν να ληφθούν χωρίς USART. Ας διαμορφώσουμε την εργασία που υλοποιούμε στο αρχικό στάδιο της εργασίας με τη θύρα COM:


"Θέλω να συνδεθεί ένα LED στον υπολογιστή μέσω της θύρας COM. Εκκινώ το πρόγραμμα. Κάνω κάποια ενέργεια σε αυτό το πρόγραμμα, το LED ανάβει, κάνω κάτι άλλο - το LED σβήνει."


Το έργο είναι αρκετά συγκεκριμένο (δεδομένου ότι το USART δεν χρησιμοποιείται) και είναι καθαρά «αυτοδημιούργητο», αλλά είναι αρκετά εφικτό και εφαρμόσιμο. Ας αρχίσουμε να το εφαρμόζουμε.


Θύρα 1.COM

Και πάλι, παίρνουμε τη μονάδα συστήματος του υπολογιστή σας και κοιτάμε το πίσω μέρος. Σημειώνουμε εκεί μια υποδοχή 9 ακίδων - αυτή είναι η θύρα COM. Στην πραγματικότητα, μπορεί να υπάρχουν πολλά (έως 4). Ο υπολογιστής μου έχει δύο θύρες COM (βλ. φωτογραφία).


2. Επέκταση θύρας COM


3. Υλικό

Θα πρέπει επίσης να «τσιμπολογήσουμε» με το κομμάτι του υλικού, με την έννοια ότι θα είναι πιο δύσκολο από ότι με την πρώτη συσκευή για τη θύρα LPT. Το γεγονός είναι ότι το πρωτόκολλο RS-232, μέσω του οποίου ανταλλάσσονται δεδομένα στη θύρα COM, έχει μια ελαφρώς διαφορετική αναλογία λογικής κατάστασης - τάσης. Εάν συνήθως είναι λογικό 0 0 V, λογικό 1 +5 V, τότε στο RS-232 αυτή η αναλογία είναι η εξής: λογική 0 +12 V, λογική 1 -12 V.

Και για παράδειγμα, έχοντας λάβει -12 V, δεν είναι αμέσως σαφές τι να κάνετε με αυτήν την τάση. Συνήθως, τα επίπεδα RS-232 μετατρέπονται σε TTL (0,5 V). Η ευκολότερη επιλογή είναι οι δίοδοι zener. Αλλά προτείνω να φτιάξω αυτόν τον μετατροπέα σε ένα ειδικό μικροκύκλωμα. Ονομάζεται MAX232.

Ας δούμε τώρα, τι σήματα από τη θύρα COM μπορούμε να δούμε στα LED; Στην πραγματικότητα, υπάρχουν έως και 6 ανεξάρτητες γραμμές στη θύρα COM που ενδιαφέρουν τον προγραμματιστή συσκευών διασύνδεσης. Δύο από αυτά δεν είναι ακόμη διαθέσιμα σε εμάς - σειριακές γραμμές δεδομένων. Όμως τα υπόλοιπα 4 έχουν σχεδιαστεί για να ελέγχουν και να υποδεικνύουν τη διαδικασία μεταφοράς δεδομένων και θα μπορούμε να τα «μεταφέρουμε» ανάλογα με τις ανάγκες μας. Δύο από αυτά έχουν σχεδιαστεί για να ελέγχονται από μια εξωτερική συσκευή και δεν θα τα αγγίξουμε προς το παρόν, αλλά θα χρησιμοποιήσουμε τις δύο τελευταίες γραμμές που απομένουν τώρα. Ονομάζονται:

  • RTS- Αίτημα μεταφοράς. Μια γραμμή αλληλεπίδρασης που υποδεικνύει ότι ο υπολογιστής είναι έτοιμος να λάβει δεδομένα.
  • DTR- Ο υπολογιστής είναι έτοιμος. Γραμμή αλληλεπίδρασης, η οποία υποδεικνύει ότι ο υπολογιστής είναι ενεργοποιημένος και έτοιμος για επικοινωνία.

Τώρα περνάμε λίγο τον σκοπό τους και τα LED που συνδέονται με αυτά είτε θα σβήσουν είτε θα ανάψουν, ανάλογα με τις ενέργειες στο δικό μας πρόγραμμα.

Λοιπόν, ας συγκεντρώσουμε ένα σχέδιο που θα μας επιτρέψει να πραγματοποιήσουμε τις προβλεπόμενες ενέργειες.

Και εδώ είναι η πρακτική εφαρμογή του. Νομίζω ότι θα με συγχωρήσετε που το έφτιαξα σε μια τόσο ανόητη έκδοση breadboard, γιατί δεν θέλω να φτιάξω μια πλακέτα για ένα τόσο "υψηλά παραγωγικό" κύκλωμα.


4. Μέρος λογισμικού

Όλα είναι πιο γρήγορα εδώ. Ας δημιουργήσουμε μια εφαρμογή Windows στο Microsoft Visual C++ 6.0 με βάση το MFC για τη διαχείριση δύο γραμμών επικοινωνίας μιας θύρας COM. Για να το κάνετε αυτό, δημιουργήστε ένα νέο έργο MFC και δώστε του ένα όνομα, για παράδειγμα, TestCOM. Στη συνέχεια, επιλέγουμε την επιλογή της οικοδόμησης με βάση το διάλογο.

Δίνουμε την εμφάνιση του πλαισίου διαλόγου του προγράμματός μας, όπως στην εικ. παρακάτω, δηλαδή προσθέστε τέσσερα κουμπιά, δύο για κάθε μία από τις γραμμές. Το ένα, αντίστοιχα, είναι απαραίτητο για να «εξοφλήσει» τη γραμμή, το άλλο για να το «σετάρει» στο ένα.

Κλάση CTestCOMDlg: δημόσιος διάλογος CD ( // Δημόσιο κατασκευής: CTestCOMDlg(CWnd* pParent = NULL); // τυπικός κατασκευαστής HANDLE hFile;

Για να διαχειριστεί το πρόγραμμά μας τις γραμμές της θύρας COM, πρέπει πρώτα να ανοίξει. Ας γράψουμε τον κώδικα που είναι υπεύθυνος για το άνοιγμα της θύρας όταν φορτωθεί το πρόγραμμα.

HFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("Αποτυχία ανοίγματος θύρας!", "Σφάλμα", MB_ICONERROR); ) else (MessageBox("Η θύρα άνοιξε με επιτυχία", "Ok", MB_OK); )

Χρησιμοποιώντας την τυπική λειτουργία Win API CreateFile()ανοίξτε τη θύρα COM COM2. Στη συνέχεια, ελέγχουμε την επιτυχία του ανοίγματος με την έξοδο ενός ενημερωτικού μηνύματος. Εδώ είναι απαραίτητο να κάνουμε μια σημαντική παρατήρηση: Το COM2 βρίσκεται στον υπολογιστή μου και στον υπολογιστή σας θα μπορούσατε να το συνδέσετε σε άλλη θύρα COM. Κατά συνέπεια, το όνομά του πρέπει να αλλάξει σε ποια θύρα χρησιμοποιείτε. Για να δείτε ποιοι αριθμοί θύρας υπάρχουν στον υπολογιστή σας, μπορείτε να το κάνετε: Έναρξη -> Ρυθμίσεις -> Πίνακας Ελέγχου -> Σύστημα -> Υλικό -> Διαχείριση Συσκευών -> Θύρες (COM και LPT).

Τέλος, η συνάρτηση CTestCOMDlg::OnInitDialog()που βρίσκεται στο αρχείο TestCOMDlg.cpp, η τάξη διαλόγου μας θα πρέπει να έχει τη μορφή:

BOOL CTestCOMDlg::OnInitDialog() ( CDialog::OnInitDialog(); // Προσθήκη στοιχείου μενού "About..." στο μενού συστήματος. // IDM_ABOUTBOX πρέπει να βρίσκεται στην περιοχή εντολών συστήματος. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); ) ) // Ορίστε το εικονίδιο για αυτό το παράθυρο διαλόγου. Το πλαίσιο το κάνει αυτό αυτόματα // όταν το κύριο παράθυρο της εφαρμογής δεν είναι διάλογος SetIcon(m_hIcon, TRUE); // Ορισμός μεγάλου εικονιδίου SetIcon(m_hIcon, FALSE); // Ορισμός μικρού εικονιδίου // TODO: Προσθήκη επιπλέον αρχικοποίησης εδώ hFile = CreateFile("COM2", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if(hFile==INVALID_HANDLE_VALUE) ( MessageBox("Αποτυχία ανοίγματος θύρας!", "ONERR other" MB); ( MessageBox("Η θύρα άνοιξε με επιτυχία", "Ok", MB_OK); ) επιστρέψτε TRUE; // επιστρέψτε TRUE εκτός εάν ορίσετε την εστίαση σε ένα στοιχείο ελέγχου )

Τώρα ας προσθέσουμε χειριστές κουμπιών ελέγχου γραμμής. Τους έδωσα τα κατάλληλα ονόματα: η συνάρτηση που ορίζει τη γραμμή DTR σε 1 είναι OnDTR1(), 0 είναι OnDTR0(). Για τη γραμμή RTS, αντίστοιχα, με παρόμοιο τρόπο. Να σας υπενθυμίσω ότι ο χειριστής δημιουργείται όταν κάνετε διπλό κλικ στο κουμπί. Ως αποτέλεσμα, αυτές οι τέσσερις συναρτήσεις θα πρέπει να έχουν τη μορφή:

Void CTestCOMDlg::OnDTR1() ( // TODO: Προσθέστε τον κωδικό χειρισμού ειδοποιήσεων ελέγχου εδώ EscapeCommFunction(hFile, 6); ) void CTestCOMDlg::OnDTR0() ( // TODO: Προσθέστε τον κωδικό χειριστή ειδοποιήσεων ελέγχου εδώ EscapeCommFunction(hFile, 5). EscapeCommFunction(hFile, 3);

Επιτρέψτε μου να εξηγήσω λίγο πώς λειτουργούν. Όπως μπορείτε να δείτε, μέσα περιέχουν μια κλήση στην ίδια λειτουργία Win API EscapeCommFunction()με δύο επιλογές. Το πρώτο από αυτά είναι μια λαβή (HANDLE) σε μια ανοιχτή θύρα, η δεύτερη είναι ένας ειδικός κωδικός ενέργειας που αντιστοιχεί στην απαιτούμενη κατάσταση της γραμμής.

Τα πάντα, μεταγλώττιση, εκτέλεση. Εάν όλα είναι καλά, θα πρέπει να δείτε ένα μήνυμα σχετικά με το επιτυχές άνοιγμα της θύρας. Περαιτέρω, πατώντας τα αντίστοιχα κουμπιά, αναβοσβήνουμε τα LED που είναι συνδεδεμένα στη θύρα COM.

© Ιβάνοφ Ντμίτρι
Δεκέμβριος 2006