Ciao a tutti.
Ho un problema utilizzando la seriale di arduino tramite i pin RX e TX (0 e 1) invece che tramite usb.
Innanzitutto allego il codice che sto utilizzando (un semplice echo del carattere che spedisco dal serial monitor).
char incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print((char)incomingByte);
}
}
Sto utilizzando un adattatore usb/seriale che sono sicuro che funziona (lo utilizzo al lavoro quotidianamente). Collego come segue:
- il pin 3 (TX) dell'adattatore usb/seriale al pin 0 (RX) di arduino;
- il pin 2 (RX) dell'adattatore usb/seriale al pin 1 (TX) di arduino;
- il pin 5 (GND) dell'adattatore usb/seriale alla massa di arduino;
Carico lo sketch e mi collego con la serial monitor: se provo a scrivere singoli caratteri, questi vengono ricevuti e rispediti (se mando un carattere mi viene risposto un carattere, se ne mando due mi viene risposto due caratteri e così via). Il problema è che non sono corretti: è come se ci fosse il baudrate errato.
Riporto due esempi per far capire meglio:
- spedisco '1' -> ricevo 'L';
- spedisco '1234 -> ricevo 'L&¢>";
Ho notato però che spedisco più di 8 caratteri insieme, a partire dal nono carattere comincia a rispondere correttamente. Per esempio:
- spedisco '1234567890' -> ricevo 'L&"*2:90'
- spedisco '12345678ora comincia a rispondere in modo corretto' -> ricevo 'L&¢ª²:ora comincia a rispondere in modo corretto'
Ho a disposizione anche un programmatore avr-dragon e un atmega328p vergine senza bootloader che sto comincia ad utilizzare con tutta la toolchain di avr (per fare anche debug hardware con debugwire). Mi sono fatto il mio driver per la seriale ed ho lo stesso identico problema: ho provato a controllare com'è fatto il driver della seriale di arduino nei sorgenti ed è fatto esattamente come il mio.
Riporto anche il mio driver seriale che utilizzo con l'atmega328p e la toolchain avr se può tornare utile.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <string.h>
#include "ser.h"
#define UBRR ((F_CPU / (SER_BAUD_RATE * 16UL)) - 1)
static char ser_rcved_byte; /* Received byte via serial comm. */
/**
* Interrupt service routine on usart rx.
*
* @param USART_RX_vect usart rx vector.
*
* @return
*
* @warning global interrupt (function sei()) must be already called.
*/
ISR(USART_RX_vect)
{
while ((UCSR0A & _BV(RXC0)) == 0)
;
ser_rcved_byte = UDR0;
while ((UCSR0A & _BV(UDRE0)) == 0)
;
UDR0 = ser_rcved_byte;
}
/**
* Initializes serial module.
*
*/
void
ser_init(void)
{
uint16_t ubrr;
ubrr = ((F_CPU / (SER_BAUD_RATE * 16UL)) - 1);
/* Set baud rate. */
UBRR0H = ubrr >> 8;
UBRR0L = ubrr;
UCSR0B |= _BV(RXEN0) | _BV(TXEN0); /* Enable receiver and transmitter. */
UCSR0B |= _BV(RXCIE0); /* Enable reciever interrupt. */
if(SER_DATA_BITS == 8 && SER_STOP_BITS == 1)
{
UCSR0C |= _BV(UCSZ01) | _BV(UCSZ00); /* Set frame (8 data bits - 1 stop bit). */
}
}
Ho provato ad alimentare arduino sia con l'usb del portatile attaccato all'adattatore usb/seriale che con l'usb di un altro portatile: stesso problema.
Ho provato anche con baudrate diversi: identico comportamento.
Sbaglio io o mi sfugge qualcosa?
Grazie mille.
Buona serata a tutti.