desktop

Como enviar un dato binario por puerto serial

la mayoria de los ejemplos que e visto envian y reciben codigos ascii y lo que yo quiero es enviar y recibir datos en binario o en hex ...por ejemplo como hago para enviar ff que es 11111111 en binaro y mostrar ese valor en leds,claro siempre usando un pic para que se comunique con la pc

trabajo en visual basic

gracias
 
Hola:

trabajo en Visual C#, quizás alguien sepa interpretarlo. Si sabes como es en VB .net, me lo dices.

Código:
private void button1_Click(object sender, EventArgs e)
        {
            // Se envía como HEX al RS232.
            // BIN = 01100001, DEC = 97, OCT = 141.        
            byte[] mBuffer = new byte[1];
            mBuffer[0] = 0x61; //ASCII letra "a".
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }
No te preocupes que estoy haciendo el manual sobre RS232, PIC y Visual C#.

http://www.pic16f84a.org/proyectos-de-angel/109-articulo-de-angel-acaymo.html

Saludos.
 
gracias Meta por tu aporte ....pero en tu ejemplo gusto agarras un valor binario que equivale a la letra a en ascci si deceas tomar un valor que que no tenga interpretacion en ascci como haces..
 
Esta facil esta...
despues de probar con casi todos los metodos descubri que
usando el mscomm solo puedes enviar datos string ASC > 65
Si quieres usar toda la tabla ASC debes usar el metodo serialport
SerialPort1.Write(Chr(5)) COMPROBADO envia 00000101
 
rondonhs dijo:
Esta facil esta...
despues de probar con casi todos los metodos descubri que
usando el mscomm solo puedes enviar datos string ASC > 65
Si quieres usar toda la tabla ASC debes usar el metodo serialport
SerialPort1.Write(Chr(5)) COMPROBADO envia 00000101

¿Puedes poner un ejemplo del código completo?
 
otra forma en Vb Net, solo que esta forma no se porque diablos no presenta cuando I = 19 y cuando I > 127, me imagino que es la limitacion del tipo de variable que soporta el metodo write

Código:
      Dim contador As Integer

        Dim Dato2 As Byte
        Dim Dato3 As String
        Dim Dato4 As Byte
        Dim AA1 As Integer
        Dim AA2 As String
        Dim Serie = My.Computer.Ports.OpenSerialPort("COM1")
        Serie.BaudRate = 9600
        Serie.DataBits = 8
        Serie.StopBits = IO.Ports.StopBits.One
        Serie.Handshake = IO.Ports.Handshake.XOnXOff
        Dim Puerto As String
        Puerto = Serie.PortName

        '_________enviar(datos)
        contador = Serie.BytesToWrite

        For I = 20 To 255
            Dato3 = CStr(Chr(CInt(I)))
            Serie.Write(CStr(Chr(I)), 0, 1)
            For K = 1 To 1000000
                For J = 1 To 100
                Next

            Next
        Next I
        Serie.Close()
 
Com el mscomm con este metodo sigue presentado el mismo problema que no muestra cuando J=19 pero en cambio muestra hasta 255 (QUE TAL!)

Código:
       MSComm1.CommPort = 1
        MSComm1.Settings = "9600,N,8,1"
        MSComm1.Handshaking = MSCommLib.HandshakeConstants.comXOnXoff
        MSComm1.PortOpen = True

        For J = 0 To 255
            If J <> 19 Then
                MSComm1.Output() = CStr(Chr(J))
            End If


            For I = 1 To 100000
                For K = 1 To 1000

                Next
            Next
            'MSComm1.PortOpen = False
        Next J
 
El codigo lo uso en un PIC16F877A y funciona correctamente con un cristal de 4Mh, los ocho bits de salida los muestra por el puerto B

