Avatar billede LaBaKo Nybegynder
24. august 2004 - 13:25 Der er 1 kommentar

rs232 forbindelse, hvordan man skriver simpel tekst ud

Hej alle i store kodehovder ude i lille danmark eller hvor i nu end måtte befinde jer.

Jeg sidder her med et lille problem som jeg håber en af jer derude kan hjælpe mig med.

Kort og godt:
Jeg har aldrig rigtig kodet i VB eller VB.NET så jeg prøver stadig at forstå hvordan moduler etc hænger sammen.

Jeg har læst noget om at i de gamle versioner af VB bruger man MScomm til styring af rs232 forbindelsen, men denne ikke er til rådighed i VB.NET, men kan skulle kunne hente en klasse som skulle kunne styre forbindelsen den vej igennem.

Mit Problem er:

Jeg sidder med et vellemankit 8045 or prøver at skrive noget tekst ud på displayet.
Jeg har fundet et eksempel på microsofts hjemmeside hvor jeg i en console applikation kan skrive et enkelt 1 tal ud på displayet, men hvis jeg prøver med normal tekst skriver den ikke noget.
Jeg kunne lidt forestille mig det er fordi jeg sender Buffer as Byte, men hvis jeg prøver at ændre det til text eller String fejler compileren længere nede og siger noget med at Buffer er forkert...

Jeg kunne godt tænke mig hvis der var en der kunne hjælpe mig til at først og fremmest skrive det om til en form med GUI, jeg kan ikke helt finde ud af hvor man skal skrive sin kode når jeg laver en ny form / windows apllikation ?! Og gerne så den kan skrive text og andet end kun et 1 tal ud på displayet.

Jeg er heller ikke helt sikker på hvordan den styrer rs232 forbindelsen når man nu skulle hente klasser udefra og meget mere til VB.net,?!? Er der en der kan banke lidt fornuft ind i knolden på mig please ?!?!

Jeg brugte følgende eksempel: How To Access serial ports...
og skulle i følge dem selv skrive test ud.

http://support.microsoft.com/default.aspx?scid=kb;en-us;823179

Min kode som kan skrive 1 taller

---------------------- Kode Start ---------------------


Option Strict On

Class CommException
    Inherits ApplicationException
    Sub New(ByVal Reason As String)
        MyBase.New(Reason)
    End Sub
End Class

