Ayuda con puerto serial

Buenas,

Me presento en el foro, hace poco he adquirido un Arduino UNO para empezar a trastear, y queria haceros una pregunta.

En su dia hice un programa en VB que se comunicaba por rs232 (tenía que convertir la señal con un max232) con un hardware externo, bien, mi intención es substituir el PC por el Arduino.

La pregunta es, es necesario mantener el max232? Que pines tendría que usar en el Arduino? Con los digitales 0 y 1 ya bastaría?

Gracias.

Saludos

Hola Creative,

estoy con tu mismo problema así que trabajando juntos lo resolveremos.

Te explico lo que he desarrollado hasta ahora. Teoricamente los pines RX,TX del Arduino estan conectados con el USB por lo que si se hace un programa que los use la segunda vez que carges un programa no te funcionara (por lo menos es lo que me pasa en el Arduino UNO).

Por otro lado con RX,TX no tienes control de errores así que no es un RS232 completo. Si lo que quieres (como yo es un RS232 completo) tienes que poner un MAX232 y conectar al Arduino.

Actualmente tengo todo en protoboard y funciona pero estoy usando los pines 2 y 3 con la librería SoftwareSerial.h que si lees tiene limitaciones de velocidad y de detección de datos disponibles.

Teniendo todo conectado uso este programa de ejemplo conectado con el PC y con el HyperTerminal y me funciona de fabula.

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte pinState = 0;

void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

void loop() {
  // listen for new serial coming in:
  char someChar = mySerial.read();
  // print out the character:
  mySerial.print(someChar);
  // toggle an LED just so you see the thing's alive.  
  // this LED will go on with every OTHER character received:
  toggle(13);

}


void toggle(int pinNum) {
  // set the LED pin using the pinState variable:
  digitalWrite(pinNum, pinState); 
  // if pinState = 0, set it to 1, and vice versa:
  pinState = !pinState;
}

Mi siguiente paso es conectado con un dispositivo que no es el PC y que tiene el RS232 completo y ver si tengo el circuito bien montado.

En definitiva que creo que SI tendrias que montar el MAX232

El arduino usa serie TTL-5V y los puertos serie del PC, RS232, por lo que si quieres conectarlo a un puerto serie del PC deberás usar el MAX232 que convierte las señales de TTL-5V a RS232 y seguirá sin control de errores alguno.

Un saludo

Buenas,

Gracias por las respuestas ;)

Te explico lo que he desarrollado hasta ahora. Teoricamente los pines RX,TX del Arduino estan conectados con el USB por lo que si se hace un programa que los use la segunda vez que carges un programa no te funcionara (por lo menos es lo que me pasa en el Arduino UNO).

Esto no me importa, puesto que cada vez que quiera cargar el programa al Arduino, puedo desconectar los pines RX/TX.

Por otro lado con RX,TX no tienes control de errores así que no es un RS232 completo. Si lo que quieres (como yo es un RS232 completo) tienes que poner un MAX232 y conectar al Arduino.

Si hay que usar el MAX232 se usa :)

Yo la librería SoftwareSerial.h no la puedo usar porque trabajo con esta configuración; 115200 bits por segundo, paridad impar, 8 bits de datos y 2 bits de stop.

He probado a conectar el cacharro al Arduino mediante el max232 y los pines rx/tx, y no recibo nada coherente :(

Dejo mi código:

inline void serialOpen(const uint32_t baud=9600, const uint8_t char_bits=8, const uint8_t stop_bits=1, const uint8_t parity=0);

void setup() {
    serialOpen(115200, 8, 2, 1);
}

void loop() {

  if (Serial.available()) {
    unsigned char inByte = Serial.read();
    Serial.print(inByte, HEX); 
  }

}

inline void serialOpen(const uint32_t baud, const uint8_t data_bits, const uint8_t stop_bits, const uint8_t parity) {

// open a serial port, same as "Serial.begin()"
//  parameters:
//    - baud rate ( 1953 to 1000000 baud for 8Mhz, 3906 to 2000000 for 16Mhz )
//        default = 9600
//    - character/data bits ( 5, 6, 7, or 8 )
//        default = 8
//    - stop bits ( 1 or 2 )
//        default = 1
//    - parity ( 0 = none, 1 = odd, 2 = even )
//        default = 0
  
        uint16_t baud_setting;
        uint8_t frame_format;

        
        // U2X mode is needed for baud rates higher than ( Hz / 16 )
        if( baud > F_CPU / 16 ) {
                // U2X mode allows for baud rates up to twice as fast as regular mode
                
              // enable U2X mode
              UCSR0A = 1 << U2X0;
                
                // U2X style ubbr calculation
                baud_setting = ( F_CPU / 4 / baud - 1 ) / 2;
        } else {
                // regular mode makes up for it's lower baud-rates by handling clock skew better
                
              // disable U2X mode
              UCSR0A = 0;
                
                // regular style ubbr calculation
                baud_setting = ( F_CPU / 8 / baud - 1 ) / 2;
        }
        
        switch(data_bits) {
                case 5: frame_format = 0; break; // 5 data bits
                case 6: frame_format = (1<> 8;
        UBRR0L = baud_setting;
        
        // enable the serial recieve pin, transmit pin, and recieve interrupt
        UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
        
        // Set frame format
        UCSR0C = frame_format;
}

Por cierto, no es posible cambiar la configuración del puerto COM desde el IDE de arduino?

Saludos

Hola,

he avanzado un poco y te cuento. En lugar de utilizar la librería SoftwareSerial.h he utilizado la que se encuentra en:

http://arduiniana.org/libraries/newsoftserial/

Se llama NewSoftSerial y permite llegar hasta los 115200.

Respecto al hardware te diria que primero mires con la librería estandard o esta que te indico para verificar que las conexiones son correctas.

En mi caso quiero conectarme con un glucometro LifeScan One Touch Ultra 2 que requiere el RTS y el CTS pero no obtengo respuesta por su parte. El protocolo me funciona simulandolo con el PC pero cuando me quiero conectarme con el glucometro creo que no funciona el controls de flujo.

Buenas,

Estoy probando la newsoftserial pero me parece que sigo igual, además con esta librería no puedo cambiar los bits de stop, paridad, etc... :(

Saludos

Buenas,

Creo que he conseguido algo (con la librería Serial), recibo unos valores que, aunque no son correctos, son siempre fijos, me explico: Si recibo 0x01, realmente es 0xFF y si recibo 0xEE realmente es 0x02, por lo que es relativamente fácil hacer una tabla para que me substituya los valores "falsos" por los "buenos". Pero creo que eso no es una solución...

Saludos