c - programa - puerto serial arduino
Lee arduino de la serie en C (2)
Si solo necesita recibir datos binarios en el lado de la PC y quizás reaccionar a algunos valores determinados y enviar algo a Arduino y registrar datos, por ejemplo,
entonces puede usar un programa de terminal RS232 más avanzado como http://docklight.de/
Tiene muchas más opciones y secuencias de comandos para básicamente hacer procesamiento de datos ant, pero yo no usé secuencias de comandos todavía.
Pero en pocos minutos puede tener datos leídos y respondiendo en formato ASCII o binario.
Por supuesto, para conectividad a una base de datos o más, necesitará un programa personalizado, pero para probar la operación durante la etapa de depuración, docklight es una gran herramienta.
Tengo el siguiente programa que intenta leer datos de un arduino que usa el puerto serie, la mayoría de las veces no lee nada, excepto que a veces se lee una parte de lo que estoy enviando. El código arduino simplemente está escribiendo una sola letra en un bucle.
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
int main() {
int serialfd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (serialfd == -1)
perror("Error opening the serial port");
else
fcntl(serialfd, F_SETFL, 0);
fprintf(stdout, "Device is open, attempting read /n");
fcntl(serialfd, F_SETFL, 0);
char buf[11] = {0};
read(serialfd, buf, 10);
fprintf(stdout, "Buffer: %s", buf);
close(serialfd);
return 0;
}
por ejemplo, la salida es así
Device is open, attempting read
Buffer: AAAAAAAAAAA⏎
Si intento ejecutarlo nuevamente (varias veces) obtengo el buffer 0''d
Device is open, attempting read
Buffer: ⏎
Suena como un problema de configuración, lo más probable es que la velocidad de transmisión no esté configurada correctamente. Además, como se menciona en los comentarios de la pregunta, es posible que obtenga un búfer completo sin carácter ''/0''
al final, por lo que fprintf
no se comporta correctamente.
Aquí explicaré cómo establecer la velocidad en baudios, pero puede usar el enlace wikibooks que puse más abajo en la respuesta para establecer otras configuraciones, también asegúrese de verificar el búfer.
Poniéndolo simplemente en el arduino, me gusta usar 115200 como mi baudrate. Hay algunos más que suelen ser compatibles con otros dispositivos, pero este valor no tiene ningún problema, así que lo usaré para mi ejemplo.
En Arduino, probablemente sea lo único que tendrá que configurar (y, de hecho, es lo único que configuro cuando deseo usar el puerto serie para hablar con mi computadora).
Serial.begin(115200);
Luego, de acuerdo con este wikibook puede establecer su velocidad de termios
en baudios mediante la configuración de termios
, como en el ejemplo de wikibook lo llamaré attribs
.
struct termios attribs;
/* get the current settings */
tcgetattr(serialfd, &attribs);
/* set the baudrate */
cfsetospeed(&attribs, B115200); /* outut baudrate */
cfsetispeed(&attribs, B115200); /* input baudrate */
/* if there is need for it, set other settings here */
/* eventually apply everything for your serialfd descriptor */
tcsetattr(serialfd, TCSANOW, &attribs);
Entonces, sí, técnicamente, podría tener diferentes velocidades de entrada que de salida, pero el UART del arduino solo tiene una de estas configuraciones y no admite velocidades diferentes para la entrada / salida , por lo que debe configurarlo para ambos en la computadora con el mismo valor.