TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: victor_esp_1982 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."
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"
Else
" Borramos errores de comunicación previos
Dim lpErrCode As Integer
ClearCommError(hComm, lpErrCode, 0&
"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
-
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.
-
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.
-
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.
-
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.
-
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.