Jump to content




sergios

Recommended Posts

γεια σας παιδια!!εχω ενα προβλημα που μου την σπαει.........ο κωδικας μου ειναι:

Private Sub Command1_Click()

Form2.Show mode

End Sub

Public Sub Command2_Click()

'SETTING SERIAL PORT

'===============================================================

' Buffer to hold input string

Dim Instring As String

Dim k As String

Open "c:\settings.txt" For Input As #1

Input #1, k

Close #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 4050

Dim x As String

Dim yi As Double

'read di/do

MSComm1.Output = "$026" & Chr$(13)

' Wait for data to come back to the serial port.

Do

DoEvents

buffer = ""

'midenismos tou buffer

Text4.Text = ""

buffer = MSComm1.Input

'read existing in hex

Loop Until InStr(buffer, vbCr)

'loop until response

Text4.Text = buffer

MSComm1.Output = "#020008" & Chr$(13)

Do

DoEvents

buffer = ""

'midenismos tou buffer

Text6.Text = ""

buffer = MSComm1.Input

'read existing in hex

'loop until response

Loop Until InStr(buffer, vbCr)

Text6.Text = buffer

i = 1

'if digital out =1 then start counter 4080

'========================================================

'========================================================

'ADAM 4080

'If i <> 1 GoTo Line 147

'read flag

Do

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

If MSComm1.PortOpen = False Then

MsgBox "port break", vbOKOnly, "serila port1"

End If

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

x = Mid(buffer, 4)

'x = Mid(Text1.Text, 4)

'show only variable objects

x = "&h" & x

'convert hex to decimal

'Text1.Text = x

'y = Val(Text2.Text) / 37

y = x / 37

'litra

y = Round(y, 2)

'strogilopoihsh tvn litrwn

Text10.Text = y

If z <> x Then

yi = zi + y

Text3.Text = yi

End If

If x = 100 Then

zi = 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.

Do

DoEvents

buffer = ""

'midenismos tou buffer

buffer = MSComm1.Input

'read existing in hex

Loop Until InStr(buffer, vbCr)

End If

z = x

Loop

End Sub

Public Sub Command3_Click()

Dim hFile As Long

Dim sFilename As String

sFilename = "c:\demo.txt"

'obtain the next free file handle from the

'system and and save the text box contents

hFile = FreeFile

Open sFilename For Output As #hFile

Print #hFile, "litra: ", Text3.Text

Print #hFile, "hmerominia: ", Date$, Time$

Close #hFile

End Sub

Private Sub Command4_Click()

End

End Sub

EINAI 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!!!!!

Link to comment
Share on other sites

Θα πρέπει να φτιάξεις έναν δικό σου 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 Select

End Sub

Private 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 = 1
End 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 σου...

Link to comment
Share on other sites

Ίσως χρειαστείς κάποια 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...

Link to comment
Share on other sites

φιλε τζιφος..............

μαλλον δεν καταλαβεσ ακριβως το τι συμβαινει!!!!!

θα σου δοσω ενα απλο παραδειγμα χωρις 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!!!!!

αν και τα εκανα ιδια το προβλημα παραμενει.. μηπως πρει να αλλαξω κατι αλλο???

Link to comment
Share on other sites

Είναι λογικό να σου δουλεύει στο step, γιατί τα δεδομένα έρχονται στην σειριακή ενόσω περιμένεις στο debug...

Τα regional settings στην vb έχουν να κάνουν συνήθως με τα doubles και το "," όταν είναι πραγματικοί οι αριθμοί, δηλαδή το 1,345 θα χτυπήσει αν έχεις ορίσει ελληνικά στα settings, οπότε θα πρέπει να αλλάξεις την υποδιαστολή σε "." ("," -> ".")...

Δοκίμασες να το κάνεις με το OnComm event και δικό σου buffer και δεν έπαιξε...? Αποκλείεται... :wassat:

Όλα τα Do Loops βγάλ' τα, δεν χρειάζονται... θα μεταφέρεις τον έλεγχο στον event handler της σειριακής...

Link to comment
Share on other sites

γεια σας παιδια! εχω ακομα ενα ψιλοκολλημα......

καταγραφω σε ενα τχτ αρχειο τα αποτελεσματα επικινονιας και τα λοιπα....

Θελω να καθε φορα που πατιεται το κουμπι save να αποθικευονται τα καινουρια δεδομενα!δηλαδη, καθε φορα που θελω να αποθικευτουν τα δεδομενα θελω να αποθικευονται στην παρακατω γραμμη στο τχτ file. στον παραπανω κωδικα αποθικευονται ναι μεν τα δεδομενα αλλα καθε φορα που παταω το κουμπιγια αποθικευση δεδομενων σβινει τα παλια δεδομενα και γραφει καινουρια.

ΕΓΩ ΘΕΛΩ ΝΑ ΚΡΑΤΟΥΝΤΑΙ ΚΑΙ ΤΑ ΔΥΟ.

ΕΥΧΑΡΙΣΤΩ ΠΟΛΥ!!!

Link to comment
Share on other sites

Θα βάλεις μια global μεταβλητή να σου κρατάει το μήκος του textbox και στην συνέχεια θα σώζεις από εκεί και κάτω...

