# Enviar bytes por puerto serial



## el_patriarca (Feb 11, 2012)

hola a todos, ojala alguien pueda ayudarme en este problema: estoy usando visual basic 2010 para enviar un dato por el puerto serial. Esta es la rutina que uso:


Sub SendSerialData(ByVal data As String)

    Using com1 As IO.Ports.SerialPort = _
            My.Computer.Ports.OpenSerialPort("COM1")
        com1.WriteLine(data)
    End Using

End Sub




pero mi problema es que el programa envía caracteres y yo necesito que envíe el valor hexadecimal de la variable. por ejemplo, si mi variable vale 0x09 en hexadecimal, mandar el valor 0000 1001. pero en lugar de mandar el valor hexadecimal, el programa  manda el caracter '9'.

ya intenté cambiando el tipo de dato a byte, tanto de la subrutina como de la variable, incluso  le indique que envie Val(data) pero igaul manda un caracter. si alguien sabe de alguna rutina que envíe un byte por el puerto serie le estaré muy agradecido.




*edito*: no es necesario que el programa sea en vb2010. si alguien sabe de algún programa que envíe bytes por el puerto serial sería de gran ayuda, solo necesito darle un valor, por ejemplo  127 y que el programa mande el valor 0x7f por el puerto serial. tan solo eso. no importa que sea en el lenguaje que fuere. agradezco de antemano cualquier ayuda o sugerencia.


----------



## mdchaparror (Feb 11, 2012)

El receptor es el que interpreta el dato recibido como un carácter, recuerda que cada letra es representada   por un hexadecimal, ejemplo 0x41 =A.
Es decir si mandas una A por el puerto serie en si lo que estas mandando es 0x41.


----------



## Meta (Feb 17, 2012)

Hola:

manual serie Visual basic.
http://electronica-pic.blogspot.com/2009/03/manual-interfaz-vc-y-visual-basic.html
Saludo.


----------



## andrea1708 (Abr 12, 2012)

el_patriarca: Tengo exactamente el mismo problema que tu, no logro enviar un BYTE. Por ejemplo, si hago:
dim dato as byte = 40.
Y luego si lo envio por serial, a juro lo tengo que convertir en VB a string porque si no me sale un error. Y no quiero enviar un string! quiero enviar el byte 40, es decir, 00101000.


----------



## Meta (Abr 12, 2012)

Código dentro de un botón.


```
Private Sub button_t_Click(sender As Object, e As EventArgs)
    serialPort1.Open()
    Dim mBuffer As Byte() = New Byte(0) {}
    mBuffer(0) = &H74 'ASCII letter "t".
    serialPort1.Write(mBuffer, 0, mBuffer.Length)
    serialPort1.Close()
End Sub
```

Este ejemplo puse el 74 que corresponde la letra t. El 40 lo harás usted mismo. 

¿Te funciona?

Saludo.


----------



## andrea1708 (Abr 12, 2012)

Gracias por tu ayuda Meta. No tengo el metodo .Write en mi Visual Basic, no se por que =( Hay que incluir alguna libreria en especial???

Gracias


----------



## Meta (Abr 12, 2012)

Debes tener el Write si o si. Prueba con el Visual Basic 2010, para hacer una instalación nueva, ya nos contará.

Si no te viene, cosa rara, e Write es para enviar, el read para recibir.

Si no te aparece, algo le pasa el Visual Express 2008.


----------



## andrea1708 (Abr 12, 2012)

Creo que debo aclarar que estoy trabajando en Visual Basic Express 2008. Es muy raro porque por ejemplo para abrir el puerto yo uso serialPort1.portopen.

En que Visual Basic trabajas tu?


----------



## Meta (Abr 12, 2012)

Para abrir el puerto se usa el *serialPort1.Open()*
Para cerrarlo el *serialPort1.Close()

*Trabajo con el C#, el Visual Basic lo haré el año que viene, no lo manejo bien.

Prueba los ejemplos de arriba y nos cuentas.


----------



## andrea1708 (Abr 12, 2012)

Entiendo... si logro descifrar lo que sucede aviso por aqui. Gracias =)


----------



## Meta (Abr 12, 2012)

No te olvides de poner arriba del todo del programa este código.

Imports System.IO.Ports

Cuando lo pruebes me avisas.

Saludo.


----------



## el_patriarca (Abr 16, 2012)

andrea1708 dijo:


> el_patriarca: Tengo exactamente el mismo problema que tu, no logro enviar un BYTE. Por ejemplo, si hago:
> dim dato as byte = 40.
> Y luego si lo envio por serial, a juro lo tengo que convertir en VB a string porque si no me sale un error. Y no quiero enviar un string! quiero enviar el byte 40, es decir, 00101000.





andrea, revisa tu inbox.


*edito*: andrea, lo siento mucho, me acabo de dar cuenta que el foro me pide 25 mensajes mínimo para enviar privados. dado que tenía 21 hasta la fecha, traté de escribir unos cuantos para cumplir ese requisito, pero el foro me sigue bloqueando y continúa diciéndome que solo tengo 21 mensajes, y me avisa que solo puedo escribirle a un cierto grupo de foreros, supongo que son los moderadores (para qué?). lamento de verdad que tengan que pedirme ese requisito irrisorio, a mi juicio perjudicial y molesto, ya que no pude ayudarte como desearía.

dicho esto, te digo que pude solucionar el problema del envío de datos por puerto serial y me funcione de maravilla. aquí te paso el código, no se colocar entre etiquetas de "code", así que irá como parte del post entre líneas punteadas:


--------------------------------------------------------------------------------


Private Sub Button_t_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_t.Click
        Dim mBuffer As Byte() = New Byte(0) {}
        mBuffer(0) = TextBox1.Text
        '   mBuffer(0) = &H86 '&H74 'ASCII letra "t".
        SerialPort1.Write(mBuffer, 0, mBuffer.Length)
    End Sub

--------------------------------------------------------------------------



button_t es la etiqueta del botón, puedes cambiarlo a lo que deseas. y la línea que dice "    mBuffer(0) = &H86 '&H74 'ASCII letra "t"" era para hacer mis pruebas, no interesa y puedes borrarla si gustas.

respecto a vb2008: un amigo lo probó y le funcionó y el usa vb2008 por  lo que creo que no tendrás problemas en usar esa subrutina.
finalmente decirte que para nada es una molestia, aquí estamos todos para ayudarnos en lo que podemos. por el contrario, discúlpame por tardar en responder y espero que te haya servido, se nota que eres una persona muy educada.

suerte.







.


----------



## Meta (Abr 16, 2012)

el_patriarca dijo:


> andrea, revisa tu inbox.



Hagan caso, lean. Les damos respuestas directas, no les funciona, algo no anda bien.

https://www.forosdeelectronica.com/f26/enviar-bytes-puerto-serial-70110/#post617647



Saludo.


----------



## el_patriarca (Abr 17, 2012)

Meta dijo:


> Hagan caso, lean. Les damos respuestas directas, no les funciona, algo no anda bien.
> 
> https://www.forosdeelectronica.com/f26/enviar-bytes-puerto-serial-70110/#post617647
> 
> ...



una respuesta directa sería la subrutina.

mi pregunta fue muy específica preguntando si alguien sabía de alguna subrutina que envíe un valor hexadecimal por el puerto serie. tu respuesta fue un curso de vb que no esta mal, no seré ingrato, y ahora te agradezco no solo por la ayuda y por tomarte tu tiempo en ayudarme. pero una respuesta concreta era "usa esta subrutina: .........  "

en lo que no estoy de acuerdo y es lo que me mueve a escribir este post es que no me gusta la manera en que ayudan algunos foreros de por aquí. ya tuve un problema cuando quería armar un grabador de pic's y un forero me respondió de una manera totalmente prepotente y soberbia cuando la respuesta era tan sencilla como cuatro palabras: "lee el post #1". 

por favor no pienses que no me dio la gana de leer el tutorial , o no me dio la gana de hacerte caso, lo que ocurre es que ese tutorial abarca desde lo básico y mi necesidad era más específica.


----------



## Meta (Abr 17, 2012)

Hola:

Se que es específica, por esto te puse el código que puedes ver aquí.

Un saludo.


----------



## el_patriarca (Abr 17, 2012)

mira amigo, no tiene sentido entrar en detalles, pues si hilamos así de fino yo te diría que tu primera respuesta es demasiado general y hace apenas 4 días diste una respuesta específica. pero ya lo dije, no es el propósito de este foro.

quedate con la última palabra si deseas. saludos.


----------



## Meta (Abr 17, 2012)

Ok, entonces error rmío, disculpe usted.


----------



## arielrodolfodiaz (Abr 26, 2013)

Hola sumo esta información para los que tengan el mismo problema que tuve y se pierdan tres días buscando una información que no figura en ningún lado, para enviar un byte entero (0-255) por visual:

BOTÓN DE CONEXIÓN
SerialPort.BaudRate = ComboVelocidad.Text
SerialPort.PortName = "COM" & Txtpuerto.Text
SerialPort.Encoding = System.Text.Encoding.Default 'ESTA FUNCIÓN HABILITA EL CÓDIGO ASCII EXTENDIDO, QUE NOS DA LA LIBERTAD DE ENVIAR CUALQUIER DATO
SerialPort.Open() 'CONECTA AL PUERTO

BOTÓN DE ENVIAR:
Dim Dato As Byte
Dato = Int(Txtdato.Text)
SerialPort.Write(Chr(Dato))


Saludos


----------



## richizer (Jul 22, 2013)

hola estoy desarrollando un proyecto enviando datos del ADC del pic al pc la interfaz es C# mi duda es la siguiente: estoy construyendo la funcion para recibir datos creo que este es el codigo
pero quiero guardarla en un .txt para luego graficarla.

en la class creo un string.

streamWrite.Archivo = new streamWrite(@"C:\archivo1\\sens.txt", true);

luego abro el puerto y lo limpio (no coloco el codigo por que se hace muy largo)

string recibido;
list<byte> recibido = new list<byte>();
// funcion para recibir
private void serialport_dataReceived(objeto sender, system.IO.ports.serialDataReceived EventArgs e)
{
int bytes =serialport.byteTo.read;
if(byte < N) //recibo N datos (en el programa real colocare si es necesario el numero de  datos)
{
return;
byte[] buffers = new byte [bytes];
serialport.read(buffers, 0, bytes);
forrach(byte elem in buffer) //guardo los datos recibidos
{
recibido.add(elem);
quiero saber si esta bien


----------



## Lau Luna (Ago 23, 2013)

Hola Soy nueva en el foro, pero igual eh trabajado con comunicación CDC y tenía ese problema.
Enviaba un dato desde Visual y en el PIC lo recibía como si fuera un codigo ASCII  
Pero con el aporte de: arielrodolfodiaz me funciono a la perfección  GRACIAS 

BOTÓN DE CONEXIÓN
SerialPort.BaudRate = ComboVelocidad.Text
SerialPort.PortName = "COM" & Txtpuerto.Text
SerialPort.Encoding = System.Text.Encoding.Default 'ESTA FUNCIÓN HABILITA EL CÓDIGO ASCII EXTENDIDO, QUE NOS DA LA LIBERTAD DE ENVIAR CUALQUIER DATO
SerialPort.Open() 'CONECTA AL PUERTO

BOTÓN DE ENVIAR:
Dim Dato As Byte
Dato = Int(Txtdato.Text)
SerialPort.Write(Chr(Dato))"


----------