Código:
Include "p16f877A.inc"
dato EQU 0x20
org 0x0000
CLRF PORTB    ;  inicializa en 00000000 el puerto B
;CLRF PORTD	    inicializa puerto D
trans BSF STATUS,RP0 ;banco 1
CLRF TRISB   ; pone el puerto B como salidas
MOVLW 0xFF   ; 
;CLRF TRISD    Configura puerto D como Salidas
BSF TXSTA,BRGH ;pone bit BRGH=1 (velocidad Alta)
MOVLW 0x19 ;valor para 9600 Bauds (Fosc=4 Mhz)
MOVWF SPBRG ;configura 9600 Bauds
BCF TXSTA,SYNC ;limpia bit SYNC (modo asíncrono)
BSF TXSTA,TXEN ;pone bit TXEN=1 (habilita transmisión)
BCF STATUS,RP0 ;regresa al banco 0
BSF RCSTA,SPEN ;pone bit SPEN=1 (habilita puerto serie)
BSF RCSTA,CREN ;Habilita recepción
rep CALL recibe ;recibe dato
MOVLW 0xFF ;carga código ASCII 255 para parar
SUBWF dato,W ;es igual?
BTFSC STATUS,Z ;
GOTO fin ;si es igual termina
CALL envia ;si n, retransmite el dato
GOTO rep ;repite
fin GOTO fin ;ciclo infinito
;*************************************************
;Subrutina para enviar un dato por el puerto serie
;*************************************************
envia BSF STATUS,RP0 ;banco 1
esp BTFSS TXSTA,TRMT ;checa si el buffer de transmisión
GOTO esp ;si está ocupado espera
BCF STATUS,RP0 ;regresa al banco 0

MOVF dato,W ;rescata dato a enviar
MOVWF TXREG ;lo envía
RETURN
;**************************************************
;subrutina de recepción de un dato del puerto serie
;**************************************************
recibe BTFSS PIR1,RCIF ;checa el buffer de recepción
GOTO recibe ;si no hay dato listo espera
MOVF RCREG,W ;si hay dato, lo lee
MOVWF PORTB     ;muestra el contenido en el puerto B
;MOVWF PORTD      muestra el contenido en el puerto D

MOVWF dato ;lo almacena en dato

RETURN
end
 
Esta facil esta...
despues de probar con casi todos los metodos descubri que
usando el mscomm solo puedes enviar datos string ASC > 65
Si quieres usar toda la tabla ASC debes usar el metodo serialport
SerialPort1.Write(Chr(5)) COMPROBADO envia 00000101

Podes mandar el código completo????

Soy principiante en esto del Visual Basic 6 y necesito saber el estado de una puerta a través del puerto serie. Ademas quiero que al apretar un botón me active una cerradura eléctrica. Esto ultimo creo que lo logre. Pero si conoces una forma sencilla de hacerlo avísame!!!
:unsure::unsure::D:D:unsure::unsure:
 
¿como harian para enviar 9 bits?
Envías el Nibble alto y luego el Nibble bajo, ya en el receptor los sumas.

Por ejemplo, enviar b'101010101' = 0x155 d'341' (9 Bits)
Obtienes el Nibble alto (HighByte) 0x1 y lo envías.
Obtienes el Nibble bajo (LowByte) 0x55 y lo envías.

He visto que programas en PICBasic Pro, así que adjunto un ejemplo de cómo se haría.

Suerte.
 

Adjuntos

  • 16F628A HighByte y LowByte.rar
    20.1 KB · Visitas: 48
Última edición:
Buenas noches.
Quiero hacerles una consulta respecto del ejemplo de Mushito dijo, respecto
Del ejemplo de envío de dos nibbles alto y bajo, en la simulación da como resultado high=1 y low=55, y es lo que no entiendo, tal vez alguien pueda explicarme un poco más al respecto.
Gracias a todos de antemano.
 
Del ejemplo de envío de dos nibbles alto y bajo, en la simulación da como resultado high=1 y low=55, y es lo que no entiendo, tal vez alguien pueda explicarme un poco más al respecto.
Modo fácil:
Usa la calculadora de programador de Windows y escribe el número decimal 341
Ahora ve el valor mostrado en hexadecimal.
Calc_Hex_MSB_LSB.jpg

En lenguaje C:
C:
            unsigned int msb = (value & 0xFF00) / 0x100;
            unsigned int lsb = value & 0xFF;

Referencias a modo de aprendizaje:
Bit más significativo (MSB)
Bit menos significativo (LSB)
 
Que yo sepa un nibble es un grupo de 4 bits, ahora leyendo lo que ponen quedé confundido con lo de enviar 9 bits, o sea, no estarías enviando 9 sino 10 si colocas el puerto en modo de 5 bits o 16 si lo conservas en el de 8, realmente las opciones de la API están limitadas, ¿para qué se ocupa ese bit adicional? si es para paridad, solo habilitarlo ya automáticamente lo incluirá en la trama y estaría enviando los 9 bits (8 de datos + 1 de paridad).
 
Atrás
Arriba