Private glb_txtLastIndex As Integer

....

Sub SaveSomeTxt()

Dim tmpStr As String

Dim fd As Integer

Dim fName As String

tmpStr = Mid$(txtLog.Text, glb_txtLastIndex, Len(txtLog.Text) - glb_txtLastIndex)

'Save tmpStr to File

fd = FreeFile

fName = App.Path & "\log.txt"

Open fName for Append As #fd

κτλ κτλ...

Close (fd)

glb_txtLastIndex = Len(txtLog.Text)

End Sub

Την σειριακή την έκανες να δουλέψει...?

Link to comment
Share on other sites

καλημερα!

θελω παλι μια μικρη βοηθεια!

θελω να εκτελεστει μια συγκεκριμενη εντολη για 80ms.

πιο συγκεκριμενα buffer=MsComm1.input (θελω αυτη η εντολη να εκτελειτε 80 ms)

αφου περασουν τα 80 να παει στην επομενη εντολη..

ευχαριστω εκ των πρωτερων!:pleasantry:

Link to comment
Share on other sites

ok το βρηκα!!!!!

αλλο που θελω.....

στην αρχη του προγραμματος ανοιγο ενα txt αρχειο

Open "c:\settings.txt" For Input As #1

Input #1, k

Close #1

και θελω...

σε περιπτοση που δεν υπαρχει το αρχειο αυτο να μου εμφανιζει κανενα μυνημα...:suicide:

Link to comment
Share on other sites

Μην χρησιμοποιείς #1 κτλ για ν' ανοίγεις και να χειρίζεσαι αρχεία, γιατί κάποια στιγμή μπορεί να καταλήξεις με bugs που δεν θα ξέρεις από που έρχονται...

Όπως και στην C, έτσι και στην vb θα χρησιμοποιείς τους file descriptors... δηλαδή,


Dim fd As Integer

fd = FreeFile

Open "c:\settings.txt" For Input As #fd
Input #fd, k
Close #fd

η FreeFile θα σου επιστρέψει τον πρώτο ελεύθερο file descriptor του συστήματος...

Link to comment
Share on other sites

  • 3 months later...

γεια σας!!!

εχω μια απορρια παλι.......

προσπαθω να συνδεθω στην βαση δεδομενων τυπου paradox (Tankung.DB). ΔΕΝ υπαρχει η μαλλον δεν διμιουργειτε το αρχειο .mdb και εχω μονο το .db

Μπορω να το ανοιξω χρησημοποιοντας την Access. το αρχειο αυτο αποτελειτε απο καταγραφες που εξαγει μια σισκευη.

Στο διαδικτιο και στα βιβλια που ψαχνω ολοι κανουν αναφορα στα αρχεια .mdb!!!!!

υπαρχει κανενα παραδειγμα για το διαβασμα των αρχειων αυτων στην vb6???εαν σασ διευκολινει το Tankung.DB παραγετε απο την borland...ΕΥΧΑΡΙΣΤΩ ΕΚ ΤΩΝ ΠΡΟΤΕΡΩΝ!

Link to comment
Share on other sites

Καλώς τον...

Το μόνο που θες είναι το κατάλληλο 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"))

Link to comment
Share on other sites

καλιμερα!!!

με εκανε να χασω τον υπνο μου αυτο το ζιτιμα.....

επειτα απο μεγαλη προσιλοση στα βιβλια και στο internet κατελιξά σε δυο κομματια:

Private Sub Command1_Click()

Dim oconn As ADODB.Connection

Dim rs As ADODB.Recordset

ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;"

Set oconn = New ADODB.Connection

oconn.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)

ΕΥΧΑΡΙΣΤΩ!

Link to comment
Share on other sites

Εδώ θα βρεις τα connection strings της vb6, για όλες σχεδόν τις βάσεις δεδομένων...

Τέλος και σημαντικότερο διάβασε αυτό... για να δεις αν είναι θέμα driver και θέλει αναβάθμιση το MDAC, τον οποίο driver καλό είναι να τον επιλέξεις από το Projects->References και είναι αυτό που λέει "Microsoft ActiveX Data Objects 2.5 Library (msado25.tlb)"

Link to comment
Share on other sites

απο τοι βλεπω το string ειναι σωστο. αλλα εντοπισα κατι αλλο.....

εγω χρησημοποιω το adodc και θελει adodb!!!!κατεβασα το adodb.dll αλλα δεν μπορω να το κανε reference..το κανω απο την εκτελεση rseg32 και τα λοιπα και μου λει οτι εχει βρεθει το συγκεκριμενο library αλλα ο dllregisterserver entry point was not found. κανενα tip σε αυτο??

Link to comment
Share on other sites

καλιμερα!!!!!βρικα τι φταιει μετα απο σιζιτησεις με συναδελφους..ο ενας απο ολους με ειπε οτι το ODBC στο πακετο του visual ειναι χαλασμενο!!!!σε ολα!!!!!!!

μου ειπε να χρησημοποιησω την delphi μ ε δυο κινισεις το ανοιξα!!!!!!(χωρις να γνωριζω καθολου delphi!)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.