Enviar bytes por puerto serial

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.
 
Última edición:
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.
 
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.
 
Código dentro de un botón.

Código:
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.
 
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.
 
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?
 
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.
 
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.







.
 
Última edición:
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.

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.
 
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.
 
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
 
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
 
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 :cry:
Pero con el aporte de: arielrodolfodiaz me funciono a la perfección :D GRACIAS :aplauso:

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))"
 
Última edición por un moderador:
Atrás
Arriba