PDA

Ver la Versión Completa : Enviar y recibir .txt y .jpg por puerto serie con C#


REHome
14-11-2009, 13:17:37
Hola:

Partiendo de este manual:
http://www.slideshare.net/Metaconta/pic-rs232-puerto-serie-con-pic16f84a-presentation?type=powerpointhttp://www.slideshare.net/Metaconta/pic-rs232-puerto-serie-con-pic16f84a-presentation?type=powerpoint

En este ejemplo se puede enviar tramas de bytes por el puerto serie con Visual C# (Ahora estoy usando el Visual C# Espress 2010 beta 2).

byte[] El_Buffer = new byte[1];
El_Buffer[0] = 0x74; // ASCII letra "t".
serialPort1.Write(El_Buffer, 0, 0);



Hasta ahí entiendo. Ahora sólo me queda saber si hay alguna manera de enviar un archivo .txt o hasta un archivo de imagen .jpg a otro ordenador y que lo reciba.

Ejemplo:

1) PC1 envía un archivo de texto llamdo en este ejemplo "hola.txt" a PC2 por puerto serie.

2) Mientras PC2 le llega el archivo hola.txt , pregunta si lo desea recibir o simplemente lo alamcena directamente sin preguntar ya en una ubicación ya elegida. (Me da igual la opción).

3) Al menos que indique con un mensaje como que ha llegado algo en el PC2.

4) Puedes comentar alguna sugerencia...

Un cordial saludo.

Crandel
15-11-2009, 10:59:59
Para el envío de archivos puedes hacerlo a traves de la red sobre el protocolo TCP/IP, y mas específicamente con el protocolo FTP.

Ahora si lo que necesitas es realizarlo por el puerto serie. Lo que des hacer es leer el archivo como binario, sino recuerdo mal con las clases FileStream y BinaryReader . La idea es ir escribiendo en el puerto lo que vas leyendo del archivo mediante un ciclo.

Por el otro lado (PC2) abres el puerto y lo que escuchas vas escribiendo en un archivo utilizando la clase BinaryWriter.

Una ves que funcione te sugiero que lo expandas un poquito escribiendo un pequeño protocolo de comunicación entre ellos. Avisando el cominezo del archivo, el fin del archivo, haciendo un checksum, etc. Esto dara mas robustes al programa y evitara problemas en la transferencia.

.

REHome
16-11-2009, 18:22:15
Gracias por los daros, voy a investigar.

Crandel
16-11-2009, 20:14:16
de nada, escribe de nuevo y te ayudamos donde te trabes

REHome
05-12-2009, 20:55:29
Heeeeeeeeeeeello:

Hace un tiempo hice que puedo enviar una trama de bytes con un botón al puerto COM1 ya dentro en el Form1, una vez compilado no puedo seleccionar nngún byte que desee así que se me ocurrió hacer una cosa, poner un textBox por medio.

Al introducir un botón para poder enviar un byte, por ejemplo la letra t, en ASCII (http://personal.telefonica.terra.es/web/oscarmartinez/_imatges/ascii.gif) es 0x74 (hexadecimal). También quiero que se puede enviar más de un byte, por ejemplo, hola, pero mejor centrarse con uno para hacer pruebas. Su código fuente es:

byte[] mBuffer = new byte[1];
mBuffer[0] = 0x74; //ASCII letra "t".
serialPort1.Write(mBuffer, 0, mBuffer.Length);

Supuestamente si pongo como dije antes, la letra t, en realidad se debe enviar en 0x74 al puerto serie y el dispositivo debe leerto en 0x74, en este caso es un microcontrolador PIC 16F84A. (Ver vídeo (http://www.youtube.com/watch?v=z5K9UBlOdTo) ).

He intentado al menos enviar un byte desde un textBox así:

private void button_t_Click(object sender, EventArgs e)
{
byte[] mBuffer = new byte[1];
mBuffer[0] = textBox_trama.Text.ToString(); // Error aquí.
serialPort1.Write(mBuffer, 0, mBuffer.Length);
}



private void button_t_Click(object sender, EventArgs e)
{
byte[] mBuffer = new byte[1];
mBuffer[0] = textBox_trama.Text.ToCharArray(); // Error aquí.
serialPort1.Write(mBuffer, 0, mBuffer.Length);
}


private void button_t_Click(object sender, EventArgs e)
{
byte[] mBuffer = new byte[1];
mBuffer[0] = textBox_trama.Text; // Error aquí.
serialPort1.Write(mBuffer, 0, mBuffer.Length);
}

Sospecho que es algo de conversión...

Descargar (http://www.pic16f84a.org/index.php?option=com_docman&task=doc_download&gid=52&Itemid=59) código fuente
Contraseña: P.D.E.

byte[] mBuffer = new byte[1];
mBuffer[0] = byte.Parse(textBox_trama.Text); // Error aquí.
serialPort1.Write(mBuffer, 0, mBuffer.Length);


Investigando un poco lo hice ejecutar sin ningún problema pero al enviar una letra me dice:

No se controló System.FormatException
Message="La cadena de entrada no tiene el formato correcto."

Da igual que en el textBox le ponga la letra t o en ASCII en 0x74, el resultado del error es el mismo.

De momento quiero hacerlo así para hacer pruebas.

Hasta otra.

REHome
06-12-2009, 03:37:42
Haciendo más prubeas y esta vez haciendo caso a lo que mes has dicho, sería así, pero no envía nada de nada. Algo no hago bien.

string strSource = null;
byte[] bteEndode = null;
FileStream myFileStream = new FileStream(@"C:\senpir.pdf", FileMode.OpenOrCreate, FileAccess.ReadWrite);


strSource = "asdf";
bteEndode = Encoding.ASCII.GetBytes(strSource);


myFileStream.Write(bteEndode, 0, bteEndode.Length);

myFileStream.Close();

Crandel
06-12-2009, 08:54:55
Hola REHome,

Tal como lo supones tenes un problema de conversión. Por un lado, la letra 'T' es el ASCII 0x84 (no 74).

Por otro lado cuando tienes una cadena en un componente como TextBox, este no guarda las cadenas como un vector de caracteres ASCII, sino como UNICODE. Ya de entrada ocupará 2 bytes cada letra, en ves de 1 byte del ASCII.

Ahora para el ejemplo de leer un archivo como bytes. Deberias escribir algo asi:

using (FileStream inStream = File.OpenRead(_fileName))
{
_data = new byte[inStream.Length];
inStream.Read(_data, 0, inStream.Length);
inStream.Close();
}


Ahora tienes en _data todos los bytes a enviar.