Module Module1

    Public Structure DCB
        Public DCBlength As Int32
        Public BaudRate As Int32
        Public fBitFields As Int32 'See Comments in Win32API.Txt
        Public wReserved As Int16
        Public XonLim As Int16
        Public XoffLim As Int16
        Public ByteSize As Byte
        Public Parity As Byte
        Public StopBits As Byte
        Public XonChar As Byte
        Public XoffChar As Byte
        Public ErrorChar As Byte
        Public EofChar As Byte
        Public EvtChar As Byte
        Public wReserved1 As Int16 'Reserved; Do Not Use
    End Structure

    Public Structure COMMTIMEOUTS
        Public ReadIntervalTimeout As Int32
        Public ReadTotalTimeoutMultiplier As Int32
        Public ReadTotalTimeoutConstant As Int32
        Public WriteTotalTimeoutMultiplier As Int32
        Public WriteTotalTimeoutConstant As Int32
    End Structure

    Public Const GENERIC_READ As Int32 = &H80000000
    Public Const GENERIC_WRITE As Int32 = &H40000000
    Public Const OPEN_EXISTING As Int32 = 3
    Public Const FILE_ATTRIBUTE_NORMAL As Int32 = &H80
    Public Const NOPARITY As Int32 = 0
    Public Const ONESTOPBIT As Int32 = 0

    Public Declare Auto Function CreateFile Lib "kernel32.dll" _
      (ByVal lpFileName As String, ByVal dwDesiredAccess As Int32, _
          ByVal dwShareMode As Int32, ByVal lpSecurityAttributes As IntPtr, _
            ByVal dwCreationDisposition As Int32, ByVal dwFlagsAndAttributes As Int32, _
                ByVal hTemplateFile As IntPtr) As IntPtr

    Public Declare Auto Function GetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
      ByRef lpDCB As DCB) As Boolean

    Public Declare Auto Function SetCommState Lib "kernel32.dll" (ByVal nCid As IntPtr, _
      ByRef lpDCB As DCB) As Boolean

    Public Declare Auto Function GetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
      ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

    Public Declare Auto Function SetCommTimeouts Lib "kernel32.dll" (ByVal hFile As IntPtr, _
      ByRef lpCommTimeouts As COMMTIMEOUTS) As Boolean

    Public Declare Auto Function WriteFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
      ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToWrite As Int32, _
          ByRef lpNumberOfBytesWritten As Int32, ByVal lpOverlapped As IntPtr) As Boolean

    Public Declare Auto Function ReadFile Lib "kernel32.dll" (ByVal hFile As IntPtr, _
      ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToRead As Int32, _
          ByRef lpNumberOfBytesRead As Int32, ByVal lpOverlapped As IntPtr) As Boolean

    Public Declare Auto Function CloseHandle Lib "kernel32.dll" (ByVal hObject As IntPtr) As Boolean

    Sub Main()

        Dim hSerialPort As IntPtr
        Dim Success As Boolean
        Dim MyDCB As DCB
        Dim MyCommTimeouts As COMMTIMEOUTS
        Dim BytesWritten, BytesRead As Int32
        Dim Buffer() As Byte

        ' Declare variables to use for encoding.
        Dim oEncoder As New System.Text.ASCIIEncoding
        Dim oEnc As System.Text.Encoding = oEncoder.GetEncoding(1252)

        ' Convert String to Byte().
        Buffer = oEnc.GetBytes("1")

        Try
            ' Serial port.
            Console.WriteLine("Opretter forbindelse til COM1 serial port")
            ' Obtain a handle to the COM1 serial port.
            hSerialPort = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, IntPtr.Zero, _
              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, IntPtr.Zero)
            ' Verify that the obtained handle is valid.
            If hSerialPort.ToInt32 = -1 Then
                Throw New CommException("Unable to obtain a handle to the COM1 port")
            End If
            ' Retrieve the current control settings.
            Success = GetCommState(hSerialPort, MyDCB)
            If Success = False Then
                Throw New CommException("Unable to retrieve the current control settings")
            End If
            ' Modify the properties of MyDCB as appropriate.
            ' WARNING: Make sure to modify the properties in accordance with their supported values.
            MyDCB.BaudRate = 2400
            MyDCB.ByteSize = 8
            MyDCB.Parity = NOPARITY
            MyDCB.StopBits = ONESTOPBIT
            ' Reconfigure COM1 based on the properties of MyDCB.
            Success = SetCommState(hSerialPort, MyDCB)
            If Success = False Then
                Throw New CommException("Unable to reconfigure COM1")
            End If
            ' Retrieve the current time-out settings.
            Success = GetCommTimeouts(hSerialPort, MyCommTimeouts)
            If Success = False Then
                Throw New CommException("Unable to retrieve current time-out settings")
            End If
            ' Modify the properties of MyCommTimeouts as appropriate.
            ' WARNING: Make sure to modify the properties in accordance with their supported values.
            MyCommTimeouts.ReadIntervalTimeout = 200
            MyCommTimeouts.ReadTotalTimeoutConstant = 200
            MyCommTimeouts.ReadTotalTimeoutMultiplier = 200
            MyCommTimeouts.WriteTotalTimeoutConstant = 200
            MyCommTimeouts.WriteTotalTimeoutMultiplier = 200
            ' Reconfigure the time-out settings, based on the properties of MyCommTimeouts.
            Success = SetCommTimeouts(hSerialPort, MyCommTimeouts)
            If Success = False Then
                Throw New CommException("Unable to reconfigure the time-out settings")
            End If
            ' Write data to COM1.
            Console.WriteLine("Vent mens der skrives til serielporten")
            Success = WriteFile(hSerialPort, Buffer, Buffer.Length, BytesWritten, IntPtr.Zero)
            If Success = False Then
                Throw New CommException("Unable to write to COM1")
            End If
            ' Read data from COM1.
            Success = ReadFile(hSerialPort, Buffer, BytesWritten, BytesRead, IntPtr.Zero)
            If Success = False Then
                Throw New CommException("Unable to read from COM1")
            End If
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        Finally
            ' Release the handle to COM1.
            Success = CloseHandle(hSerialPort)
            If Success = False Then
                Console.WriteLine("Unable to release handle to COM1")
            End If
        End Try

        Console.WriteLine("Tryk Return for at afslutte")
        Console.ReadLine()

    End Sub

End Module

---------------------- Kode Stop--------------------
Avatar billede LaBaKo Nybegynder
25. august 2004 - 09:08 #1
Aww... Er det så svær en opgave o.O?

Bump
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester