21. september 2004 - 10:12Der er
11 kommentarer og 1 løsning
Gemme data via RC232 og MSComm
Jeg har en RS232 opkobling til et instrument. Efter måling af en prøve kan jeg tømme instrumentets ene kanal ved at afsende kommandoen %n (hvor n angiver antallet af datapunkter)
Det jeg behøver er syntaksen til at tømme kanalen samt gemme data i en allerede oprettet tekstfil.
Jeg har en procedure hvor brugeren opretter et bibliotek og en tekstfil, hvor data så senere skal gemmes i:
Private Sub Opretdatafil_Click() Set myFSO = New FileSystemObject If myFSO.FileExists("C:\" & bibliotek & "\" & fil & ".txt") Then MsgBox "Filen findes allerede" Else myFSO.CreateTextFile "C:\" & bibliotek & "\" & fil & ".txt" End If Set myFSO = Nothing End Sub
Herefter proceduren til start af instrument og lagring af data
Private Sub Kørprøve_Click() Dim instrumentstatus As Integer instrumentstatus = MsgBox("Har du placeret en prøve i instrumentet, samt sat de rette instrument indstillinger?", vbYesNo, "Instrumentindstillinger")
Select Case instrumentstatus
Case 6 MSComm1.PortOpen = True MSComm1.Output = "R" 'giver remote adgang til instrument MSComm1.Output = "A" 'starter måling af prøve
gemfil = MsgBox("Tryk Ok for at gemme resultatfilen, når målingen er færdig", vbOKCancel, "Gem datafil")
Select Case gemfil
Case 1
'gem data fra kanal 0 i txtfil som er oprettet af brugeren - det er her jeg behøver hjælp!
Jeg har ingen erfaring med dataopsamling, men at skrive indholdet af variable til en textfil gøres således når filen i forvejen eksisterer og indeholder data, der skal bevares.
Open dinsti & gemfil for Append as #1 print #1, var close #1
Hvis dine data ligger i at variabel-array: var()
Open dinsti & gemfil for Append as #1 for a = 0 to Ubound (var) print #1, var(a) next a close #1
Hvis filen ikke i forvejen eksiterer:
Open dinsti & gemfil for Output as #1 print #1, var close #1
Først afgiver jeg syntaksen MScomm1.Output = "%1000), dette skulle betyde at der sendes måledata til computerens comport, herefter skal jeg bruge noget a la
MSComm.input = ?????? og herefter noget med at skrive til txt.filen.
Jeg bruger VB5 og her er et eksempel fra on-line hjælpen. Jeg kommenterer det ikke, håber andre med erfaring i RS-232 kommunikation kommer dig til undsætning:
The following simple example shows basic serial communications using a modem: Private Sub Form_Load () ' Buffer to hold input string Dim Instring As String ' Use COM1. MSComm1.CommPort = 1 ' 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 ' Send the attention command to the modem. MSComm1.Output = "AT" + Chr$(13) ' Wait for data to come back to the serial port. Do DoEvents Loop Until MSComm1.InBufferCount >= 2 ' Read the "OK" response data in the serial port. Instring = MSComm1.Input ' Close the serial port. MSComm1.PortOpen = False End Sub .. Note The MSComm control can use polling or an event-driven method to retrieve data from the port. This simple example uses the polling method. For an example of the event-driven method, see help for the OnComm event.
Ok, ser meget meget brugbart ud, men kan du så ikke lige give mig syntaksen til hvordan jeg overfører inputstrengen til min en txt.fil, altså skriver indholdet ind i den fil som brugeren har oprettet tidligere, men som endnu ikke indeholder data.
Jeg ved ikke om VB-programmet bliver event-styret af hvert nyt input, eller om man skal anvende en passende timer til at aftaste værdien - når den formodes at være ny.
Men at skrive indholdet af variablen Instring er jo blot at erstatte mit ord 'var' med Instring. Du kan måske også anvende værdien direkte fra 'input'
Open dinsti & gemfil for Append as #1 print #1, MSCommm1.Input close #1
jeg er lidt forviret over om du har fået læst com porten som du vi, hvis ja, så skal du blot gemme dine data således: Public Sub WriteLineToFile(filename As String, tekstline As String) Dim fso As New FileSystemObject Dim tekstfile As TextStream
If fso.FileExists(filename) Then Set tekstfile = fso.OpenTextFile(filename, ForAppending, False) Else Set tekstfile = fso.OpenTextFile(filename, ForWriting, True) End If tekstfile.WriteLine tekstline
tekstfile.Close Set fso = Nothing End Sub
Denne funktion tester om filen findes, hvis den gør appender den, hvis ikke opretter den. hvis du mangler en metode til at læse porten kan du bruge
readstart = Now() Do Until (betingelse for at det du læser er i orden) returncode = returncode & .Input 'Læser output fra enhed If DateDiff("s", readstart, Now()) > 30 Then 'håntere din timeout End If Loop
cauc, den sidste parameter for til funktionen er om filen skal oprettes, false betyder.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.