Pic 18F4550 y comunicación con Puerto serie con .Net

#1
Hola.

estoy haciendo un programa en visual basic .Net para comunicarme con el pic18F4550

en el pic usu para leer datos y enviarlos de inmediato al pc en plan eco esto:

CREN=0;
dato=RCREG;
CREN=1;

TXEN=0;
TXREG=dato;
TXEN=1;

cuando desde el visual basic .Net hago esto:

For I As Integer = 1 To 20
newCom.Write(ArrayBytes, I, 1)
Sleep(1)
Next

me funciona correctamente, pero es una forma muy lenta de mandar y recibir datos al pic. mi problema es como usar el buffer, como puedo mandar varios bytes al pic al mismo tiempo en una sola instruccion,

¿alguna sugerencia para mejorar la velocidad de comunicación?

esta es la configuración del puerto que hago.

newCom = My.Computer.Ports.OpenSerialPort("COM4")
newCom.Handshake = IO.Ports.Handshake.None
newCom.BaudRate = 116279
newCom.Parity = IO.Ports.Parity.None
newCom.DataBits = 8
newCom.StopBits = IO.Ports.StopBits.One
newCom.DiscardInBuffer()
newCom.DiscardOutBuffer()

un saludo ...
 
#2
Lo que hace tu programa es mandar uno por uno cada uno de los bits del arreglo del byte que queres mandar? Si es asi hay que buscar la forma de mandar el byte de una sola ves.
 
#3
mi programa lo que hace es mandar de byte en byte, es decir, el arraybyte es de byte. mando 8 bit. lo que yo quiero es poder mandar un array de byte.

la función write del objeto IO.Ports.SerialPort de VB.Net tiene tres parametros, un array de bytes, el segundo el indice donde empieza el array y el tercero el número de byte que quieres mandar del array, el problema es que no se como coger ese array en el pic. solo cojo de uno o dos como mucho en cada envío.
 
#4
La clase SerialPort... si de enviar un array de bytes se trata, estas muy cerca...
- Cargas un array (tipo byte o char).
- En Write, cargas el array e indicas el inicio y fin del mismo.

Código:
byte[] buffer = new byte[] { 1, 2, 3, 4 };
serialPort1.Write(buffer, 0, buffer.Length - 1);
Está en C# pero es lo mismo en Basic.

Por lado del PIC, prueba a una menor velocidad si no es tán crítico los 116279 que usas... por decir a unos 9600.
Como la recepción es consecutiva, el PIC debe de detectar donde inicia y donde termina el array, básicamente una forma es cuando detecta el primer byte, se queda esperando hasta el final que puede ser un retorno de carro o algo para indicar al PIC que es el fin de array.
Otra forma es recepcionar por interrupción, por cada interrupción es un byte que está en el buffer de entrada del PIC que está listo para ser leido; éste ya lo puedes almacenar en variables u array.

Saludos
 
Última edición:
#5
Creo que seria mas conveniente que lo hagas por interrupcion, ya que si el envio del array es muy largo, y dado que la comunicacion es asincronica, los errores en los clock, puede hacer que tu sistemas lea un bits equivocado a causa del corrimiento en los instantes de lectura.
 
#7
si lo hago con una interrupción? lee mejor los bytes? es mas rapido? o es que no se pierden por que se quedan en cola o algo asi?
Adecuado en cierto modo...
La interrupción sucede cuando un byte está listo para ser leido del buffer de recepción, esto también hace que el PIC le preste atención a la interrupción en cualquier momento sin importar donde esté el programa... así que analiza bien la lógica de control ya que usar interrupciones puede ser algo engorroso (depende).
Una interrupción no asegura que el dato entre perfectamente, en la mayoria de casos no hay problema por eso te sugerí que pruebes a menor velocidad, así el dato no se reescribe en el buffer y no pierdes información, además el PIC tiene algo más de tiempo para hacer otros trabajos mientras se recepciona el byte.
 

Arriba