Acabo de hacer un pequeño programa que recibe una imagen tomada por Bluetooth a través de un COM virtual usando C#. Este programa funciona de la misma manera con cualquier otro COM, incluso con nuestros PICs. Se necesita tener Visual C# 2008 instalado pero también debe funcionar con versiones anteriores. Les comparto los pasos que hay que llevar a cabo para que manejen el suyo.
Para usar el puerto COM es más fácil que nunca.
- Ir al cuadro de Herramientas y tomar un SerialPort y dibujarlo en cualquier parte de la ventana principal.
- En su ventana de propiedades hay que detallar sus características. Las principales son:
+ Name. Cualquier nombre que te guste. El mío se queda en serialPort1.
+ BaudRate. Velocidad en bps. Solo útil si el puerto es físico y no virtual.
+ PortName. El nombre del puerto COM. Si usas los físicos serán COM1 o COM2. Si usas virtuales serán números mayores.
+ ReadBufferSize. Tamaño máximo del buffer. Si dejas que se llene perderás datos.

- Para monitorear cuando llegan los datos deberás implementar una función detonada por evento. Da click en el serialPort1 y después en el iconito con forma de rayo en la ventana Propiedades.
- Da doble click en DataReceived y se creará una función que se va a ejecutar cada que se recibe cualquier dato en el puerto.
- En esta función podrás indagar cuántos bytes tienes pendientes en el buffer y recolectarlos en un arreglo de bytes:
int bytes = serialPort1.BytesToRead;
byte[] buffer = new byte[bytes];
serialPort1.Read(buffer, 0, bytes);- Para iniciar el funcionamiento del puerto solo debes usar:
serialPort1.Open();- Para cerrarlo:
serialPort1.Close();- Para enviar bytes por el puerto:
serialPort1.Write(byte[] buffer, offset, count); Donde offset es un byte inicial y count es el máximo de bytes que quieres enviar del arreglo buffer
Esa función tiene otras sobrecargas.
Les dejo un ejemplo para recibir un número desconocido de bytes y guardarlos en un archivo binario.
//////////////////////////////
//Variable global
List<byte> recibido = new List<byte>();
//////////////////////////////
//Abrir puerto COM14
private void button1_Click(object sender, EventArgs e)
{
serialPort1.Open();
recibido.Clear();
}
//////////////////////////////
//Datos en el buffer
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
int bytes = serialPort1.BytesToRead;
byte[] buffer = new byte[bytes];
serialPort1.Read(buffer, 0, bytes);
foreach(byte elem in buffer)
{
recibido.Add(elem);
}
}
private void button2_Click(object sender, EventArgs e)
{
serialPort1.Close();
//Guarda todo en archivo
if (File.Exists("Prueba.jpg"))
File.Delete("Prueba.jpg");
FileStream archivoP = new FileStream("Prueba.jpg",
FileMode.OpenOrCreate, FileAccess.Write);
BinaryWriter escribirP = new BinaryWriter(archivoP);
foreach(byte elem in recibido)
{
escribirP.Write(elem);
}
escribirP.Close();
archivoP.Close();
Process.Start("Prueba.jpg");
}