Αρχικό μήνυμα από
billtech
Οποιος θέλει ...
Για αρχή γράφω ένα "σκονάκι για το διαγώνισμα" και όχι την πραγματική λύση γιατί πέρασαν 10+ χρόνια από τότε που έγραφα σε VB, οπότε υπομονή! Ελπίζω κάποιος πιο φρέσκος να συνεχίσει τα σχόλια στην σωστή κατεύθυνση.
Για να στείλεις δεδομένα από ένα μC στο PC, καλό είναι να τα φτιάξεις "πακέτα με header" γνωρίζοντας από πριν το μέγεθος. Στο παράδειγμά μου θεωρώ ότι θα στείλεις 10 χαρακτήρες ASCII (00h-FFh) μετά από το header $#, δηλαδή αν θέλεις να στείλεις την πληροφορία "1234567890" η σειριακή έξοδος του μC θα δώσει "$#1234567890".
Δεν γνωρίζω την ικανότητά σου σε προγραμματισμό VB. Αν είσαι "αρχάριος", ανέβασε λίγο γνωστικό επίπεδο πριν ασχοληθείς με την σειριακή επικοινωνία. Θεωρώντας ότι κατέχεις τα βασικά και έχεις δημιουργήσει την γενική φόρμα (λ.χ. xyzForm). Θα προσθέσεις το module MSCOMM32.OCX (σειριακή επικοινωνία) και θα έχεις δημιουργήσει ένα συμβάν για να τρέξει η ρουτίνα του παραδείγματος με κουμπί για "click" όπως έχω εγώ [τρέχει το Command1_Click()] ή θα βάλεις ένα timer να trig-άρει αυτόματα.
Για να είσαι σίγουρος ότι λειτουργεί ο κορμός του προγράμματος (ή μια συγκεκριμένη ρουτίνα), βάλε κάπου ένα αθροιστή τον οποίο θα τυπώνεις σε ένα textbox με το πέρασμα από το σημείο ελέγχου. Εφόσον αυτά λειτουργήσουν, τότε θα προσθέσεις τη διαδικασία ανάγνωσης σειριακής πόρτας.
Ο κώδικας παρακάτω ασχολείται με το να λαμβάνει όλους τους χαρακτήρες της σειριακής σε string, ψάχνει για το header $# και εφόσον έρθουν συνολικά 10+2=12 χαρακτήρες τους δίνει για εμφάνιση στο textbox "showRXtext". Στις παραμέτρους της "MSCommLib.MSComm" έλεγξε ότι έχεις DTREnable=0 (φαίνεται ως 1η παράγραφος στο παράδειγμα). Μετά φαίνεται ο ορισμός του textbox "showRXtext" (εσύ θα τα ρυθμίσεις στο γραφικό περιβάλλον από τις επιλογές/μενού).
Αρχικοποίηση της σειριακής γίνεται στο "φόρτωμα" της φόρμας (baudrate, κ.λπ. και άνοιγμα πόρτας) ενώ με το τέλος της φόρμας "κλείνει" η σειριακή πόρτα.
Κώδικας:
Begin MSCommLib.MSComm MSComm1
DTREnable = 0 'Fals
End
Begin VB.TextBox showRXtext
BeginProperty Font
Name = "MS Sans Serif"
Size = 9.75
Charset = 161
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 375
Left = 2040
TabIndex = 2
Text = "----------"
Top = 0
Width = 1215
End
Private Sub Command1_Click()
Dim RxDATA As String
Dim HeaderPointer, NewData As Integer
showRXtext.Refresh
Do
NewData = 0
Do
DoEvents
RxDATA = RxDATA & MSComm1.Input
HeaderPointer = InStr(RxDATA, "$#")
If HeaderPointer > 0 And Len(RxDATA) > HeaderPointer + 12 Then NewData = 1
Loop Until NewData = 1
RxDATA = Mid(RxDATA, HeaderPointer, 50)
If NewData = 1 Then
showRXtext.Text = Mid(RxDATA, 3, 10)
RxDATA = " "
showRXtext.Refresh
NewData = 0
End If
Loop
End Sub
Private Sub Form_Load()
xyzForm.Cls
xyzForm.Refresh
' SetUP COM1, 9600 baud, no parity, 8 data, 1 stop, read ALL BUFFER, open port
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.InputLen = 0
MSComm1.PortOpen = True
End Sub
Private Sub Form_Terminate()
MSComm1.PortOpen = False
End
End Sub
Private Sub Form_Unload(Cancel As Integer)
MSComm1.PortOpen = False
End
End Sub
Επαναλαμβάνω ότι δεν θυμάμαι αρκετά για να λύσεις το πρόβλημα (ούτε έχω εγκατεστημένη VB)!
Απλά "δίνω κλώτσο να γυρίσει, παραμύθι ν' αρχινίσει"...
G