# Como enviar un dato binario por puerto serial



## piochiken87 (Oct 12, 2008)

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


----------



## Meta (Oct 13, 2008)

Hola:

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


```
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.


----------



## piochiken87 (Oct 13, 2008)

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


----------



## Meta (Oct 13, 2008)

El ejemplo que te he  dado, en realidad utilizas el Hexadecimal. La "a" es porque tocó y por poner un ejemplo.


----------



## Meta (May 19, 2009)

piochiken87 dijo:
			
		

> trabajo en visual basic
> 
> gracias



Por si las moscas, ya está en Visual Basic.

http://www.abcdatos.com/tutoriales/tutorial/v12.html

Saludo.


----------



## rondonhs (Jul 7, 2009)

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


----------



## Meta (Jul 7, 2009)

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?


----------



## rondonhs (Jul 8, 2009)

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


```
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()
```


----------



## rondonhs (Jul 8, 2009)

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!)


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


----------



## rondonhs (Jul 8, 2009)

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


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


----------



## morfalibro (May 4, 2010)

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



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


----------



## Mushito (Oct 8, 2013)

¿como harian para enviar 9 bits?


----------



## D@rkbytes (Oct 8, 2013)

Mushito dijo:


> ¿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.


----------

