TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: lovando en 21 de Diciembre de 2004, 08:33:00
-
Hol amigos
Me podrian orientar a como enviar multitud de bytes/registros grabados en el PIC y recibir multitud de bytes y/o almacenarlos dinamicamente en el PIC, de modo que pueda tratarlos y ejecutar acciones segun el dato enviado
Quien tiene el post ese donde hablaban de como implementar un protocolo usuario en C para PIC usando el campo de datos del rs232 ( 1 byte)???
La idea es enviar serialmente varias tramas, cada una con un proposito especifico, a la ves de recibir varias tramas e interpretarlas segun mi propio protocolo implementado.....
PD: puede ser tanto un PIC sin usart (omo el 16F84) o uno con usart (16F628 , 16F877)
Muchas gracias por todo
Atte
Pic-chi
-
Buenas:
Estoy en lo mismo que tu, mas o menos he diseñado mi propio protocolo de comunicacion, si quieres una ayuda sobre esto te podria enviar el mio y explicartelo, pero creo que ya construiste el tuyo,n?
Tengo tb la duda de como enviar varios bytes a traves del puerto rs232, a ver si alguien tiene alguna idea sobre esto y nos puede ayudar
1saludo a tos
-
Visitar la página de Félix (Pacalaconcurso.com), allí hay un programita diseñado por él mismo con el que no vais a perder ni un byte.
Un saludo
-
Buenas:
Recibi el mensaje de que no te llego el archivo, ahora no te lo puedo pasar xq no lo tengo a mano, un dia de esta semana te lo envio o mejor te lo cuelgo aki y lo ves.
1Saludo
-
Hola..
El CSC en su carpeta de ejemplos trae un programita bastante útil, el CRC.C, con algunas modificaciones puede servir para usar con USART, el ejemplo usa la interrupción externa, el programa funciona muy bien y se pueden comunicar varios pics.. creo que puede ser muy útil, espero les sea de ayuda. 
Adios
-
Buenas:
Ahi va la informacion:
7. El protocolo de comunicación
Todo medio de comunicación, ya sea hablado, escrito, por señas o por señales de humo posee un protocolo. Nada hace pensar que en las comunicaciones electrónicas esto va a cambiar, así que como este proyecto se asienta principalmente en la comunicación entre dispositivos, este capítulo va dedicado a su propio protocolo de comunicación.
7.1 Niveles de comunicación
A modo de torre OSI, me he permitido definir tres niveles muy simples en la fase de comunicación de dos dispositivos. Estos niveles corresponden a los distintas fases por las que pasan los datos a la hora de salir de la memoria del ordenador/microcontrolador hasta llegar a su destino:
El nivel de aplicación sería para alguna aplicación futura que se montase sobre este sistema de comunicación, ya que al trabajar a tan bajo nivel y ser una aplicación dedicada, todos los comandos y funciones se definen en el nivel llamado Encapsulación Propia. El nivel de aplicación iría encapsulado en el campo de datos del EP (Encapsulación Propia)
El nivel EP es el núcleo de la comunicación del sistema de alarmas. En él se envia la cabecera con todos los datos necesarios para una perfecta identificación, un código de operación y un campo de datos, su los hubiese.
Y por último el protolo SLIP. Es el de más bajo nivel, en el que se encapsulan todos los demás, y el que tiene un contacto más directo con el hardware.
Ahora se explicará nivel a nivel, empezando por el nivel más bajo para una más fácil comprensión, a mi entender, para ir de lo más general a lo más particular.
7.1.1 El protocolo SLIP
Para realizar este protocolo me he basado, en un principio en el SLIP. El SLIP es un protocolo diseñado para la comunicación punto a punto por un cable serie.
Al estar pensado en una comunicación punto a punto no posee cabecera que identifique la trama que se envia o recibe al conocerse a priori el emisor. Estas tramas pueden tener un tamaño variable, y para poder diferenciar el comienzo y final de cada trama se utiliza un carácter de Inicio/Fin de trama. Al utilizar un valor de los 256 posibles que se pueden crear con un byte (1 byte = 8 bits => 28 =256 valores distintos) corremos el riesgo de que alguno de los datos que enviamos contengan dicho carácter, por lo que la comunicación será erronea ya que partiría la trama, y además nunca se recibiría dicho valor al tomarse como carácter de control. Si lo que enviamos es texto, la solución sería simple: tomar dicho carácter como uno de los de control, de los que dispone el juego de caracteres ASCII. Pero si lo que nos interesa enviar es información binaria entonces hay que tomar otro tipo de medidas.
La solución que utiliza el protocolo SLIP es el siguiente:
· Se marca como carácter de Inicio/Fin de Trama el valor en hexadecimal 1A
· Se comprueba que el código no contiene dicho valor. Si aparece dicho carácter se sustituye por los caracteres DB DC.
· Si nos encontramos en nuestra trama el carácter de sustitución DB, lo sustituiremos por DB DE
De esta forma tendremos la trama perfectamente codificada para enviarla, y lo que el receptor tendría que hacer es lo siguiente:
· Buscar el carácter de sustitución DB. Si aparece entonces se mira el carácter siguiente:
· Si es el carácter DC, entonces se sustituye el conjunto DB DC por el carácter de Inicio/Fin de Trama 1A
· Si es el carácter DE, se elimina este último de la trama
7.1.2 La Encapsulación Propia (EP)
Como se ha explicado brevemente en el apartado antrerior, el protocolo SLIP, al estar diseñado para una conexión punto a punto no necesita cabecera que indique el origen de los datos, pero nosotros lo vamos a utilizar en un bus de comunciaciones, por tanto la cabecera de datos se añade en este nivel, llamado con este nombre tan original Encapsulación Propia (EP). El esquema interno que posee es el siguiente:
Como podemos ver, posee 7 campos. Todos tienen un tamaño fijo, excepto el campo de datos. Para hacerse una mejor idea del tamaño de cada campo, la siguiente figura muestra un esquema de los campos divididos en bits:
En este punto paso a explicar campo a campo, su tamaño, utilización, etc:
· Nº DE REFERENCIA
El número de referencia de la trama utiliza 2 bytes (16 bits). Su uso es necesario para poder identificar la trama enviada, ya que el protocolo incluye retransmisiones, y cuando se recibe el ACK de una trama saber exactamente de cual.
· DISPOSITIVO DESTINO Y DISPOSITIVO ORIGEN
Cada uno de ellos utiliza 12 bits. La razón es que la identificación de una alarma utiliza dos subcampos: el número de alarma y el número de dispositivo.
Para ambos subcampos se han utilizado 6 bits, aunque realmente no se usan todos. El fin de que sean 12 bits es porque tanto el campo destino como el campo origen ocupan el mismo número de bits, por lo que se ha redondeado entre ambos para que ocupen un número justo de bytes, de forma que los dos usan 3 bytes en total.
En realidad, al haber 16 alarmas en un dispositivo, el subcampo de alarma necesitaría log2 16 = 4 bits para su identificación. En cuanto al campo de dispositivo que en teoría puede haber hasta 32 sistemas, log2 32 = 5 bits necesarios para identificarlo. Si sumamos ambos tenemos 9 bits, de ahí el desajuste de bits.
· ACK
El campo ACK únicamente utiliza un bit (robado al byte que ocupa el campo del Código de Operación). Este campo, junto con el número de referencia, sirve para identificar en asentimiento de una comunicación: cuando se envia una trama a un dispositivo, éste le contesta con otra trama que lleva el mismo número de identivicación y el campo de ACK asertado (el bit puesto a 1).
· CÓDIGO DE OPERACIÓN
Ocupa 7 bits, por lo que podremos tener un juego de instrucciones a este nivel de encapsulado de 27 =128 operaciones. Evidentemente no se van a utilizar todos. La aplicación que está instalada únicamente tiene 11 operaciones distintas que son las siguientes:
Cód. de op. ¿Qué es? Explicación
00H Test de puerto Código superfluo que sirve para iniciar una comunicación, comprobar el puerto, etc
01H Test de lámparas Enciende los LEDS del dispositivo específico
02H Lee configuración Lee la configuración de una alarma de un dispositivo en particular
03H Escribe configuración Escribe la configuración de una alarma de un dispositivo en particular
04H Señal de ENTERADO Señal que se envia cuando se ha pulsado el botón de ENTERADO
05H Señal de BORRADO Señal que se envia cuando se ha pulsado el botón de BORRADO
06H Alarma activa Código que indica que los datos que llegan corresponden a las alarmas activas
07H Lectura de dispositivo Lee la configuración de todas las alarmas de un dispositivo en particular
08H Escritura de dispositivo Escribe la configuración de todas las alarmas de un dispositivo en particular
09H Petición de estado Hace una petición del estado de las alarmas de un dispositivo en particular
0AH Configuración Nº disp. Se utiliza para la configuración del número de un dispositivo en particular.
· DATOS
El campo de datos es el único que puede variar de tamaño. En él se introduce la información anexa a ciertos códigos de operación. También está pensado para alguna utilización futura, con vistas a alguna ampliación, de forma que en él se pueda encapsular algún otro protocolo. Los códigos de operación que utilizan este campo, que es lo que realmente nos interesa son los siguientes:
· Leer Configuración: La trama de petición de información no lleva datos, pero si el ACK de vuelta. Los datos que devuelve son los distintos parámetros de la configuración de una alarma en particular. Su estructura ocupa 2 bytes y es la siguiente:
· Escribe configuración: la trama donde se indica que es para escribir datos porta también la información. El campo de datos de esta trama es exactamente igual al anterior.
· Alarma Activa: la trama con éste código de operación nos envía en el campo de datos la lista de las alarmas que están en el estado de ACTIVAS y/o ENTERADO, de la forma siguiente. En los 2 primeros bytes las alarmas activas y en los dos siguientes las de enterado, de forma que corresponde un bit de estado en cada uno de los subcampos, indicando su asertamiento o no:
· Lectura de dispositivo: la lectura de un dispositivo consiste en leer la configuración de todas las alarmas de dicho dispositivo para ello utiliza la estructura utilizada para el caso de Leer Configuración, tantas veces como alarmas existan, es decir, 16. Por tanto, como la estructurta anterior utilizaba 2 bytes, 2x16=32 bytes, que vamos a ocupar en el campo de datos.
· Escritura de dispositivo: pasa exactamente lo misco que con los casos de Leer configuración y Escribe configuración: su estructura es exactamente igual a la anteriomente explicada, Lectura de dispositivo.
· CRC
El CRC del final se utiliza para la comprobación de errores. Utiliza el último byte de la trama enviada y la información que contiene es el número de “1’s” que contiene la trama al nivel EP. Si este CRC, es erroneo, la trama se descarta, y no se envia ningún mensaje de error.
-
Gracias amigo
Estudiare tus notas..muchas gracias
-
Este pequeño codigo te ayuda a detectar un lector conectado a un puerto serial y te dice que la tarjeta esta dentro del lector.
Lo que yo necesito es saber como obtener el codigo de la tarjeta no se como hacerlo por fa ayudame si tu conoces algo sobre esto
Gracias Jorgito
espero que te sirva
Si tienes algun problema con la descarga me avisas te doy mi email
para que me envies si tu tienes lo que yo necesito
ardnax@mixmail.com
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
" Constantes para los códigos de control
Const STX = 2
Const ETX = 3
Const EOT = 4
Const SOH = 1
Const ENQ = 5
Const ACK = 6
Const NAK = 21
Const ETB = 23
Const ESC = 27
Private Sub Command1_Click() "botón que transmite el precio
Dim datos As String
Dim dato As String
" Envía una descripción y un precio de prueba
serie.Output = Chr(EOT) + Chr(STX) + "88" + "218" + "0" + Chr(ETX)
serie.InputLen = 1
dato = serie.Input
If dato <> "" Then
dato = Hex(Asc(dato))
Text1.Text = dato
Else
ms
End If
End Sub
Private Sub Form_Load()
" Los parámetros de apertura del puerto se han definido en tiempo de diseño, y dependen de la báscula.
serie.PortOpen = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
serie.PortOpen = False
End Sub
Private Sub Timer1_Timer()
serie.Output = Chr(EOT) + Chr(ENQ)
End Sub
-
Buenas:
En primer lugar, que tipo de lector usas, cuantos pines tiene, que formato obtienes el codigo?
Otra opcion es que me permitas el link para poder yo ver el pdf
1saludo
-
Buenas pic-chi:
Una pregunta, has conseguido establecer la comunicacion a traves del protocolo?
Si es asi, si pudieras mandar un pequeño ejemplo, es que tengo un fallo de compilacion y no lo doy encontrado, a ver si viendo otro codigo lo pudiese arreglar.
Gracias de todas formas. 1saludo
-
Si porfa jorgito enviame tu cod porq realmente lo necesito yo voy a colocar el mio aqui espero les sirva.
Y con respecto a si sirve el cod, si sirve usalo tienes que aumentarle un demonio para controlar el bucle infinito.
Dim rs As ADODB.Recordset
Dim conexion As ADODB.Connection
Dim pasar As Integer
Dim L As String
Private Sub cmdaceptar_Click()
cmdiniciar.Enabled = True
End Sub
Private Sub cmdDatos_Click()
"Dim buferentrada As String
"buferentrada = MSComm1.Input "En esta variable se almacena lo que entra por el puerto serie
MSComm1.InputLen = 0
"MSComm1.PortOpen = True
MSComm1.Output = "ATL" + Chr$(88)
Do
Dummy = DoEvents()
"If MSComm1.InBufferCount > 1 Then
" InString$ = MSComm1.Input
" txtRecibir.Text = InString$
"End If
Loop Until MSComm1.InBufferCount >= 5
InString$ = InString$ + MSComm1.Input
MSComm1.InBufferCount = 0
txtrecibir.Text = InString$
"txtRecibir.Text & buferentrada "aca se almacena lo que llega del puerto y lo que se escribe en recibir.txt (ojo esto esta con locked)
End Sub
Private Sub cmdinicializar_Click()
Dim BCC As Integer
BCC = (STX) Xor (88) Xor (218) Xor (ETX) "enviar caracteres ascii
MSComm1.Output = Chr$(STX) & Chr$(88) & Chr$(218) & Chr$(ETX) & Chr$(131)
MSComm1.RThreshold = 1 "trigger cuando al menos un caracter está en el buffer
MSComm1.SThreshold = 3
cmdDatos.Enabled = True
cmdTransmite.Enabled = True
cmdsalir.Enabled = True
cmdlimpiar.Enabled = True
txtrecibir.Enabled = True
txtTransmitir.Enabled = True
End Sub
Private Sub cmdlector_Click()
Unload Me
abrir_viajes
"frmlector.Show
Dim BCC As Integer
BCC = (STX) Xor (88) Xor (218) Xor (ETX) "enviar caracteres ascii
frmlector.MSComm1.Output = Chr$(STX) & Chr$(88) & Chr$(218) & Chr$(ETX) & Chr$(131)
frmlector.MSComm1.RThreshold = 1 "trigger cuando al menos un caracter está en el buffer
frmlector.MSComm1.SThreshold = 3
frmlector.Show
End Sub
Private Sub cmdlimpiar_Click()
txtrecibir.Text = ""
txtTransmitir.Text = ""
End Sub
Private Sub cmdprueba_Click()
cmdinicializar.Enabled = True
MSComm1.PortOpen = True
Timer1.Enabled = True
cmdprueba.Enabled = False
End Sub
Private Sub cmdsalir_Click()
"MSComm1.PortOpen = False
Unload Me
End Sub
Private Sub cmdTransmite_Click()
Dim InString As String
Dim TextoSalida As String
"MSComm1.RThreshold = 3
Dim BCC As Integer
Dim bcc1 As String
CMD = 82
op = 0
datos = 13
" Envía un comando para la lectura
BCC = (STX) Xor (CMD) Xor (datos) Xor (op) Xor (ETX) "enviar caracteres ascii
MSComm1.Output = Chr$(STX) & Chr$(82) & Chr$(13) & Chr$(0) & Chr$(ETX) & Chr$(94)
MSComm1.RThreshold = 1 "trigger cuando al menos un caracter está en el buffer
MSComm1.SThreshold = 3
End Sub
Private Sub Form_Load()
CenterMe Me
cmdinicializar.Enabled = False
cmdDatos.Enabled = False
cmdTransmite.Enabled = False
cmdsalir.Enabled = False
cmdlimpiar.Enabled = False
txtrecibir.Enabled = False
txtTransmitir.Enabled = False
Dim buferentrada As String
Dim i As Currency
ccom.AddItem "COM2"
ccom.AddItem "COM3"
Set rs = New ADODB.Recordset
Set conexion = New ADODB.Connection
If AperturaExclusiva Then "Se abrirá la conexión en modo exclusivo
conexion.Mode = adModeShareDenyNone
conexion.IsolationLevel = adXactIsolated
End If
conexion.CursorLocation = adUseServer
conexion.ConnectionTimeout = 5
conexion.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;Initial Catalog=MUNICIPIO;Data Source=ALEXA"
conexion.Open
End Sub
Private Sub Form_Terminate()
"MSComm1.PortOpen = False
Timer1.Enabled = False
End Sub
Private Sub MSComm1_OnComm()
MSComm1.Settings = "9600,N,8,1" "configuracion del puerto serie
"lectura
End Sub
Private Sub Timer1_Timer()
Dummy = DoEvents()
If MSComm1.InBufferCount > 0 Then
"MSComm1.Output = Chr$(ACK)
"lectura
InString$ = InString$ + MSComm1.Input
txtrecibir.Text = InString$
" pasar = pasarAsciiDato(InString$)
" txtrecibir.Text = pasar
" i = Val(MSComm1.Input)
" txtTransmitir.Text = i
End If
"InString$ = MSComm1.Input
"MSComm1.InBufferCount = 0
"txtrecibir.Text = InString$
End Sub
"//////////////////////////////////////////////////////////////////////////
Public Function pasarAsciiDato(cad As String) As Integer
Dim rdo As Boolean
Dim carAscii As String
Dim carHex As String
Dim carDec As Integer
"a partir de un caracter ascii recibido en el puerto,
"obtenemos el dato asociado
"If cad <> vbNullString Then
carAscii = Asc(cad)
carHex = Hex(carAscii)
carDec = pasarHexADecimal(carHex)
"End If
pasarAsciiDato = carDec
End Function
"//////////////////////////////////////////////////////////////////////////////////
"Esta funcion nos devuelve el valor decimal de los 10bits que enviaste por el puerto.
"aqui esta definida la funcion pasarHexADecimal()
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Public Function pasarHexADecimal(InputData As String) As Double
""
"" Converts Hexadecimal to Decimal
""
Dim i As Integer
Dim DecOut As Double
Dim Lenhex As Integer
Dim HexStep As Double
"" Zeroise the output
DecOut = 0
"" The length of the input
""
InputData = UCase(InputData)
Lenhex = Len(InputData)
""
"" Check to make sure its a valid Hex Number
""
For i = 1 To Lenhex
If IsNumeric(Mid(InputData, i, 1)) Then
""
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "A" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "B" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "C" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "D" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "E" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "F" Then
GoTo NumOk
Else
MsgBox "El número no es hexadecimal", vbCritical
Exit Function
End If
NumOk:
Next i
HexStep = 0
"" Convert the Number to Decimal
""
For i = Lenhex To 1 Step -1
HexStep = HexStep * 16
If HexStep = 0 Then
HexStep = 1
End If
If Mid(InputData, i, 1) = "0" Then
DecOut = DecOut + (0 * HexStep)
ElseIf Mid(InputData, i, 1) = "1" Then
DecOut = DecOut + (1 * HexStep)
ElseIf Mid(InputData, i, 1) = "2" Then
DecOut = DecOut + (2 * HexStep)
ElseIf Mid(InputData, i, 1) = "3" Then
DecOut = DecOut + (3 * HexStep)
ElseIf Mid(InputData, i, 1) = "4" Then
DecOut = DecOut + (4 * HexStep)
ElseIf Mid(InputData, i, 1) = "5" Then
DecOut = DecOut + (5 * HexStep)
ElseIf Mid(InputData, i, 1) = "6" Then
DecOut = DecOut + (6 * HexStep)
ElseIf Mid(InputData, i, 1) = "7" Then
DecOut = DecOut + (7 * HexStep)
ElseIf Mid(InputData, i, 1) = "8" Then
DecOut = DecOut + (8 * HexStep)
ElseIf Mid(InputData, i, 1) = "9" Then
DecOut = DecOut + (9 * HexStep)
ElseIf Mid(InputData, i, 1) = "A" Then
DecOut = DecOut + (10 * HexStep)
ElseIf Mid(InputData, i, 1) = "B" Then
DecOut = DecOut + (11 * HexStep)
ElseIf Mid(InputData, i, 1) = "C" Then
DecOut = DecOut + (12 * HexStep)
ElseIf Mid(InputData, i, 1) = "D" Then
DecOut = DecOut + (13 * HexStep)
ElseIf Mid(InputData, i, 1) = "E" Then
DecOut = DecOut + (14 * HexStep)
ElseIf Mid(InputData, i, 1) = "F" Then
DecOut = DecOut + (15 * HexStep)
Else
MsgBox "ERROR pasando a decimal", vbCritical
End If
Next i
pasarHexADecimal = DecOut
eds:
End Function
"\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
Private Sub lectura()
Dim datos As String
Dim dato1 As String
Dim rtnstr As String
Dim cad As String
rtnstr = "0"
" If MSComm1.CommEvent = 2 Then
" dato1 = MSComm1.InputLen
" datos = MSComm1.InputMode
" datos = MSComm1.InputLen "dato leido del puerto
" rtnstr = rtnstr & Right$("00" & Hex$(Asc(Mid$(datos, 1, 1))), 2) "Convierte a
" "hexadecimal el resultado
" dato1 = pasarHexADecimal(datos) "Rutina para convertir a decimal
" Label2.Caption = dato1 "muestra el dato
" MSComm1.RThreshold = 3
"
" End If
Select Case MSComm1.CommEvent
Case comBreak " Se ha recibido una interrupción.
"Case comEventCDTO " Tiempo de espera CD (RLSD).
Case comEventCTSTO " Tiempo de espera CTS.
Case comEventDSRTO " Tiempo de espera DSR.
Case comEventFrame " Error de trama
Case comEventOverrun " Datos perdidos.
Case comEventRxOver " Desbordamiento del búfer de recepción.
Case comEventRxParity " Error de paridad.
Case comEventTxFull " Búfer de transmisión lleno.
Case comEventDCB " Error inesperado al recibir DCB]
Case comEvCD " Cambio en la línea CD.
Case comEvCTS " Cambio en la línea CTS.
Case comEvDSR " Cambio en la línea DSR.
"Case comEvRing " Cambio en el indicador de llamadas.
Case comEvReceive " Recibido nº RThreshold
"If MSComm1.CommEvent = 0 Then
MSComm1.InputLen = 0
L = MSComm1.Input "dato leido del puerto
cad = L
txtrecibir.Text = Replace(Replace(Trim(cad), "|", vbNullString), vbCrLf, vbNullString)
" rtnstr = rtnstr & Right$("00" & Hex$(Asc(Mid$(datos, 1, 1))), 2) "Convierte a
"hexadecimal el resultado
"dato1 = pasarHexADecimal(datos) "Rutina para convertir a decimal
Label2.Caption = rtnstr "muestra el dato
Case comEvSend " Hay un número SThreshold de caracteres en el búfer de transmisión.
While Me.MSComm1.InBufferCount <> 0
" Sleep (100)
recv_wk = Me.MSComm1.Input
strRecvBuf = strRecvBuf + recv_wk
ip = InStr(strRecvBuf, CRSCR)
While ip <> 0
recv = Left(strRecvBuf, ip + 1)
strRecvBuf = Mid(strRecvBuf, ip + 1)
"Call Recv_Syori(recv)
ip = InStr(strRecvBuf, CRSCR)
Wend
Wend
Case comEvEOF " Se ha encontrado un carácter EOF en la entrada
End Select
End Sub
"Precio de los viajes
Public Sub abrir_viajes()
rs.Open "select * from viaje", conexion, adOpenDynamic, adLockOptimistic
With rs
If Not rs.EOF Then
While Not rs.EOF
viaje_e = rs!precio_especial
viaje_n = rs!precio_normal
rs.MoveNext
Wend
Else
End If
End With
rs.Close
End Sub
-
Private Sub evento()
Dim Lee As String
Dim rtnstr As String
Dim cad As String
rtnstr = "0"
Select Case MSComm1.CommEvent
Case comBreak " Se ha recibido una interrupción.
"Case comEventCDTO " Tiempo de espera CD (RLSD).
Case comEventCTSTO " Tiempo de espera CTS.
Case comEventDSRTO " Tiempo de espera DSR.
Case comEventFrame " Error de trama
Case comEventOverrun " Datos perdidos.
Case comEventRxOver " Desbordamiento del búfer de recepción.
Case comEventRxParity " Error de paridad.
Case comEventTxFull " Búfer de transmisión lleno.
Case comEventDCB " Error inesperado al recibir DCB]
Case comEvCD " Cambio en la línea CD.
Case comEvCTS " Cambio en la línea CTS.
Case comEvDSR " Cambio en la línea DSR.
Case comEvReceive " Recibido nº RThreshold
If MSComm1.InBufferCount > 0 Then
Lee$ = Lee$ + MSComm1.Input "dato leido del puerto
lcodigotarjeta.Caption = Lee$ "muestra el dato
End If
MSComm1.RThreshold = 3 "trigger cuando al menos un caracter está en el buffer
Case comEvSend " Hay un número SThreshold de caracteres en el búfer de transmisión.
While MSComm1.InBufferCount <> 0
recv_wk = frmTransRec.MSComm1.Input
strRecvBuf = strRecvBuf + recv_wk
ip = InStr(strRecvBuf, CRSCR)
While ip <> 0
recv = Left(strRecvBuf, ip + 1)
strRecvBuf = Mid(strRecvBuf, ip + 1)
ip = InStr(strRecvBuf, CRSCR)
Wend
Wend
Case comEvEOF " Se ha encontrado un carácter EOF en la entrada
End Select
End Sub
Private Sub lcodigotarjeta_change()
proceso
grabar
End Sub
Private Sub MSComm1_OnComm()
MSComm1.Settings = "9600,N,8,1"
End Sub
Private Sub Timer1_Timer()
Dim InString As String
Dummy = DoEvents()
If MSComm1.InBufferCount > 0 Then
If MSComm1.Input = "á" Then
lectura
""" InString$ = InString$ + MSComm1.Input
""" lcodigotarjeta.Caption = InString$
""" MSComm1.InBufferCount = 0
""" lectura
" If t.Text = "á" Then
" lectura
"
" MSComm1.Output = Chr$(ACK)
" "Else
" "lcodigotarjeta.Caption = InString$
" "presentar_viajes
End If
" Else
MSComm1.RThreshold = 3
End If
End Sub
Private Sub lectura()
Dim cadena As String
Dim TextoSalida As String
Dim BCC As Integer
Dim bcc1 As String
CMD = 82
op = 0
datos = 13
" Envía un comando para la lectura
BCC = (STX) Xor (CMD) Xor (datos) Xor (op) Xor (ETX) "enviar caracteres ascii
MSComm1.Output = Chr$(STX) & Chr$(82) & Chr$(13) & Chr$(0) & Chr$(ETX) & Chr$(94)
MSComm1.RThreshold = 1 "trigger cuando al menos un caracter está en el buffer
MSComm1.SThreshold = 3
Dummy = DoEvents()
If MSComm1.InBufferCount > 0 Then
" If MSComm1.Input = "á" Then
cadena$ = cadena$ + MSComm1.Input
lcodigotarjeta.Text = cadena$
MSComm1.InBufferCount = 0
End If
End Sub
Private Sub grabar()
Dim contador As Integer
Set registro = New ADODB.Recordset
registro.Open "select * from tarjeta", conexion, adOpenDynamic, adLockOptimistic
With registro
.AddNew
!cod_tarjeta = lcodigotarjeta.Text
!total_subidas = lsubidas.Caption
!saldo = lsaldo.Caption
!fecha = lfecha.Caption
!contador = contador + 1
.Update
End With
registro.Close
End Sub
Private Sub proceso()
Dim contador As Integer
Dim saldo As Double
Dim tarjeta As Integer
Set registro = New ADODB.Recordset
registro.Open "select cod_tarjeta, total_subidas from tarjeta where cod_tarjeta="" & Trim(lcodigotarjeta.Text) & """, conexion, adOpenDynamic, adLockOptimistic
With registro
If Not registro.EOF Then
While Not registro.EOF
contador = !total_subidas - 1
tarjeta = Mid(lcodigotarjeta.Text, 7, 1)
If tarjeta = 0 Then "tarjeta especial
lsaldo.Caption = contador * viaje_e
Else
lsaldo.Caption = contador * viaje_n
End If
registro.MoveNext
Wend
" grabar todavia no
Else
lsaldo.Font.Size = 20
lsaldo.ForeColor = &HC0&
lsaldo.Caption = "NO IDENTIFICADA"
End If
End With
lsubidas.Caption = contador
registro.Close
End Sub
Pd: Por fa Jorgito escribeme a mi correo ardnax@mixmail.com
Para poder explicarte lo que realmente ahora me esta fallando con este cod.
-
esta largo tu programa me sirvio de algo ahora ya tengo una idea para hacer una cosa. grax
-
hola que tal???


tengo un receptor de mensajes y quisiera saber como puedo guardar en una basw de datos los mensajes a medida que llegan.
desde ya gracias

mi correo es die_benegas@yahoo.com
-
Hol amigos
Me podrian orientar a como enviar multitud de bytes/registros grabados en el PIC y recibir multitud de bytes y/o almacenarlos dinamicamente en el PIC, de modo que pueda tratarlos y ejecutar acciones segun el dato enviado
Quien tiene el post ese donde hablaban de como implementar un protocolo usuario en C para PIC usando el campo de datos del rs232 ( 1 byte)???
La idea es enviar serialmente varias tramas, cada una con un proposito especifico, a la ves de recibir varias tramas e interpretarlas segun mi propio protocolo implementado.....
PD: puede ser tanto un PIC sin usart (omo el 16F84) o uno con usart (16F628 , 16F877)
Muchas gracias por todo
Atte
Pic-chi
Conseguiste la dire? me interesa. Estoy leyendo sobre protocolo KISS y SMACK que son lo mismo que postearon más abajo sobre uno SLIP.