Autor Tema: PIC C y RS232, TX/RX de varios bytes  (Leído 8623 veces)

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

Desconectado lovando

  • PIC16
  • ***
  • Mensajes: 193
PIC C y RS232, TX/RX de varios bytes
« 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

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #1 en: 28 de Diciembre de 2004, 11:01:00 »
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

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #2 en: 28 de Diciembre de 2004, 11:55:00 »
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

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #3 en: 03 de Enero de 2005, 00:08:00 »
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

Desconectado odukec

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 174
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #4 en: 03 de Enero de 2005, 08:47:00 »
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. Giño

Adios

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #5 en: 04 de Enero de 2005, 11:59:00 »
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.



Desconectado lovando

  • PIC16
  • ***
  • Mensajes: 193
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #6 en: 04 de Enero de 2005, 20:09:00 »
Gracias amigo

Estudiare tus notas..muchas gracias

Desconectado ardnax

  • PIC10
  • *
  • Mensajes: 9
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #7 en: 19 de Enero de 2005, 07:51:00 »
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


Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #8 en: 20 de Enero de 2005, 05:16:00 »
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

Desconectado JorgitoFRyOle

  • PIC12
  • **
  • Mensajes: 79
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #9 en: 20 de Enero de 2005, 05:21:00 »
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

Desconectado ardnax

  • PIC10
  • *
  • Mensajes: 9
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #10 en: 20 de Febrero de 2005, 08:24:00 »
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


Desconectado ardnax

  • PIC10
  • *
  • Mensajes: 9
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #11 en: 20 de Febrero de 2005, 08:28:00 »
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.

Desconectado leonther

  • PIC10
  • *
  • Mensajes: 4
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #12 en: 02 de Julio de 2005, 15:06:00 »
esta largo tu programa me sirvio de algo ahora ya tengo una idea para hacer una cosa. grax

Desconectado dbenegas

  • PIC10
  • *
  • Mensajes: 1
RE: PIC C y RS232, TX/RX de varios bytes
« Respuesta #13 en: 05 de Enero de 2006, 12:18:00 »
hola que tal???GiñoGiño

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 Rebotado Rebotado

mi correo es die_benegas@yahoo.com

Desconectado zagoaristides

  • PIC12
  • **
  • Mensajes: 99
    • deportes de contacto y fitness
Re: PIC C y RS232, TX/RX de varios bytes
« Respuesta #14 en: 12 de Septiembre de 2008, 23:15:38 »
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.
Nadie nació sabiendo...Que genio ese Nadie!!!