Προσπαθώ να γράψω ένα προγραμματάκι σε VB ώστε να χειρίζομαι κάτι tranceivers. Oi tranceivers συνδέονται σειριακά με το PC. Ενώ στέλνω κανονικά τις εντολές και είναι σίγουρο πως οι tranceivers τις παίρνουν αφού τις κάνουν echo (το λέει και το manual) μετά πρέπει να στείλω ένα "ACK" για να γίνει επιβεβαίωση. Βάση του manual the ACK command is sent as 3 ASCII charactes, ACK in sequence 'A"C"K', έχω γράψει το παρακάτω για μια τυχαία command
MSComm1.Output = "ER_CMD#U1"
Sleep (20)
input3 = MSComm1.Input
If input3 = "ER_CMD#U1" Then
MSComm1.Output = "ACK"
END If
αλλά το MSComm1.Output = "ACK" δεν δουλεύει. Μήπως πρέπει να μετατρέψω το ACK σε ASCII; και πως γίνεται αυτό;
ευχαριστώ προκαταβολικά για όποια βοήθεια
Εμφάνιση 1-14 από 14
-
22-09-06, 03:11 βοήθεια σε Visual Basic και RS232 #1
-
22-09-06, 04:33 #2
Έχω την εντύπωση οτι πρέπει να στείλεις τον χαρακτήρα ACK (Ordinal = 6) που είναι το ACK και όχι το ACK ώς string ...
Edit: Κάποια links που με είχαν βοηθήσει :
http://www.htservices.com/Tools/VBan...unications.htm
http://www.control.com/1026220936/index_html
http://support.microsoft.com/default...b;en-us;140880Τελευταία επεξεργασία από το μέλος ghostnik : 22-09-06 στις 04:35. Αιτία: Links
Program your application to be idiot-proof and you'll only be proven an idiot
-
22-09-06, 15:59 #3
Έχω δοκιμάσει να στείλω και chr(6) ή chr(06) αλλά και πάλι τίποτα. Δεν νομίζω πως είναι αυτό αφού στο manual λέει πως το ACK είναι 3 ξεωριστοί χαρακτήρες. Αυτό , πάντως, που είχα γράψει τότε είναι
MSComm1.Output = chr(6)
αλλά και πάλι δεν δούλεψε, μήπως το είχα γράψει λάθος;
-
22-09-06, 16:26 #4
Ελα φίλε,
απο ότι καταλαβαίνω εγώ απο αυτό που έστειλες μάλλον θέλει να στείλεις με τη σειρά πρώτα ένα 'Α'
μετά ένα 'C' και μέτα ενα 'K' .
Ελπίζω να σε βοηθίσει..."..The Force Shall Set Me Free!!!"
-
24-09-06, 01:47 #5
Ευχαριστώ για την βοήθεια. Τελικά κάτι περίεργο παίζει, αν σπάσω τον κώδικα σε δύο command buttons που το ένα απλά έχει MSComm1.Output = "ER_CMD#U1" και το άλλο MSComm1.Output = "ACK" και τα πατήσω διαδοχικά δουλεύει. Πάντως δεν μπορώ να τα καταφέρω να δουλέψουν μαζί σε ένα με τίποτα.
-
25-09-06, 19:55 #6
Έχεις δοκιμάσει να παρακολουθήσεις την ροή δεδομένων με τα events που δίνει το MSCOMM Control της VB6?
George J.
-
28-09-06, 20:46 #7
Snott... δοκίμασε να αυξήσεις το Sleep
Ή να κάνεις κάτι σαν
Κώδικας:input3="" do while input3 <> "ER_CMD#U1" sleep(10) DoEvents:DoEvents:DoEvents:DoEvents 'Ένα δεν είναι ποτέ αρκετό :p input3=Comm1.Input Loop
-
29-09-06, 00:19 #8
Κάνεις το κλασσικό λάθος που κάνουν όλοι, με την σειριακή. Οι σειριακή επικοινωνία, δεν είναι κάτι που περιμένεις να συμβεί, σταματώντας την ροή του προγραμματός σου. Την ώρα που εσύ βάζεις sleep το παράθυρο "κλειδώνει" και είναι σαν να έχει κολήσει το πρόγραμμα. Φαντάζεσαι να το κάνεις συνέχεια;
Αν υποθέσουμε ότι στο project references βάλουμε το mscomm32.ocx σαν library και επάνω σε μία φόρμα 2 command boxes btn_Start, btn_Stop ο κώδικας χειρισμού της σειριακής θα ήταν κάπως έτσι:
Κώδικας:Option Explicit Private WithEvents mSerialPort As MSCommLib.MSComm Private mInputBuffer As String Private Const EOLMark As String = vbCrLf Private Sub btnStart_Click() mSerialPort.CommPort = 1 mSerialPort.Settings = "9600,N,8,1" mSerialPort.PortOpen = True End Sub Private Sub btnStop_Click() mSerialPort.PortOpen = False End Sub Private Sub Form_Load() Set mSerialPort = New MSCommLib.MSComm mSerialPort.InputMode = comInputModeText mSerialPort.InputLen = 0 mSerialPort.RThreshold = 1 mSerialPort.InBufferSize = 8192 mSerialPort.OutBufferSize = 4096 End Sub Private Sub Form_Unload(Cancel As Integer) Set mSerialPort = Nothing End Sub Private Sub mSerialPort_OnComm() Dim lLines() As String Dim lCounter As Integer Select Case mSerialPort.CommEvent Case comEvReceive mInputBuffer = mInputBuffer & mSerialPort.Input lLines = Split(mInputBuffer, EOLMark) For lCounter = LBound(lLines) To UBound(lLines) - 1 Call DataArrival(lLines(lCounter)) DoEvents Next mInputBuffer = lLines(UBound(lLines)) Case Else RaiseEvent CommEvent(mSerialPort.CommEvent) End Select End Sub Private Sub DataArrival(TextLine As String) Debug.Print TextLine End Sub
George J.
-
29-09-06, 09:57 #9
λολ Συμφωνώ. Απλά θεώρησα ότι η όλη "συνομιλία" με τη σειριακή είναι αυτή που αναφέρεται στο πρώτο post. 1 Input + 1 Output. Οπότε αυτά τα 1-2-3 κλειδώματα των 20millisecond δε θα κάνουν τη διαφορά.
Ευχαριστούμε πάντως για τον κώδικα... Ποτέ δεν ξέρεις πότε θα φανεί χρήσιμος
-
29-09-06, 13:28 #10
Ωραία, το επόμενο βήμα είναι να φτιάξω ένα κώδικα χωρίς sleep. Ας πούμε πως θα αποθηκεύω τα εισερχόμενα σε ένα string ή σε ένα textbox αλλά πως θα αναγνωρίζω κάποια απάντηση σε εντολή απο τον tranceiver; Στην C θα έβαζα ένα pointer που θα σκάναρε το string και αν έβλεπε π.χ. τον χαρακτήρα E, ο επόμενος ήταν R κτλ. στο τέλος θα έβλεπε ER_CMD#U1 και θα έστελνε ένα ACK. Από VB δεν ξέρω και πολλά, μπορώ να κάνω κάτι παρόμοιο;
-
29-09-06, 13:39 #11
Δες τον κώδικα του George.
Το output του tranceiver δεν είναι delimited με κάποιον χαρακτήρα;
Π.χ. στον κώδικα του Γιώργου αυτός ο χαρακτήρας είναι ο EOLMark και ισούται με CHR(13)+CHR(10) (Carriage return+Linefeed). Σε σένα μπορεί να είναι ο chr(0) ή οποιοσδήποτε.
Αν δεν υπάρχει delimiter και το tranceiver πετάει συνέχεια στοιχεία (γίνεται αυτό τότε καλύτερα να ορίσεις την mInputBuffer ως Variant και να ψάχνεις για το string που θέλεις μέσω της INSTR(mInputBuffer, "STRINGTOLOOKFOR")
Μόνο μην ξεχνάς να μηδενίζεις/ελευθερώνεις την mInputBuffer.
-
29-09-06, 14:32 #12
Κατ' αρχήν ευχαριστώ για την βοήθεια. Τελικά το κατάφερα να δουλέψει έστω και με sleep βάζοντας το παρακάτω
Κώδικας:MSComm1.Output = "ER_CMD#U1" Sleep (20) If MSComm1.Input = "ER_CMD#U1" Then MSComm1.Output = "ACK" Sleep (20) MSComm1.Settings = "2400,N,8,1" (η εντολή ER_CMD#U1 αλλάζει το baud rate του tranceiver σε 2400) MsgBox "success" End If
ευχαριστώ και πάλι για την βοήθειαΤελευταία επεξεργασία από το μέλος nnn : 30-09-06 στις 01:01. Αιτία: χρήση code tag
-
04-10-06, 14:45 #13
Υπάρχει τρόπος να φτιάξω ένα event που θα ενεργοποιείται όταν θα αδειάζει το output buffer; Θέλω να αλλάζω το baud rate της serial όταν αλλάζει και του tranceiver, αλλά αν αλλάξω το baud rate της serial αμέσως αφού αλλάξω και του tranceiver παίρνω framing error (αφού αλλάζει πριν προλάβει να πάρει την εντολή ο tranceiver) και θέλω να αποφύγω το sleep
-
04-10-06, 16:38 #14
ok το βρήκα μόνος μου, βάζεις Sthreshold = 1 και έτσι ενεργοποιείται το comevsend όταν αδειάσει ο buffer
Παρόμοια Θέματα
-
Visual Basic
Από Uberalles στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 9Τελευταίο Μήνυμα: 25-01-08, 19:27 -
visual basic
Από errorr στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 1Τελευταίο Μήνυμα: 15-11-07, 21:43 -
Εικονες JPEG και visual basic
Από moutousidis στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 10Τελευταίο Μήνυμα: 18-03-07, 14:01 -
Visual Basic και έτοιμος κώδικας???
Από Miltos_01 στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 15Τελευταίο Μήνυμα: 29-03-06, 22:13 -
Παιδιά έχω ανάγκη τη βοήθεια σας!!(visual basic 6)
Από Deadend στο φόρουμ WindowsΜηνύματα: 4Τελευταίο Μήνυμα: 10-03-05, 20:25
Bookmarks