Autor Tema: PROGRAMAR PUERTO SERIE CON VISUAL BASIC.NET  (Leído 12870 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado victor_esp_1982

  • PIC10
  • *
  • Mensajes: 22
PROGRAMAR PUERTO SERIE CON VISUAL BASIC.NET
« en: 26 de Mayo de 2005, 04:50:00 »
HOLA:
¿que tal amigos?
Os comento, he echo un interfaz para enviar instrucciones a mi microcontrolador, un PIC de la familia 18 mediante puerto serie. El interfaz lo hice con la version .NET de visual basic, que creo que no tiene el componente de la 6.0 MSCOMM.Buscando por internet encontre un ejemplo de programar el puerto serie que incluyendo dll y estructuras ponia que transmitia y recibia. Lo ajuste a mi interfaz y ahora al probarlo con el micro me da problemas. Hay veces que lo hace bien y otras mal.
Se que el problema es del interfaz pq al hacerlo con el hyperterminal de Windows hace todo bien le micro asiq de la programacion de este no es.

Alguien sabe como puedo programar el puerto serie con Visual Basic. NET
-Agradeceria un ejemplo
-Cualquier tipo de informacion o documentacion
No se, lo q sea

Muchas gracias

El ejemplo que encontre es el siguiente, lo copio haber si alguien se quiere entretener en mirarlo y decirme si lo sabe q esta mal.

Por lo que se de C es muy parecido, pq se utilizan estas mismas funciones para programar el puerto serie









Imports System.Threading.Thread         " Para Sleep
Imports System.Threading
Imports System.Runtime.InteropServices  " Para CreateFile,etc...
Imports System.Text




Const GENERIC_READ As Integer = &H80000000
    Const GENERIC_WRITE As Integer = &H40000000
    Const OPEN_EXISTING As Integer = 3
    Const FILE_FLAG_OVERLAPPED As Int32 = &H40000000
    Const PURGE_RXABORT As Integer = &H2
    Const PURGE_RXCLEAR As Integer = &H8
    Const PURGE_TXABORT As Integer = &H1
    Const PURGE_TXCLEAR As Integer = &H4

"Estructura usada para llamar a Windows API.
    <StructLayout(LayoutKind.Sequential, Pack:=1)> Public Structure OVERLAPPED
        Public Internal As Integer
        Public InternalHigh As Integer
        Public Offset As Integer
        Public OffsetHigh As Integer
        Public hEvent As Integer
    End Structure
    "Estructura para programar las propiedades del puerto serie mediante sus campos
    <StructLayout(LayoutKind.Sequential, Pack:=1)> Private Structure DCB
        Public DCBlength As Integer
        Public BaudRate As Integer
        Public Bits1 As Integer
        Public wReserved As Integer
        Public XonLim As Integer
        Public XoffLim As Integer
        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 wReserved2 As Integer
        Public fRtsControl As Integer
    End Structure
    "Estructura para programar los tiempos de espera del puerto serie
    <StructLayout(LayoutKind.Sequential, Pack:=1)> Private Structure COMMTIMEOUTS
        Public ReadIntervalTimeout As Integer
        Public ReadTotalTimeoutMultiplier As Integer
        Public ReadTotalTimeoutConstant As Integer
        Public WriteTotalTimeoutMultiplier As Integer
        Public WriteTotalTimeoutConstant As Integer
    End Structure



//Añaden dll q contienen funciones q se utilizan despues. Si a alguien le interesa las pongo



 Dim hComm As Integer = -1
    Dim Comms(4) As Boolean
    Dim Port As Integer = 1         " Inicial , 1 = COM1, 2=COM2
    Dim Baud As Integer = 9600  
    Const WAIT_TIME As Integer = 200




 "Funcion creada para escribir en el puerto la cadena de caracteres que se envia por parametro
    Private Sub Write(ByVal Buffer As String)
        Dim iBytesWritten As Integer

        Buffer = Buffer.ToString & Chr(13)

        Dim oEncoder As New System.Text.ASCIIEncoding
        Dim BufferBt As Byte() = oEncoder.GetBytes(Buffer)

        If hComm <> -1 Then
            "Clears IO Buffers
            "Borramos Buffers de entrada y salida
            PurgeComm(hComm, PURGE_RXCLEAR Or PURGE_TXCLEAR)
            WriteFile(hComm, BufferBt, BufferBt.Length, iBytesWritten, Nothing)
        Else

            MsgBox("No se puede escribir, el puerto no está abierto."Giño
        End If
    End Sub




 " Aquí se envía cadena(i), que son cada una de las líneas
                Dim uDCB As DCB
                Dim BufferSizeIn As Integer = 1024
                Dim BufferSizeOut As Integer = 1024

                hComm = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0)

                If hComm = -1 Then
                    MsgBox("No se puede abrir el puerto"Giño
                Else
                    " Borramos errores de comunicación previos
                    Dim lpErrCode As Integer
                    ClearCommError(hComm, lpErrCode, 0&Giño

                    "Borramos Buffers de entrada y salida
                    PurgeComm(hComm, PURGE_RXCLEAR Or PURGE_TXCLEAR)

                    "Obtenemos configuración del puerto
                    GetCommState(hComm, uDCB)

                    "Configuramos Estado DCB
                    BuildCommDCB(String.Format("baud={0} parity=NOPARITY data=8 stop=0", Baud), uDCB)
                    SetCommState(hComm, uDCB)

                    "Configuramos Buffers de entrada y salida
                    SetupComm(hComm, BufferSizeIn, BufferSizeOut)

                    "Configuramos Tiempos Límite
                    Dim TimeOuts As COMMTIMEOUTS

                    TimeOuts.ReadIntervalTimeout = 0
                    TimeOuts.ReadTotalTimeoutMultiplier = 0
                    TimeOuts.ReadTotalTimeoutConstant = 1000
                    TimeOuts.WriteTotalTimeoutMultiplier = 10
                    TimeOuts.WriteTotalTimeoutConstant = 100
                    SetCommTimeouts(hComm, TimeOuts)
                    Write(cadena(i))
                    Sleep(WAIT_TIME)


                    "Close the Port
                    CloseHandle(hComm)
                    hComm = -1

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: PROGRAMAR PUERTO SERIE CON VISUAL BASIC.NET
« Respuesta #1 en: 26 de Mayo de 2005, 12:16:00 »
Visual Studio .NET no incluye el control MsComm, yo actualmente estoy reescribiendo un proyecto mío hecho en VB 6 y antes de empezar averigué esto porque no quiero perder el tema de la comunicación serie. Si bien tengo entendido que se puede usar el control Comm.ocx de la versión 6 creo que no es recomendable.
Lo más acertado que ví hasta ahora es el NetCommOCX que es un wrapper (envoltura) del control original adaptado a .NET que parece funcionar bien, aunque todavía no probé. Está disponible en http://ourworld.compuserve.com/homepages/richard_grier/NETCommOCX.htm y aparentemente es freeware y no tiene limitaciones salvo que se quiera usar control de errores que creo que no está implementado.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
RE: PROGRAMAR PUERTO SERIE CON VISUAL BASIC.NET
« Respuesta #2 en: 26 de Mayo de 2005, 14:26:00 »
Colores, tú que ya has empezado en .NET, cuéntanos un poco si merece la pena cambiar, cuáles son las ventajas y los inconvenientes frente a VB.

Desconectado Colores

  • Moderadores
  • PIC16
  • *****
  • Mensajes: 232
RE: PROGRAMAR PUERTO SERIE CON VISUAL BASIC.NET
« Respuesta #3 en: 26 de Mayo de 2005, 21:51:00 »
Todavía mi experiencia en .NET es muy poca...
Lo único que puedo adelantar que lo mas sencillo para empezar a migrar es de VB 6 a VB.Net que, aunque parezca obvio no lo es tanto, porque cambian muchos conceptos y formas de programación.
Yo actualmente estoy migrando de VB 6 a C# y se nota bastante el cambio, principalmente porque nunca había programado en ninguna variante de C.
Con respecto a VB.Net la mayoría de las instrucciones no cambian demasiado, es más, si no se pretende hacer una aplicación de muy alto vuelo con la documentación y los foros y recursos que hay en la web no debería haber demasiados problemas.
La diferencia mas grande está en el hecho de que en cualquier programa de .Net cualquier cosa que se haga está basado integramente en objetos, no es una aproximación a la teoría de objetos como VB 6. En .Net TODO es objetos, un string, un control, un array... VB.NET es totalmente un lenguaje orientado a objetos con herencia y todo. También permite crear threads o hilos o tramas de ejecución y otras cosas que antes nos se podían hacer.
Otra cosa es que se basa en el framework, que es un entorno que incluye todo lo que es .Net, o sea controles, funciones del sistema, etc. En vez de llamar a una API de Windows para saber los directorios que hay en una ruta se usa en objeto IO (input-output) de la clase System. Se terminaron los problemas de OCX"s y versiones de componentes...
Al decir verdad las funciones propias de cada lenguaje son pocas, están los tradicionales If, For, Select Case... el resto derivan de construcciones del objeto System. Por ejemplo: para ordenar un array "a" se usaría  Array.Sort(a), o sea, "a" es una clase de array y sort es ordenar, no se si se entiende.
Esta sentencia no depende del lenguaje, por lo tanto se escribe igual en VB o en C# con lo que quiero demostrar que todo lo que dependa de el Framework se escribe igual en cualquier lenguaje facilitando mucho las cosas.

Existen otras limitaciones, como por ejemplo el encontrarme conque el FileListBox no existe en .Net y cosas similares, pero igual hay manera de hacerlas de otra forma.
El tema de graficos y archivos es muy superior. No sé, son algunas de las cosas que se me ocurren ahora...

Es conveniente? Y... es el futuro. Los programas hechos en VB 6 funcionan bien en W98 y XP, pero mas adelante irán perdiendo funcionalidad. VB 6 no es muy "serio" para aplicaciones grandes. El punto bueno de .NET es que Microsoft liberó las especificaciones del lenguaje para que cualquiera lo pueda desarrollar, de ahí que vemos el nacimiento del "Proyecto Mono" que pretende utilizar el C# de .NET en plataformas Linux y así poder crear aplicaciones multiplataforma a partir de cualquier programa escrito en .NET (o por lo menos por ahora de los que están hechos en C#, de ahí mi interés por migrar a C#).

Conclusión: si hay tiempo y ganas de aprender, vale la pena. Al menos eso creo yo que recién estoy empezando (...y espero no arrepentirme).

Salu2.

Desconectado andros

  • PIC16
  • ***
  • Mensajes: 111
Re: PROGRAMAR PUERTO SERIE CON VISUAL BASIC.NET
« Respuesta #4 en: 09 de Noviembre de 2007, 01:26:18 »
Adicionando un poco a los comentarios, .NET permite fácilmente tener una interfaz entre tu programa y los motores de bases de datos. Adicionalmente, !PERMITE HACER APLICACIONES WEB! de una forma "supremamente" sencilla..., imaginemos entonces la siguiente aplicación:

* En un laboratorio de metrología requieres guardar la información de unas mediciones calculadas con tu sistema (obviamente con un pic), guardas los datos en una pc, esta aplicación requiere asociar también los datos con la referencia del producto que se está fabricando, las fechas y todo lo que quieran imaginar (ustedes saben, seguimiento a la calidad), con .NET puedes hacer esto guardando los resultados en las tablas que componen tu base de datos..., pero va más allá, Dependiendo de tu aplicación puedes ver tus datos en un visor web, lo cual te da la posibilidad de acceder a los datos desde cualquier parte con una conexión a internet!

* .NET permite realizar aplicaciones que corran directamente en un servidor, también permite hacer aplicaciones para dispositivos portables.., es decir, PDA´s y teléfonos celulares....

Podría quedarme hablando de .NET todo el rato..., yo ya empecé (aún no lo domino), pero le veo futuro...


Saludos.
Andros!

Desconectado carfe

  • PIC10
  • *
  • Mensajes: 1
Re: PROGRAMAR PUERTO SERIE CON VISUAL BASIC.NET
« Respuesta #5 en: 14 de Mayo de 2011, 15:55:27 »
hola, como estan?...vi que el tema está un poco viejo, pero quice aportar un poco...justo ayer terminé un programa en vb.net para recibir datos por el puerto serie...mas tarde le voy a agregar mas cosas, como poder enviar datos...

les dejo el codigo en vb.net, y una imagen del soft...

Imports System.IO.Ports.SerialPort
Imports System.Windows.Forms.Form
Imports System.Threading


Public Delegate Sub DelegPuertoSerie()


Public Class Form1

    Dim datoRecibido As String

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        For Each sp As String In My.Computer.Ports.SerialPortNames
            Me.ComboBox1.Items.Add(sp)
        Next
        Me.btnConecar.Visible = True
        Me.Button2.Visible = False
        If IsNothing(Me.ComboBox1.SelectedItem) Then
            Me.btnConecar.Enabled = False
        Else
            Me.btnConecar.Enabled = True
        End If
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Me.SerialPort1.Close()
    End Sub

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        datoRecibido = SerialPort1.ReadExisting()
        escribir(datoRecibido)
    End Sub

    Public Sub Dato_a_Textobx()
        escribir(datoRecibido)
    End Sub

    Public Sub escribir(ByVal palabra As String)
        If Me.TextBox1.InvokeRequired Then
            Dim DelegadoTextBox As New DelegPuertoSerie(AddressOf Dato_a_Textobx)
            Me.Invoke(DelegadoTextBox)
        Else
            Me.TextBox1.Text = Me.TextBox1.Text + palabra
        End If
    End Sub

    Private Sub btnConecar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConecar.Click
        Me.SerialPort1.PortName = Me.ComboBox1.SelectedItem.ToString
        Me.SerialPort1.Open()
        Me.btnConecar.Visible = False
        Me.Button2.Visible = True
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.SerialPort1.Close()
        Me.btnConecar.Visible = True
        Me.Button2.Visible = False
    End Sub

    Private Sub ComboBox1_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedValueChanged
        Me.btnConecar.Enabled = True
    End Sub

End Class


la configuracion del puerto, la podes hacer desde la interface de diseño...en mi caso, dejé todo por defecto, salvo la velocidad, y el nombre del puerto.