Comunicación serie asíncrona con arduino Mega

Hola, estoy iniciándome con arduino y quería comunicar una balanza por un puerto serie de arduino mega. El inconveniente que tengo es que la balanza transmite con un protocolo asincrono (9600 bps, 1 bit de inicio, 7 bits de datos, 1 bit de stop y 1 bit de paridad). Con la libreria serie de arduino solo puedo configurar la velocidad de transmisión por lo que deduzco que será una comunicación síncrona.

¿Como puedo hacer que la comunicación sea asíncrona y configurarla con esos parámetros?

Gracias

Hola,

La comunicación es asíncrona… Pero es de 8 bits de datos (8N1).

Te va a tocar leer datasheet,ya que el micro puede trabajar con datos en 5, 6, 7, 8, or 9 Bits y 1 ó 2 bits de Stop.
(Es decir, puede hacer lo que buscas. Ver pág 206 del datasheet).

Tendrás que modificar HardwareSerial.cpp, que es donde se encuentras las funciones que manejan el puerto serie.
No he hecho nunca lo que dices, pero ojeando rápidamente el datasheet, he visto que el registro UCSRnC (Bit 2:1) junto a al registro UCSRnB (Bit 2), te configuran el tamaño del caracter:
UCSZn2 UCSZn1 UCSZn0 Character Size
0 1 0 7-bit

También te tendrás que mirar el tema paridad, porque el arduino por defecto no usa paridad. Es el mismo byte de configuracion (UCSRnC, bits 5:4). Tendrás que saber si usa par ó impar.

Tiene pinta que sólo modificando la inicialización(Serial.begin) te sirve… Igual, con poner el registro con los valores adecuados, despues de la orden Serial.begin, te hes suficiente.
Serial.begin(9600);
UCSR0C = (1<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(0<<UCSZ0);
resto código…

Se supone que te dejaría 9600,7bits, paridad par

Pero repito que nunca lo he hecho, sólo contesto para dar ánimos…ja,ja,ja :wink:
Por cierto, para que una comunicación sea síncrona, necesitan compartir una señal de reloj (pin XCK).

Salu2

Igor R.

Gracias Igor,

Ya lo había visto en el datasheet, hay que configurar el registro UCSRnC=B00110100; --> n=numero de puerto serial

Ahora lo que no consigo hacer es que me lea los byte cambiando los bits más significativos (MSB) por los menos signiticativos (LSB).

Cuando envío un caracter por ejemplo:

envío "i" --> BIN= 1101001 recibo "K" --> BIN=1001011

Puedo hacer la traducción utilizando operaciones lógicas, pero ¿no hay ningún registro donde pueda configurar el orden de los bits?.

Saludos.

Uff... ni idea... pero buscando en google, he visto algo curioso de renesas que explican como hacerlo de forma eficiente: http://documentation.renesas.com/eng/products/mpumcu/apn/reg05b0008_h8slpap.pdf

Bueno, ésto me pasa por ser tan rápido. No había tenido en cuenta que tenía que convertir los valores de RS232 a TTL.