Auslesen von Messwerten von Atmega64 und darstellen in Excel

  • Allgemein

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von peterfido.

    Auslesen von Messwerten von Atmega64 und darstellen in Excel

    Hallo Leute,

    ich bin ein Kompletter neuling in VB ich habe mir zwar schon einige Programme mal angeguckt aber leider nie Durchgeblickt.

    Und zwar geht es um Folgendes ich möchte mit meinem Atmega64 über die Serielle Schnittstelle Daten an den PC senden und in Excel darstellen. Die Komikation zwischen Hyperterminal und meinem Atmega64 funktioniert immer aber ich weiß nun ich wie ich es mit Excel mache. Und zwar möchte ich zb. 1230:3040:4000:5500:6660 dan eine pause von ca. 5 sek und dann 1300:4050:4110:6020:7070 und immer so weiter von Controller aus senden diese soll dan in Excel empangen werden, und folgender massen dargestellt werden.

    Kanal 1 Kanal 2 Kanal 3 Kanal 4 Kanal 5

    12,30 30,40 40,00 55,00 66,60

    13,00 40,50 41,10 60,20 70,70



    Es wäre super wenn mir jemand damit weiterhelfen könnte und es mir auch möglichst erklären könnte da ich das ganze ja nicht einfach nur kopieren möchte sondern auch verstehen möchte.
    Dateien
    • Messwerte.xls

      (24,58 kB, 137 mal heruntergeladen, zuletzt: )
    Programmierst Du den Atmega auch?
    Ich würde nicht die Pause analysieren, sondern das Protokoll ändern.
    Z.B. zuerst ein bestimmtes Zeichen senden, welches in den Daten nicht vorkommt und dann die 5 Kanäle hinterher. Oder alles in eine Zeile packen.

    Ansonsten am Doppelpunkt splitten und durch 100 teilen.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Ja den Atmega Programmiere ich bzw. habe ich schon programmiert. C programmierung ist nicht das Problem bei mir. Werde warscheinlich den String so senden 1300;4050;4110;6020;7070/n

    werde die Doppelpunkte durch Semikolons ersetzen da VB soweit wie ich es bis jetzt herausgefunden habe woll die strings an den Semikolons trennen kann. Und zum schluss sende ich nochmal /n um zusagen hier ist das ende vom String.

    Jetzt ist meinproblem nur noch die realisierung in VBA da ich noch nie damit gearbeitet habe.

    Ich habe auch gelesen das man die Schnittstelle gut mit Microsoft Com Conbtrol ansprechen kann aber diese Funktioniert bei mir nicht wenn ich es einfügen will kommt immer die Fehlermeldung das ich das Objekt nicht einfügen kann.
    So ich habe jetzt nen modul was mit hilfe der api den com port ausliest.

    modSerial

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Explicit
    2. Private Type COMMTIMEOUTS
    3. ReadIntervalTimeout As Long
    4. ReadTotalTimeoutMultiplier As Long
    5. ReadTotalTimeoutConstant As Long
    6. WriteTotalTimeoutMultiplier As Long
    7. WriteTotalTimeoutConstant As Long
    8. End Type
    9. Private Type DCB
    10. DCBlength As Long
    11. BaudRate As Long
    12. fBitFields As Long
    13. wReserved As Integer
    14. XonLim As Integer
    15. XoffLim As Integer
    16. ByteSize As Byte
    17. Parity As Byte
    18. StopBits As Byte
    19. XonChar As Byte
    20. XoffChar As Byte
    21. ErrorChar As Byte
    22. EofChar As Byte
    23. EvtChar As Byte
    24. wReserved1 As Integer 'Reserved; Do Not Use
    25. End Type
    26. Private Const GENERIC_READ As Long = &H80000000
    27. Private Const GENERIC_WRITE As Long = &H40000000
    28. Private Const OPEN_EXISTING As Long = 3
    29. Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80
    30. Private Const NOPARITY As Long = 0
    31. Private Const ONESTOPBIT As Long = 0
    32. Private Const MAXDWORD As Long = -1
    33. Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" _
    34. (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
    35. ByVal dwShareMode As Long, ByRef lpSecurityAttributes As Any, _
    36. ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
    37. ByVal hTemplateFile As Long) As Long
    38. Private Declare Function GetCommState Lib "kernel32.dll" (ByVal nCid As Long, _
    39. ByRef lpDCB As DCB) As Long
    40. Private Declare Function SetCommState Lib "kernel32.dll" (ByVal nCid As Long, _
    41. ByRef lpDCB As DCB) As Long
    42. Private Declare Function GetCommTimeouts Lib "kernel32.dll" (ByVal hFile As Long, _
    43. ByRef lpCommTimeouts As COMMTIMEOUTS) As Long
    44. Private Declare Function SetCommTimeouts Lib "kernel32.dll" (ByVal hFile As Long, _
    45. ByRef lpCommTimeouts As COMMTIMEOUTS) As Long
    46. Private Declare Function WriteFile Lib "kernel32.dll" (ByVal hFile As Long, _
    47. ByRef Buffer As Any, ByVal nNumberOfBytesToWrite As Long, _
    48. ByRef lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long
    49. Private Declare Function ReadFile Lib "kernel32.dll" (ByVal hFile As Long, _
    50. ByRef Buffer As Any, ByVal nNumberOfBytesToRead As Long, _
    51. ByRef lpNumberOfBytesRead As Long, ByVal lpOverlapped As Long) As Long
    52. Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
    53. Private udtTimeOut As COMMTIMEOUTS
    54. Private udtDCB As DCB
    55. Private hPort As Long
    56. Public Function OpenCom(Port As Long, Baud As Long, DataBits As Long, _
    57. ParityBits As Long, StopBits As Long) As Boolean
    58. 'todo: DataBits, ParityBits, StopBits werden nicht wirklich gemäß MS Spec behandelt.
    59. ' Für 8,0,1 sollte aber alles passen
    60. Dim bFailed As Boolean
    61. udtDCB.DCBlength = LenB(udtDCB)
    62. udtTimeOut.ReadIntervalTimeout = MAXDWORD
    63. udtTimeOut.ReadTotalTimeoutConstant = 0
    64. udtTimeOut.ReadTotalTimeoutMultiplier = 0
    65. udtTimeOut.WriteTotalTimeoutConstant = 0
    66. udtTimeOut.WriteTotalTimeoutMultiplier = 0
    67. hPort = CreateFile("COM" & Port, GENERIC_READ Or GENERIC_WRITE, 0, ByVal 0, _
    68. OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0&)
    69. If hPort = 0 Or hPort = -1 Then
    70. bFailed = True
    71. ElseIf SetCommTimeouts(hPort, udtTimeOut) = 0 Then
    72. bFailed = True
    73. ElseIf GetCommState(hPort, udtDCB) = 0 Then
    74. bFailed = True
    75. Else
    76. udtDCB.BaudRate = Baud
    77. udtDCB.ByteSize = DataBits
    78. udtDCB.Parity = ParityBits
    79. udtDCB.StopBits = StopBits - 1
    80. If SetCommState(hPort, udtDCB) = 0 Then
    81. bFailed = True
    82. End If
    83. End If
    84. If bFailed And hPort <> 0 Then
    85. CloseHandle hPort
    86. hPort = 0
    87. End If
    88. OpenCom = Not bFailed
    89. End Function
    90. Public Function SendCom(Data() As Byte) As Boolean
    91. Dim cbWritten As Long
    92. If WriteFile(hPort, Data(0), UBound(Data) + 1, cbWritten, 0&) = 0 Then
    93. 'failed to write at all
    94. ElseIf cbWritten <> UBound(Data) + 1 Then
    95. 'failed to write all bytes
    96. Else
    97. SendCom = True 'sent succcessfuly
    98. Logcom StrConv(Data, vbUnicode), "--> "
    99. End If
    100. End Function
    101. Public Function ReadCom(Buffer() As Byte) As Long
    102. Dim cbRead As Long
    103. Call ReadFile(hPort, Buffer(0), UBound(Buffer) + 1, cbRead, 0)
    104. ReadCom = cbRead
    105. If cbRead > 0 Then
    106. Logcom Left(StrConv(Buffer, vbUnicode), cbRead), "<-- "
    107. End If
    108. End Function
    109. Public Sub CloseCom()
    110. Call CloseHandle(hPort)
    111. hPort = 0
    112. End Sub
    113. Public Function IsComOpen() As Boolean
    114. If hPort = 0 Or hPort = -1 Then
    115. IsComOpen = False
    116. Else
    117. IsComOpen = True
    118. End If
    119. End Function




    und in Tablle 1 habe ich mir 2 Butten eingebaut. Einmal Start, wenn diese gedrückt wird soll der comport geöffnet werden, Start an den Mikrocontroller gesendet werden und solange der COM port ausgelesen werden bis ich Stop Drücke.

    Wenn Ich stop drücke soll der com Ort nicht mehr ausgelesen weden, Stop an den Mikrocontroller gesendet werden und der comport geschlossen werden.



    Tabelle 1:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim a As Integer
    2. Dim eingabe As String
    3. Dim teil() As String
    4. Dim i As Integer
    5. Private Sub cmdStart_Click()
    6. a = 0
    7. 'variable a auf 0 setzen
    8. Call OpenCom(1, 9600, 8, 0, 1)
    9. 'sollte den com port öffnen für 9600 baud
    10. If Not SendCom("Start") Then Stop
    11. 'sollte ein Start an den Controller schicken
    12. Do While (a = 1)
    13. 'durch laufe die schleife bis Stop gedrückt wird
    14. ReDim btReceivedData(0)
    15. If ReadCom(btReceivedData) = 0 Then Stop
    16. 'liest ein byte von der schnittstelle
    17. Private Sub StrinSplitt()
    18. eingabe = Logcom
    19. teil = eingabe.Split(";")
    20. Sheets("Tabelle2").Range("A" & i).Value = "Kanal:" & vbCrLf
    21. For i = 0 To teil.Count –1
    22. Sheets("Tabelle2").Range("A" & i).Value = "Kanal" & i & ":" & teil(i) & vbCrLf
    23. 'trennt den über den COM Port empfangenen string, teil ihn auf und spreichert ihn in Tabelle 2
    24. Next
    25. End Sub
    26. End Sub
    27. Private Sub cmdStop_Click()
    28. a = 1
    29. 'variable a auf 1 setzen
    30. If Not SendCom("Stop") Then Stop
    31. 'sollte ein Stop an den Controller schicken
    32. Call CloseCom
    33. 'Schleißt den Comport
    34. End Sub
    35. End Sub



    Könnt ihr mir sagen ob das wohl so funktioniert wie ich mir das gedacht habe?