sergios Δημοσιεύτηκε Μάρτιος 12, 2009 #1 Δημοσιεύτηκε Μάρτιος 12, 2009 γεια σας παιδια!!εχω ενα προβλημα που μου την σπαει.........ο κωδικας μου ειναι:Private Sub Command1_Click()Form2.Show modeEnd SubPublic Sub Command2_Click()'SETTING SERIAL PORT'===============================================================' Buffer to hold input stringDim Instring As StringDim k As StringOpen "c:\settings.txt" For Input As #1Input #1, kClose #1' Use COM1.MSComm1.CommPort = k' 9600 baud, no parity, 8 data, and 1 stop bit.MSComm1.Settings = "9600,N,8,1"' Tell the control to read entire buffer when Input' is used.MSComm1.InputLen = 0' Open the port.MSComm1.PortOpen = True'============================================================================='============================================================================='ADAM 4050Dim x As StringDim yi As Double'read di/doMSComm1.Output = "$026" & Chr$(13)' Wait for data to come back to the serial port.DoDoEventsbuffer = ""'midenismos tou bufferText4.Text = ""buffer = MSComm1.Input'read existing in hexLoop Until InStr(buffer, vbCr)'loop until responseText4.Text = bufferMSComm1.Output = "#020008" & Chr$(13)DoDoEventsbuffer = ""'midenismos tou bufferText6.Text = ""buffer = MSComm1.Input'read existing in hex'loop until responseLoop Until InStr(buffer, vbCr)Text6.Text = bufferi = 1'if digital out =1 then start counter 4080'========================================================'========================================================'ADAM 4080'If i <> 1 GoTo Line 147'read flagDoDoEvents' Send command to ADAM-4080 Module at address 01H.MSComm1.Output = "#010" & Chr$(13)' Wait for data to come back to the serial port.DoIf MSComm1.PortOpen = False ThenMsgBox "port break", vbOKOnly, "serila port1"End IfDoEventsbuffer = ""'midenismos tou bufferbuffer = MSComm1.Input'read existing in hexLoop Until InStr(buffer, vbCr)'loop until responseText1.Text = ""'cls text'Text1.Text = bufferx = Mid(buffer, 4)'x = Mid(Text1.Text, 4)'show only variable objectsx = "&h" & x'convert hex to decimal'Text1.Text = x'y = Val(Text2.Text) / 37y = x / 37'litray = Round(y, 2)'strogilopoihsh tvn litrwnText10.Text = yIf z <> x Thenyi = zi + yText3.Text = yiEnd IfIf x = 100 Thenzi = zi + y' Send command to ADAM-4080 Module at address 01H.MSComm1.Output = "$0160" & Chr$(13)' Wait for data to come back to the serial port.DoDoEventsbuffer = ""'midenismos tou bufferbuffer = MSComm1.Input'read existing in hexLoop Until InStr(buffer, vbCr)End Ifz = xLoopEnd SubPublic Sub Command3_Click()Dim hFile As LongDim sFilename As StringsFilename = "c:\demo.txt"'obtain the next free file handle from the'system and and save the text box contentshFile = FreeFileOpen sFilename For Output As #hFilePrint #hFile, "litra: ", Text3.TextPrint #hFile, "hmerominia: ", Date$, Time$Close #hFileEnd SubPrivate Sub Command4_Click()EndEnd SubEINAI ENA ΠΡΟΓΡΑΜΜΑ με το οποιο επικοινονω με μια μιχανη μεσω θυρας comm στελνω καποιους κωδικους και λαμβανω την απαντηση απο μιχανη σε μορφη hex και αποτελειτε απο 10 αριθμους!!!!!!!!!TO ΠΡΟΒΛΗΜΑ!!στον κυριο υπολογιστη (σε αυτον που το εκανα) το προγραμμα λειτουργει μια χαρα χωρις λαθη!!!!!Οταν ωμος το μεταφερω σε αλλον pc κανοντας το .exe απο τον κυριο, μου βγαζει λαθος Run time error 13 type miss match!!!!!!!επειτα για να το λυσω εγκατεστησα το vb 6.0 στον αλλον pc και βρηκα το προβλημα!!!!!!!!!H ΑΠΑΝΤΗΣΗ ΠΟΥ ΛΑΜΒΑΝΩ ΑΠΟ THN MHXANH αντι για 10 αριθμους ειναι μονο οι δυο τελευταιοι!!!!!στο full debug!!!!!ενω στο step into ειναι ολα ok!!!!!!!εχω δοκιμασει να βαλω καθυστερησεις στο προγραμμα και δεν επιασε!!!!!ΜΗΠΩΣ ΓΝΩΡΙΖΕΙ ΚΑΝΕΝΑΣ TO TΙ ΜΠΟΡΕΙ NA ΦΤΑΕΙ??????????????????????????THANX!!!!!
Jaco Μάρτιος 17, 2009 #2 Μάρτιος 17, 2009 Θα πρέπει να φτιάξεις έναν δικό σου global buffer για τα δεδομένα που έρχονται από την σειριακή... Ο buffer θα γεμίζει μέσα στην MSComm1_OnComm(), την οποία πρέπει να την χρησιμοποιήσεις...πχ...Private Sub MSComm1_OnComm() Dim InBuff As String Select Case MSComm1.CommEvent Case comEvReceive ' Received RThreshold # of chars. MSComm1.RThreshold = 0 Call HandleInput End SelectEnd SubPrivate Sub HandleInput() tmrComTimeOut.Enabled = False Dim tmpIndex As Integer glb_comBuffer = glb_comBuffer & MSComm1.Input 'Εδώ κάνεις τους χειρισμούς σου με τον glb_comBuffer... If Len(glb_com_buffer) >= 10 Then 'Επειδή περιμένεις μήκος 10 'Αξιολόγηση δεδομένων και χειρισμός '.... 'Αν τα δεδομένα είναι αυτά που περιμένεις, αδειάζεις τον buffer, διαφορετικά 'αφαιρείς από τον buffer μόνο τα δεδομένα που έχεις επεξεργαστεί και κρατάς 'τα υπόλοιπα (τώρα απλά τον αδειάζω, γιατί δεν ξέρω τι θέλεις να κάνεις) glb_com_buffer = vbNullString End If MSComm1.RThreshold = 1End SubΌπως βλέπεις κάθε φορά που σου έρχονται δεδομένα ελέγχεις αν το event της σειριακής είναι το "comEvReceive", που σημαίνει ότι έχεις data από την μηχανή σου... φτιάχνεις ένα δικό σου call σε μια ρουτίνα χειρισμού και κλείνεις το RThreshold έτσι ώστε να μην επιτρέπεις το "comEvReceive" να δημιουργηθεί... έτσι δεν χάνεις τα δεδομένα που σου έρχονται όσο είσαι στο call, αλλά μαζεύονται στον buffer της σειριακής...Μόλις μπεις στον handler (συνάρτηση HandleInput) αποθηκεύεις τα ήδη υπάρχοντα δεδομένα του buffer της σειριακής στον global buffer σου και ελέγχεις πλέον τον buffer τον δικό σου... όταν βρεις τα δεδομένα που θες τότε ξαναενεργοποιείς την αποδοχή events από το σειριακό, ενεργοποιώντας ξανά το "RThreshold"... Επίσης δεν πρέπει να ξεχνάς να αδειάζεις τον buffer σου...glb_comBuffer = vbNullStringΈτσι δεν θα χάνεις ποτέ δεδομένα και θα έχεις εσύ τον έλεγχο του buffer...Επίσης μπορείς να φτιάξεις state machine, αν χρειάζεται, για την σειριακή και να κάνεις πιο πολύπλοκους χειρισμούς, αλλά αυτό εξαρτάται από την εφαρμογή σου...Ο κώδικας είναι απλά οδηγός και θα πρέπει να τον μετατρέψεις εσύ ανάλογα με την εφαρμογή σου....Edit:Εμμ... είδα ότι απαντάω λίγο καθυστερημένα, αλλά τώρα είδα το post σου...
Jaco Μάρτιος 17, 2009 #4 Μάρτιος 17, 2009 Ίσως χρειαστείς κάποια state machine λογική, καθώς ο χειρισμός θα γίνεται ασύγχρονα και δεν θα πρέπει περιμένεις απάντηση στην ίδια function που στέλνεις εσύ δεδομένα, όπως κάνεις τώρα... Φυσικά υπάρχει τρόπος να περιμένεις κιόλας στην ίδια function, αλλά στην περίπτωση αυτή, επειδή θα είναι blocking code θα σταματάει και η απόκριση του προγράμματος από τον χρήστη, γιατί η vb6 δεν υποστηρίζει multithreading άμεσα, αν και υπάρχουν έμμεσοι τρόποι... Αν δεν σε ενοχλεί το πάγωμα της εφαρμογής μπορείς να το κάνεις blocking... Την λογική αυτή πχ, την χρησιμοποιούμε κυρίως σε εφαρμογές που επικοινωνούν με modems, λόγο του τύπου της εφαρμογής, αλλά δεν θα στην πρότεινα για την παρούσα... μου φαίνεται απλή εφαρμογή που μπορεί να δουλέψει και με τον ασύγχρονο τρόπο της σειριακής... it's your call φυσικά...Τέλος τα Do Loops γενικά να τα αποφεύγεις για καθυστερήσεις... Μπορείς να χρησιμοποιήσεις το API των windows και συγκεκριμένα την Sleep...Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)Αυτή είναι μια function του kernel των windows και όταν τρέχει δεν χρησιμοποιεί πόρους, οπότε δεν θα βλέπεις να σου "τρώει" το πρόγραμμά σου 40-50% cpu όπως ένα Do Loop, παρόλ' αυτά το gui θα παγώνει, όσο διαρκεί η Sleep...
sergios Μάρτιος 17, 2009 Author #5 Μάρτιος 17, 2009 φιλε τζιφος..............μαλλον δεν καταλαβεσ ακριβως το τι συμβαινει!!!!!θα σου δοσω ενα απλο παραδειγμα χωρις loop και τα λοιπα ..DoEvents ' Send command to ADAM-4080 Module at address 01H. MSComm1.Output = "#010" & Chr$(13) ' Wait for data to come back to the serial port. Do DoEvents buffer = "" 'midenismos tou buffer buffer = MSComm1.Input 'read existing in hex Loop Until InStr(buffer, vbCr) 'loop until response Text1.Text = "" 'cls text Text1.Text = buffer ----------------------ο text1 στον "user" στο step into βγαζει απαντηση ">00001287ad"!!(σωστο)στο debug (F5) μου βγαζει το "ad"!!!!δουλευω με τα adam αν σου λεει τιποτα.κατι ερχετε στο μυαλο μου.... μηπως φταινε τα regional settings του windows??????στον server εχω winxp pro eng ενω στον αλλον αυστραλεζικο xp!!!!!αν και τα εκανα ιδια το προβλημα παραμενει.. μηπως πρει να αλλαξω κατι αλλο???
Jaco Μάρτιος 17, 2009 #6 Μάρτιος 17, 2009 Είναι λογικό να σου δουλεύει στο step, γιατί τα δεδομένα έρχονται στην σειριακή ενόσω περιμένεις στο debug...Τα regional settings στην vb έχουν να κάνουν συνήθως με τα doubles και το "," όταν είναι πραγματικοί οι αριθμοί, δηλαδή το 1,345 θα χτυπήσει αν έχεις ορίσει ελληνικά στα settings, οπότε θα πρέπει να αλλάξεις την υποδιαστολή σε "." ("," -> ".")...Δοκίμασες να το κάνεις με το OnComm event και δικό σου buffer και δεν έπαιξε...? Αποκλείεται... :wassat:Όλα τα Do Loops βγάλ' τα, δεν χρειάζονται... θα μεταφέρεις τον έλεγχο στον event handler της σειριακής...
sergios Μάρτιος 17, 2009 Author #7 Μάρτιος 17, 2009 οκ θα το δοκιμασω αργοτερα γιατι δεν προλαβαινω τωρα.. thaks πολυ!!!!!
sergios Μάρτιος 24, 2009 Author #8 Μάρτιος 24, 2009 γεια σας παιδια! εχω ακομα ενα ψιλοκολλημα......καταγραφω σε ενα τχτ αρχειο τα αποτελεσματα επικινονιας και τα λοιπα....Θελω να καθε φορα που πατιεται το κουμπι save να αποθικευονται τα καινουρια δεδομενα!δηλαδη, καθε φορα που θελω να αποθικευτουν τα δεδομενα θελω να αποθικευονται στην παρακατω γραμμη στο τχτ file. στον παραπανω κωδικα αποθικευονται ναι μεν τα δεδομενα αλλα καθε φορα που παταω το κουμπιγια αποθικευση δεδομενων σβινει τα παλια δεδομενα και γραφει καινουρια.ΕΓΩ ΘΕΛΩ ΝΑ ΚΡΑΤΟΥΝΤΑΙ ΚΑΙ ΤΑ ΔΥΟ.ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ!!!
Jaco Μάρτιος 24, 2009 #9 Μάρτιος 24, 2009 Θα βάλεις μια global μεταβλητή να σου κρατάει το μήκος του textbox και στην συνέχεια θα σώζεις από εκεί και κάτω...Private glb_txtLastIndex As Integer....Sub SaveSomeTxt()Dim tmpStr As StringDim fd As IntegerDim fName As StringtmpStr = Mid$(txtLog.Text, glb_txtLastIndex, Len(txtLog.Text) - glb_txtLastIndex)'Save tmpStr to Filefd = FreeFile fName = App.Path & "\log.txt"Open fName for Append As #fdκτλ κτλ...Close (fd)glb_txtLastIndex = Len(txtLog.Text)End SubΤην σειριακή την έκανες να δουλέψει...?
sergios Μάρτιος 24, 2009 Author #10 Μάρτιος 24, 2009 ναι. εκανα ετσι οπως μου ειπες αλλα παλι τζιφος στον αυστραλεζικο....και τελικα τσαντιστηκα και τον εκανα format και ολα οκ τωρα.
sergios Μάρτιος 30, 2009 Author #11 Μάρτιος 30, 2009 καλημερα! θελω παλι μια μικρη βοηθεια! θελω να εκτελεστει μια συγκεκριμενη εντολη για 80ms. πιο συγκεκριμενα buffer=MsComm1.input (θελω αυτη η εντολη να εκτελειτε 80 ms) αφου περασουν τα 80 να παει στην επομενη εντολη.. ευχαριστω εκ των πρωτερων!
sergios Μάρτιος 30, 2009 Author #12 Μάρτιος 30, 2009 ok το βρηκα!!!!! αλλο που θελω..... στην αρχη του προγραμματος ανοιγο ενα txt αρχειο Open "c:\settings.txt" For Input As #1 Input #1, k Close #1 και θελω... σε περιπτοση που δεν υπαρχει το αρχειο αυτο να μου εμφανιζει κανενα μυνημα...
Jaco Μάρτιος 30, 2009 #13 Μάρτιος 30, 2009 Μην χρησιμοποιείς #1 κτλ για ν' ανοίγεις και να χειρίζεσαι αρχεία, γιατί κάποια στιγμή μπορεί να καταλήξεις με bugs που δεν θα ξέρεις από που έρχονται...Όπως και στην C, έτσι και στην vb θα χρησιμοποιείς τους file descriptors... δηλαδή,Dim fd As Integerfd = FreeFileOpen "c:\settings.txt" For Input As #fdInput #fd, kClose #fdη FreeFile θα σου επιστρέψει τον πρώτο ελεύθερο file descriptor του συστήματος...
sergios Ιούλιος 7, 2009 Author #14 Ιούλιος 7, 2009 γεια σας!!!εχω μια απορρια παλι.......προσπαθω να συνδεθω στην βαση δεδομενων τυπου paradox (Tankung.DB). ΔΕΝ υπαρχει η μαλλον δεν διμιουργειτε το αρχειο .mdb και εχω μονο το .dbΜπορω να το ανοιξω χρησημοποιοντας την Access. το αρχειο αυτο αποτελειτε απο καταγραφες που εξαγει μια σισκευη.Στο διαδικτιο και στα βιβλια που ψαχνω ολοι κανουν αναφορα στα αρχεια .mdb!!!!!υπαρχει κανενα παραδειγμα για το διαβασμα των αρχειων αυτων στην vb6???εαν σασ διευκολινει το Tankung.DB παραγετε απο την borland...ΕΥΧΑΡΙΣΤΩ ΕΚ ΤΩΝ ΠΡΟΤΕΡΩΝ!
Jaco Ιούλιος 7, 2009 #15 Ιούλιος 7, 2009 Καλώς τον...Το μόνο που θες είναι το κατάλληλο connection string για την paradox στην ado...Μετά απλά κάνεις sql queries στους πίνακες της βάσης...Επειδή το κεφάλαιο db στην vb6 είναι μεγάλο και δεν υπάρχει μόνο ένας τρόπος να διαχειριστείς βάσεις δεδομένων, αλλά πολλοί, καλό είναι να κοιτάξεις για κανένα tutorial...Μια γενική μέθοδος είναι να εισάγεις ένα data environment στα designers απ' το project σου και εκεί να κάνεις add connection δημιουργώντας, ένα νέο object για την σύνδεση... από εκεί και πέρα είναι εύκολο με απλή ανάθεση σε queries να διαβάζεις τα αποτελέσματα σε recordsets...Τέλος για να μην πέσεις στην παγίδα που πέφτουν πολλοί στην vb6, όταν διαβάζεις δεδομένα (fields) από τα recordsets τα οποία είναι strings, τότε βάζε ένα "" στην αρχή γιατί αν δεν υπάρχουν δεδομένα επιστρέφει NULL το οποίο κρεμάει την vb6...δηλαδή...:tmpStr = "" & Trim(rs.fields("fld_String"))
sergios Ιούλιος 8, 2009 Author #16 Ιούλιος 8, 2009 καλιμερα!!!με εκανε να χασω τον υπνο μου αυτο το ζιτιμα.....επειτα απο μεγαλη προσιλοση στα βιβλια και στο internet κατελιξά σε δυο κομματια:Private Sub Command1_Click()Dim oconn As ADODB.ConnectionDim rs As ADODB.RecordsetConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"Set oconn = New ADODB.Connectionoconn.Open "Driver={Microsoft Paradox Driver (*.db )};" & _ "DriverID=538;" & _ "File=Paradox 5.X;" & _ "DefaultDir=E:\DLL TESTS\PEIRAMATA DB\Tankung.db;" & _ "Dbq=c:\E:\DLL TESTS\PEIRAMATA DB\Tankung.db;" & _ "CollatingSequence=ASCII"End Subμου βγαζει μηνημα:[microsoft][odbc paradox driver] 'unknown' is not valid path.make sure that the path name is spelled correctly and that you are connected to the server on which the files resides.τι ενοει ο ποιητης????οσο αναφορα την διαδρομη δεν χω καταλαβει ακριβως εαν πρεπει να βαλω στο τελοσ και το Tankung.db (την database της paradox που θελω να διαβασω και να τροποποιησω).και δευτερων αν ειναι σωστα ολα αυτα που εγραψα...(υπενθιμηζω οτι χρησημοποιω το ODBC driver)ΕΥΧΑΡΙΣΤΩ!
Jaco Ιούλιος 8, 2009 #17 Ιούλιος 8, 2009 Εδώ θα βρεις τα connection strings της vb6, για όλες σχεδόν τις βάσεις δεδομένων...Τέλος και σημαντικότερο διάβασε αυτό... για να δεις αν είναι θέμα driver και θέλει αναβάθμιση το MDAC, τον οποίο driver καλό είναι να τον επιλέξεις από το Projects->References και είναι αυτό που λέει "Microsoft ActiveX Data Objects 2.5 Library (msado25.tlb)"
sergios Ιούλιος 8, 2009 Author #18 Ιούλιος 8, 2009 απο τοι βλεπω το string ειναι σωστο. αλλα εντοπισα κατι αλλο.....εγω χρησημοποιω το adodc και θελει adodb!!!!κατεβασα το adodb.dll αλλα δεν μπορω να το κανε reference..το κανω απο την εκτελεση rseg32 και τα λοιπα και μου λει οτι εχει βρεθει το συγκεκριμενο library αλλα ο dllregisterserver entry point was not found. κανενα tip σε αυτο??
sergios Ιούλιος 9, 2009 Author #20 Ιούλιος 9, 2009 καλιμερα!!!!!βρικα τι φταιει μετα απο σιζιτησεις με συναδελφους..ο ενας απο ολους με ειπε οτι το ODBC στο πακετο του visual ειναι χαλασμενο!!!!σε ολα!!!!!!!μου ειπε να χρησημοποιησω την delphi μ ε δυο κινισεις το ανοιξα!!!!!!(χωρις να γνωριζω καθολου delphi!)
Recommended Posts
Archived
This topic is now archived and is closed to further replies.