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 Giño](http://pics.miarroba.com/caretos/wink.gif)
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 Giño](http://pics.miarroba.com/caretos/wink.gif)
Else
" Borramos errores de comunicación previos
Dim lpErrCode As Integer
ClearCommError(hComm, lpErrCode, 0&
![Giño Giño](http://pics.miarroba.com/caretos/wink.gif)
"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