Csv file transfer directly into excel using vb for serial coms


Closed Thread
Results 1 to 7 of 7
  1. #1
    Join Date
    Feb 2012
    Location
    PERTH AUSTRALIA
    Posts
    838

    Default Csv file transfer directly into excel using vb for serial coms

    Hi Guys,

    i am looking to run Excel with a VB script running in Excel to capture the CSV data directly
    the data would then be available to be directly view fields provided with the Excel sheet

    Looking at this link it appears that the coms can be set up to do this with in the vb script running excel
    http://dev.emcelettronica.com/serial...n-in-excel-vba

    i have not tested this out as yet but it would have some advantages than using a dumb terminal saving the file then loading as i could do the data "live" as an option

    it looks like it maybe able to communicate back to the pic via the serial port check if the link is up and file has transfer ok

    Was hoping someone has tried this or has something similar than terminal dump program
    cheers

    Sheldon

  2. #2
    Join Date
    Nov 2003
    Location
    Greece
    Posts
    3,810


    Did you find this post helpful? Yes | No

    Default Re: Csv file transfer directly into excel using vb for serial coms

    It looks interesting the link you post but could not understand how to enable VBA in my Excel and use all these code that appears on te link.

    Need a step by step guide on Excel-VBA.

    Ioannis

  3. #3


    Did you find this post helpful? Yes | No

    Default Re: Csv file transfer directly into excel using vb for serial coms

    That's a hecka lotta code.

    A VB one would be much less work, it seems?

  4. #4
    Join Date
    Feb 2012
    Location
    PERTH AUSTRALIA
    Posts
    838


    Did you find this post helpful? Yes | No

    Default Re: Csv file transfer directly into excel using vb for serial coms

    the version shown in the link is for a 32bit version , one here that i am trying to get to run is the 64bit ver

    yes there is bit of code in it , but its all copy n paist

    Code:
    
    Option Explicit
    
    '-------------------------------------------------------------------------------
    
    '
    ' This VB module is a collection of routines to perform serial port I/O without
    ' using the Microsoft Comm Control component.  This module uses the Windows API
    ' to perform the overlapped I/O operations necessary for serial communications.
    '
    ' The routine can handle up to 4 serial ports which are identified with a
    ' Port ID.
    '
    ' All routines (with the exception of CommRead and CommWrite) return an error
    ' code or 0 if no error occurs.  The routine CommGetError can be used to get
    ' the complete error message.
    '-------------------------------------------------------------------------------
    
    '-------------------------------------------------------------------------------
    ' Public Constants
    '-------------------------------------------------------------------------------
    
    ' Output Control Lines (CommSetLine)
    Const LINE_BREAK = 1
    Const LINE_DTR = 2
    Const LINE_RTS = 3
    
    ' Input Control Lines  (CommGetLine)
    Const LINE_CTS = &H10&
    Const LINE_DSR = &H20&
    Const LINE_RING = &H40&
    Const LINE_RLSD = &H80&
    Const LINE_CD = &H80&
    
    '-------------------------------------------------------------------------------
    ' System Constants
    '-------------------------------------------------------------------------------
    Private Const ERROR_IO_INCOMPLETE = 996&
    Private Const ERROR_IO_PENDING = 997
    Private Const GENERIC_READ = &H80000000
    Private Const GENERIC_WRITE = &H40000000
    Private Const FILE_ATTRIBUTE_NORMAL = &H80
    Private Const FILE_FLAG_OVERLAPPED = &H40000000
    Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
    Private Const OPEN_EXISTING = 3
    
    ' COMM Functions
    Private Const MS_CTS_ON = &H10&
    Private Const MS_DSR_ON = &H20&
    Private Const MS_RING_ON = &H40&
    Private Const MS_RLSD_ON = &H80&
    Private Const PURGE_RXABORT = &H2
    Private Const PURGE_RXCLEAR = &H8
    Private Const PURGE_TXABORT = &H1
    Private Const PURGE_TXCLEAR = &H4
    
    ' COMM Escape Functions
    Private Const CLRBREAK = 9
    Private Const CLRDTR = 6
    Private Const CLRRTS = 4
    Private Const SETBREAK = 8
    Private Const SETDTR = 5
    Private Const SETRTS = 3
    
    '-------------------------------------------------------------------------------
    ' System Structures
    '-------------------------------------------------------------------------------
    Private Type COMSTAT
            fBitFields As Long ' See Comment in Win32API.Txt
            cbInQue As Long
            cbOutQue As Long
    End Type
    
    Private Type COMMTIMEOUTS
            ReadIntervalTimeout As Long
            ReadTotalTimeoutMultiplier As Long
            ReadTotalTimeoutConstant As Long
            WriteTotalTimeoutMultiplier As Long
            WriteTotalTimeoutConstant As Long
    End Type
    
    '
    ' The DCB structure defines the control setting for a serial
    ' communications device.
    '
    Private Type DCB
            DCBlength As Long
            BaudRate As Long
            fBitFields As Long ' See Comments in Win32API.Txt
            wReserved As Integer
            XonLim As Integer
            XoffLim As Integer
            ByteSize As Byte
            Parity As Byte
            StopBits As Byte
            XonChar As Byte
            XoffChar As Byte
            ErrorChar As Byte
            EofChar As Byte
            EvtChar As Byte
            wReserved1 As Integer 'Reserved; Do Not Use
    End Type
    
    Private Type OVERLAPPED
            Internal As Long
            InternalHigh As Long
            offset As Long
            OffsetHigh As Long
            hEvent As Long
    End Type
    
    Private Type SECURITY_ATTRIBUTES
            nLength As Long
            lpSecurityDescriptor As Long
            bInheritHandle As Long
    End Type
    
    '-------------------------------------------------------------------------------
    ' System Functions
    '-------------------------------------------------------------------------------
    '
    ' Fills a specified DCB structure with values specified in
    ' a device-control string.
    '
    Private Declare PtrSafe Function BuildCommDCB Lib "kernel32" Alias "BuildCommDCBA" _
        (ByVal lpDef As String, lpDCB As DCB) As Long
    '
    ' Retrieves information about a communications error and reports
    ' the current status of a communications device. The function is
    ' called when a communications error occurs, and it clears the
    ' device's error flag to enable additional input and output
    ' (I/O) operations.
    '
    Private Declare PtrSafe Function ClearCommError Lib "kernel32" _
        (ByVal hFile As Long, lpErrors As Long, lpStat As COMSTAT) As Long
    '
    ' Closes an open communications device or file handle.
    '
    Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    '
    ' Creates or opens a communications resource and returns a handle
    ' that can be used to access the resource.
    '
    Private Declare PtrSafe Function CreateFile Lib "kernel32" Alias "CreateFileA" _
        (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
        ByVal dwShareMode As Long, lpSecurityAttributes As Any, _
        ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
        ByVal hTemplateFile As Long) As Long
    '
    ' Directs a specified communications device to perform a function.
    '
    Private Declare PtrSafe Function EscapeCommFunction Lib "kernel32" _
        (ByVal nCid As Long, ByVal nFunc As Long) As Long
    '
    ' Formats a message string such as an error string returned
    ' by anoher function.
    '
    Private Declare PtrSafe Function FormatMessage Lib "kernel32" Alias "FormatMessageA" _
        (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, _
        ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, _
        Arguments As Long) As Long
    '
    ' Retrieves modem control-register values.
    '
    Private Declare PtrSafe Function GetCommModemStatus Lib "kernel32" _
        (ByVal hFile As Long, lpModemStat As Long) As Long
    '
    ' Retrieves the current control settings for a specified
    ' communications device.
    '
    Private Declare PtrSafe Function GetCommState Lib "kernel32" _
        (ByVal nCid As Long, lpDCB As DCB) As Long
    '
    ' Retrieves the calling thread's last-error code value.
    '
    Private Declare PtrSafe Function GetLastError Lib "kernel32" () As Long
    '
    ' Retrieves the results of an overlapped operation on the
    ' specified file, named pipe, or communications device.
    '
    Private Declare PtrSafe Function GetOverlappedResult Lib "kernel32" _
        (ByVal hFile As Long, lpOverlapped As OVERLAPPED, _
        lpNumberOfBytesTransferred As Long, ByVal bWait As Long) As Long
    '
    ' Discards all characters from the output or input buffer of a
    ' specified communications resource. It can also terminate
    ' pending read or write operations on the resource.
    '
    Private Declare PtrSafe Function PurgeComm Lib "kernel32" _
        (ByVal hFile As Long, ByVal dwFlags As Long) As Long
    '
    ' Reads data from a file, starting at the position indicated by the
    ' file pointer. After the read operation has been completed, the
    ' file pointer is adjusted by the number of bytes actually read,
    ' unless the file handle is created with the overlapped attribute.
    ' If the file handle is created for overlapped input and output
    ' (I/O), the application must adjust the position of the file pointer
    ' after the read operation.
    '
    Private Declare PtrSafe Function ReadFile Lib "kernel32" _
        (ByVal hFile As Long, ByVal lpBuffer As String, _
        ByVal nNumberOfBytesToRead As Long, ByRef lpNumberOfBytesRead As Long, _
        lpOverlapped As OVERLAPPED) As Long
    '
    ' Configures a communications device according to the specifications
    ' in a device-control block (a DCB structure). The function
    ' reinitializes all hardware and control settings, but it does not
    ' empty output or input queues.
    '
    Private Declare PtrSafe Function SetCommState Lib "kernel32" _
        (ByVal hCommDev As Long, lpDCB As DCB) As Long
    '
    ' Sets the time-out parameters for all read and write operations on a
    ' specified communications device.
    '
    Private Declare PtrSafe Function SetCommTimeouts Lib "kernel32" _
        (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
    '
    ' Initializes the communications parameters for a specified
    ' communications device.
    '
    Private Declare PtrSafe Function SetupComm Lib "kernel32" _
     (ByVal hFile As Long, ByVal dwInQueue As Long, ByVal dwOutQueue As Long) As Long
    '
    ' Writes data to a file and is designed for both synchronous and a
    ' synchronous operation. The function starts writing data to the file
    ' at the position indicated by the file pointer. After the write
    ' operation has been completed, the file pointer is adjusted by the
    ' number of bytes actually written, except when the file is opened with
    ' FILE_FLAG_OVERLAPPED. If the file handle was created for overlapped
    ' input and output (I/O), the application must adjust the position of
    ' the file pointer after the write operation is finished.
    '
    Private Declare PtrSafe Function WriteFile Lib "kernel32" _
        (ByVal hFile As Long, ByVal lpBuffer As String, _
        ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, _
        lpOverlapped As OVERLAPPED) As Long
    
    
    Private Declare PtrSafe Sub AppSleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
    '-------------------------------------------------------------------------------
    ' Program Constants
    '-------------------------------------------------------------------------------
    
    Private Const MAX_PORTS = 4
    
    '-------------------------------------------------------------------------------
    ' Program Structures
    '-------------------------------------------------------------------------------
    
    Private Type COMM_ERROR
        lngErrorCode As Long
        strFunction As String
        strErrorMessage As String
    End Type
    
    Private Type COMM_PORT
        lngHandle As Long
        blnPortOpen As Boolean
        udtDCB As DCB
    End Type
    
     
    
    '-------------------------------------------------------------------------------
    ' Program Storage
    '-------------------------------------------------------------------------------
    
    Private udtCommOverlap As OVERLAPPED
    Private udtCommError As COMM_ERROR
    Private udtPorts(1 To MAX_PORTS) As COMM_PORT
    '-------------------------------------------------------------------------------
    ' GetSystemMessage - Gets system error text for the specified error code.
    '-------------------------------------------------------------------------------
    Public Function GetSystemMessage(lngErrorCode As Long) As String
    Dim intPos As Integer
    Dim strMessage As String, strMsgBuff As String * 256
    
        Call FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, lngErrorCode, 0, strMsgBuff, 255, 0)
    
        intPos = InStr(1, strMsgBuff, vbNullChar)
        If intPos > 0 Then
            strMessage = Trim$(Left$(strMsgBuff, intPos - 1))
        Else
            strMessage = Trim$(strMsgBuff)
        End If
        
        GetSystemMessage = strMessage
        
    End Function
    Public Function PauseApp(PauseInSeconds As Long)
        
        Call AppSleep(PauseInSeconds * 1000)
        
    End Function
    
    '-------------------------------------------------------------------------------
    ' CommOpen - Opens/Initializes serial port.
    '
    '
    ' Parameters:
    '   intPortID   - Port ID used when port was opened.
    '   strPort     - COM port name. (COM1, COM2, COM3, COM4)
    '   strSettings - Communication settings.
    '                 Example: "baud=9600 parity=N data=8 stop=1"
    '
    ' Returns:
    '   Error Code  - 0 = No Error.
    '
    '-------------------------------------------------------------------------------
    Public Function CommOpen(intPortID As Integer, strPort As String, _
        strSettings As String) As Long
        
    Dim lngStatus       As Long
    Dim udtCommTimeOuts As COMMTIMEOUTS
    
        On Error GoTo Routine_Error
        
        ' See if port already in use.
        If udtPorts(intPortID).blnPortOpen Then
            lngStatus = -1
            With udtCommError
                .lngErrorCode = lngStatus
                .strFunction = "CommOpen"
                .strErrorMessage = "Port in use."
            End With
            
            GoTo Routine_Exit
        End If
    
        ' Open serial port.
        udtPorts(intPortID).lngHandle = CreateFile(strPort, GENERIC_READ Or _
            GENERIC_WRITE, 0, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    
        If udtPorts(intPortID).lngHandle = -1 Then
            lngStatus = SetCommError("CommOpen (CreateFile)")
            GoTo Routine_Exit
        End If
    
        udtPorts(intPortID).blnPortOpen = True
    
        ' Setup device buffers (1K each).
        lngStatus = SetupComm(udtPorts(intPortID).lngHandle, 1024, 1024)
        
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommOpen (SetupComm)")
            GoTo Routine_Exit
        End If
    
        ' Purge buffers.
        lngStatus = PurgeComm(udtPorts(intPortID).lngHandle, PURGE_TXABORT Or _
            PURGE_RXABORT Or PURGE_TXCLEAR Or PURGE_RXCLEAR)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommOpen (PurgeComm)")
            GoTo Routine_Exit
        End If
    
        ' Set serial port timeouts.
        With udtCommTimeOuts
            .ReadIntervalTimeout = -1
            .ReadTotalTimeoutMultiplier = 0
            .ReadTotalTimeoutConstant = 1000
            .WriteTotalTimeoutMultiplier = 0
            .WriteTotalTimeoutConstant = 1000
        End With
    
        lngStatus = SetCommTimeouts(udtPorts(intPortID).lngHandle, udtCommTimeOuts)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommOpen (SetCommTimeouts)")
            GoTo Routine_Exit
        End If
    
        ' Get the current state (DCB).
        lngStatus = GetCommState(udtPorts(intPortID).lngHandle, _
            udtPorts(intPortID).udtDCB)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommOpen (GetCommState)")
            GoTo Routine_Exit
        End If
    
        ' Modify the DCB to reflect the desired settings.
        lngStatus = BuildCommDCB(strSettings, udtPorts(intPortID).udtDCB)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommOpen (BuildCommDCB)")
            GoTo Routine_Exit
        End If
    
        ' Set the new state.
        lngStatus = SetCommState(udtPorts(intPortID).lngHandle, _
            udtPorts(intPortID).udtDCB)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommOpen (SetCommState)")
            GoTo Routine_Exit
        End If
    
        lngStatus = 0
    
    Routine_Exit:
        CommOpen = lngStatus
        Exit Function
    
    Routine_Error:
        lngStatus = Err.Number
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommOpen"
            .strErrorMessage = Err.Description
        End With
        Resume Routine_Exit
    End Function
    
    
    Private Function SetCommError(strFunction As String) As Long
        
        With udtCommError
            .lngErrorCode = Err.LastDllError
            .strFunction = strFunction
            .strErrorMessage = GetSystemMessage(.lngErrorCode)
            SetCommError = .lngErrorCode
        End With
        
    End Function
    
    Private Function SetCommErrorEx(strFunction As String, lngHnd As Long) As Long
    Dim lngErrorFlags As Long
    Dim udtCommStat As COMSTAT
        
        With udtCommError
            .lngErrorCode = GetLastError
            .strFunction = strFunction
            .strErrorMessage = GetSystemMessage(.lngErrorCode)
        
            Call ClearCommError(lngHnd, lngErrorFlags, udtCommStat)
        
            .strErrorMessage = .strErrorMessage & "  COMM Error Flags = " & _
                    Hex$(lngErrorFlags)
            
            SetCommErrorEx = .lngErrorCode
        End With
        
    End Function
    
    '-------------------------------------------------------------------------------
    ' CommSet - Modifies the serial port settings.
    '
    ' Parameters:
    '   intPortID   - Port ID used when port was opened.
    '   strSettings - Communication settings.
    '                 Example: "baud=9600 parity=N data=8 stop=1"
    '
    ' Returns:
    '   Error Code  - 0 = No Error.
    '-------------------------------------------------------------------------------
    Public Function CommSet(intPortID As Integer, strSettings As String) As Long
        
    Dim lngStatus As Long
        
        On Error GoTo Routine_Error
    
        lngStatus = GetCommState(udtPorts(intPortID).lngHandle, _
            udtPorts(intPortID).udtDCB)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommSet (GetCommState)")
            GoTo Routine_Exit
        End If
    
        lngStatus = BuildCommDCB(strSettings, udtPorts(intPortID).udtDCB)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommSet (BuildCommDCB)")
            GoTo Routine_Exit
        End If
    
        lngStatus = SetCommState(udtPorts(intPortID).lngHandle, _
            udtPorts(intPortID).udtDCB)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommSet (SetCommState)")
            GoTo Routine_Exit
        End If
    
        lngStatus = 0
    
    Routine_Exit:
        CommSet = lngStatus
        Exit Function
    
    Routine_Error:
        lngStatus = Err.Number
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommSet"
            .strErrorMessage = Err.Description
        End With
        Resume Routine_Exit
    End Function
    
    '-------------------------------------------------------------------------------
    ' CommClose - Close the serial port.
    '
    ' Parameters:
    '   intPortID   - Port ID used when port was opened.
    '
    ' Returns:
    '   Error Code  - 0 = No Error.
    '-------------------------------------------------------------------------------
    Public Function CommClose(intPortID As Integer) As Long
        
    Dim lngStatus As Long
        
        On Error GoTo Routine_Error
    
        If udtPorts(intPortID).blnPortOpen Then
            lngStatus = CloseHandle(udtPorts(intPortID).lngHandle)
        
            If lngStatus = 0 Then
                lngStatus = SetCommError("CommClose (CloseHandle)")
                GoTo Routine_Exit
            End If
        
            udtPorts(intPortID).blnPortOpen = False
        End If
    
        lngStatus = 0
    
    Routine_Exit:
        CommClose = lngStatus
        Exit Function
    
    Routine_Error:
        lngStatus = Err.Number
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommClose"
            .strErrorMessage = Err.Description
        End With
        Resume Routine_Exit
    End Function
    
    '-------------------------------------------------------------------------------
    ' CommFlush - Flush the send and receive serial port buffers.
    '
    ' Parameters:
    '   intPortID   - Port ID used when port was opened.
    '
    ' Returns:
    '   Error Code  - 0 = No Error.
    '-------------------------------------------------------------------------------
    Public Function CommFlush(intPortID As Integer) As Long
        
    Dim lngStatus As Long
        
        On Error GoTo Routine_Error
    
        lngStatus = PurgeComm(udtPorts(intPortID).lngHandle, PURGE_TXABORT Or _
            PURGE_RXABORT Or PURGE_TXCLEAR Or PURGE_RXCLEAR)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommFlush (PurgeComm)")
            GoTo Routine_Exit
        End If
    
        lngStatus = 0
    
    Routine_Exit:
        CommFlush = lngStatus
        Exit Function
    
    Routine_Error:
        lngStatus = Err.Number
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommFlush"
            .strErrorMessage = Err.Description
        End With
        Resume Routine_Exit
    End Function
    
    '-------------------------------------------------------------------------------
    ' CommRead - Read serial port input buffer.
    '
    ' Parameters:
    '   intPortID   - Port ID used when port was opened.
    '   strData     - Data buffer.
    '   lngSize     - Maximum number of bytes to be read.
    '
    ' Returns:
    '   Error Code  - 0 = No Error.
    '-------------------------------------------------------------------------------
    Public Function CommRead(intPortID As Integer, strData As String, _
        lngSize As Long) As Long
    
    Dim lngStatus As Long
    Dim lngRdSize As Long, lngBytesRead As Long
    Dim lngRdStatus As Long, strRdBuffer As String * 1024
    Dim lngErrorFlags As Long, udtCommStat As COMSTAT
        
        On Error GoTo Routine_Error
    
        strData = ""
        lngBytesRead = 0
        DoEvents
        
        ' Clear any previous errors and get current status.
        lngStatus = ClearCommError(udtPorts(intPortID).lngHandle, lngErrorFlags, _
            udtCommStat)
    
        If lngStatus = 0 Then
            lngBytesRead = -1
            lngStatus = SetCommError("CommRead (ClearCommError)")
            GoTo Routine_Exit
        End If
    '---------------------------------------------------------------------------------
    '    If udtCommStat.cbInQue > 0 Then
    '        If udtCommStat.cbInQue > lngSize Then
    '            lngRdSize = udtCommStat.cbInQue
    '        Else
    '            lngRdSize = lngSize
    '        End If
    '    Else
    '        lngRdSize = 0
    '    End If
    '------------------------------------------------------------------------------------
    
        lngRdSize = lngSize
        If lngRdSize Then
            lngRdStatus = ReadFile(udtPorts(intPortID).lngHandle, strRdBuffer, _
                lngRdSize, lngBytesRead, udtCommOverlap)
    
            If lngRdStatus = 0 Then
                lngStatus = GetLastError
                If lngStatus = ERROR_IO_PENDING Then
                    ' Wait for read to complete.
                    ' This function will timeout according to the
                    ' COMMTIMEOUTS.ReadTotalTimeoutConstant variable.
                    ' Every time it times out, check for port errors.
    
                    ' Loop until operation is complete.
                    While GetOverlappedResult(udtPorts(intPortID).lngHandle, _
                        udtCommOverlap, lngBytesRead, True) = 0
                                        
                        lngStatus = GetLastError
                                            
                        If lngStatus <> ERROR_IO_INCOMPLETE Then
                            lngBytesRead = -1
                            lngStatus = SetCommErrorEx( _
                                "CommRead (GetOverlappedResult)", _
                                udtPorts(intPortID).lngHandle)
                            GoTo Routine_Exit
                        End If
                    Wend
                Else
                    ' Some other error occurred.
                    lngBytesRead = -1
                    lngStatus = SetCommErrorEx("CommRead (ReadFile)", _
                        udtPorts(intPortID).lngHandle)
                    GoTo Routine_Exit
                
                End If
            End If
        
            strData = Left$(strRdBuffer, lngBytesRead)
        End If
    
    Routine_Exit:
        CommRead = lngBytesRead
        Exit Function
    
    Routine_Error:
        lngBytesRead = -1
        lngStatus = Err.Number
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommRead"
            .strErrorMessage = Err.Description
        End With
        Resume Routine_Exit
    End Function
    
    '-------------------------------------------------------------------------------
    ' CommWrite - Output data to the serial port.
    '
    ' Parameters:
    '   intPortID   - Port ID used when port was opened.
    '   strData     - Data to be transmitted.
    '
    ' Returns:
    '   Error Code  - 0 = No Error.
    '-------------------------------------------------------------------------------
    Public Function CommWrite(intPortID As Integer, strData As String) As Long
        
    Dim i As Integer
    Dim lngStatus As Long, lngSize As Long
    Dim lngWrSize As Long, lngWrStatus As Long
        
        On Error GoTo Routine_Error
        
        ' Get the length of the data.
        lngSize = Len(strData)
    
        ' Output the data.
        lngWrStatus = WriteFile(udtPorts(intPortID).lngHandle, strData, lngSize, _
            lngWrSize, udtCommOverlap)
    
        ' Note that normally the following code will not execute because the driver
        ' caches write operations. Small I/O requests (up to several thousand bytes)
        ' will normally be accepted immediately and WriteFile will return true even
        ' though an overlapped operation was specified.
            
        DoEvents
        
        If lngWrStatus = 0 Then
            lngStatus = GetLastError
            If lngStatus = 0 Then
                GoTo Routine_Exit
            ElseIf lngStatus = ERROR_IO_PENDING Then
                ' We should wait for the completion of the write operation so we know
                ' if it worked or not.
                '
                ' This is only one way to do this. It might be beneficial to place the
                ' writing operation in a separate thread so that blocking on completion
                ' will not negatively affect the responsiveness of the UI.
                '
                ' If the write takes long enough to complete, this function will
                ' timeout
                ' according to the CommTimeOuts.WriteTotalTimeoutConstant variable.
                ' At that time we can check for errors and then wait some more.
    
                ' Loop until operation is complete.
                While GetOverlappedResult(udtPorts(intPortID).lngHandle, _
                    udtCommOverlap, lngWrSize, True) = 0
                                    
                    lngStatus = GetLastError
                                        
                    If lngStatus <> ERROR_IO_INCOMPLETE Then
                        lngStatus = SetCommErrorEx( _
                            "CommWrite (GetOverlappedResult)", _
                            udtPorts(intPortID).lngHandle)
                        GoTo Routine_Exit
                    End If
                Wend
            Else
                ' Some other error occurred.
                lngWrSize = -1
                        
                lngStatus = SetCommErrorEx("CommWrite (WriteFile)", _
                    udtPorts(intPortID).lngHandle)
                GoTo Routine_Exit
            
            End If
        End If
        
        For i = 1 To 10
            DoEvents
        Next
        
    Routine_Exit:
        CommWrite = lngWrSize
        Exit Function
    
    Routine_Error:
        lngStatus = Err.Number
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommWrite"
            .strErrorMessage = Err.Description
        End With
        Resume Routine_Exit
    End Function
    
    '-------------------------------------------------------------------------------
    ' CommGetLine - Get the state of selected serial port control lines.
    '
    ' Parameters:
    '   intPortID   - Port ID used when port was opened.
    '   intLine     - Serial port line. CTS, DSR, RING, RLSD (CD)
    '   blnState    - Returns state of line (Cleared or Set).
    '
    ' Returns:
    '   Error Code  - 0 = No Error.
    '-------------------------------------------------------------------------------
    Public Function CommGetLine(intPortID As Integer, intLine As Integer, _
       blnState As Boolean) As Long
        
    Dim lngStatus As Long
    Dim lngComStatus As Long, lngModemStatus As Long
        
        On Error GoTo Routine_Error
    
        lngStatus = GetCommModemStatus(udtPorts(intPortID).lngHandle, lngModemStatus)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommReadCD (GetCommModemStatus)")
            GoTo Routine_Exit
        End If
    
        If (lngModemStatus And intLine) Then
            blnState = True
        Else
            blnState = False
        End If
            
        lngStatus = 0
            
    Routine_Exit:
        CommGetLine = lngStatus
        Exit Function
    
    Routine_Error:
        lngStatus = Err.Number
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommReadCD"
            .strErrorMessage = Err.Description
        End With
        Resume Routine_Exit
    End Function
    
    '-------------------------------------------------------------------------------
    ' CommSetLine - Set the state of selected serial port control lines.
    '
    ' Parameters:
    '   intPortID   - Port ID used when port was opened.
    '   intLine     - Serial port line. BREAK, DTR, RTS
    '                 Note: BREAK actually sets or clears a "break" condition on
    '                 the transmit data line.
    '   blnState    - Sets the state of line (Cleared or Set).
    '
    ' Returns:
    '   Error Code  - 0 = No Error.
    '-------------------------------------------------------------------------------
    Public Function CommSetLine(intPortID As Integer, intLine As Integer, _
       blnState As Boolean) As Long
       
    Dim lngStatus As Long
    Dim lngNewState As Long
        
        On Error GoTo Routine_Error
        
        If intLine = LINE_BREAK Then
            If blnState Then
                lngNewState = SETBREAK
            Else
                lngNewState = CLRBREAK
            End If
        
        ElseIf intLine = LINE_DTR Then
            If blnState Then
                lngNewState = SETDTR
            Else
                lngNewState = CLRDTR
            End If
        
        ElseIf intLine = LINE_RTS Then
            If blnState Then
                lngNewState = SETRTS
            Else
                lngNewState = CLRRTS
            End If
        End If
    
        lngStatus = EscapeCommFunction(udtPorts(intPortID).lngHandle, lngNewState)
    
        If lngStatus = 0 Then
            lngStatus = SetCommError("CommSetLine (EscapeCommFunction)")
            GoTo Routine_Exit
        End If
    
        lngStatus = 0
            
    Routine_Exit:
        CommSetLine = lngStatus
        Exit Function
    
    Routine_Error:
        lngStatus = Err.Number
        With udtCommError
            .lngErrorCode = lngStatus
            .strFunction = "CommSetLine"
            .strErrorMessage = Err.Description
        End With
        Resume Routine_Exit
    End Function
    
    
    
    Private Sub CommandButton1_Click()
        Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
        Dim lngStatus As Long
    
        
         intPortID = 3
    
        ' Open COM port
        lngStatus = CommOpen(intPortID, "COM" & CStr(intPortID), _
            "baud=19200 parity=N data=8 stop=1")
    End Sub
    
    Private Sub CommandButton2_Click()
        Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
        Dim lngStatus As Long
        Dim strData   As String
    
    
        intPortID = 3
        strData = "*IDN?;"
        
    
       'Writa data
        lngStatus = CommWrite(intPortID, strData)
    End Sub
    
    
    Private Sub CommandButton3_Click()
        Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
        Dim lngStatus As Long
        Dim strData   As String
    
    
    
        intPortID = 3
        lngStatus = CommRead(intPortID, strData, 10)
    
    End Sub
    
    Private Sub CommandButton4_Click()
        Dim intPortID As Integer ' Ex. 1, 2, 3, 4 for COM1 - COM4
           
           
        intPortID = 3
        Call CommClose(intPortID)
      
    End Sub

  5. #5
    Join Date
    Feb 2012
    Location
    PERTH AUSTRALIA
    Posts
    838


    Did you find this post helpful? Yes | No

    Default Re: Csv file transfer directly into excel using vb for serial coms

    also from that web page other link info


    http://www.ozgrid.com/forum/showthre...168472&page=2&

  6. #6
    Join Date
    May 2013
    Location
    australia
    Posts
    2,389


    Did you find this post helpful? Yes | No

    Default Re: Csv file transfer directly into excel using vb for serial coms

    before learning python I used this excel datalogger , it takes up to 12 ascii hex format word vars from the serial port of your choice adds a timestamp ,and some graphs

    press the logger button to set it up .

    python is so much easier and nicer and more powerful than vb I never used vb ever again esp with SQLite3 db added to the mix
    Attached Files Attached Files
    Warning I'm not a teacher

  7. #7
    Join Date
    Feb 2012
    Location
    PERTH AUSTRALIA
    Posts
    838


    Did you find this post helpful? Yes | No

    Default Re: Csv file transfer directly into excel using vb for serial coms

    thanks richard

    it has less code in it than the other xcell example - it is 32bit but not hard to change that or allow both 32or 64 to run it


    the main advantage is excel has vb built in so as long as you can open excel load the work sheet with the macro ( either for 32bit or 64bit ver of the sheet) not need to do more to capture the data coming

    i would eventually like to learn python but i have some basic understanding of VB structure and would like to make this work in as short a time as possible

    i not done VB for a few years , so setting up the forms , etc need to be reviewed


    cheers
    sheldon

Similar Threads

  1. serial coms - again
    By malc-c in forum mel PIC BASIC Pro
    Replies: 57
    Last Post: - 26th September 2010, 13:10
  2. Serial coms with a pc
    By Andre_Pretorius in forum Serial
    Replies: 13
    Last Post: - 18th June 2007, 14:41
  3. Off Topic?? - Serial coms.
    By muddy0409 in forum Schematics
    Replies: 9
    Last Post: - 19th April 2007, 06:42
  4. Wireless file transfer
    By Ron Marcus in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 27th December 2005, 12:11
  5. large file transfer petween pics
    By Ron Marcus in forum mel PIC BASIC Pro
    Replies: 1
    Last Post: - 3rd July 2005, 17:04

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts