/ / Lectura de datos de puerto serie - c, file-io, serial-port, arduino, arduino-ide

Lectura de datos de puerto serie: c, file-io, serial-port, arduino, arduino-ide

Estoy tratando de leer los datos del puerto serie en C en Mac OS. La configuración del puerto serie se realiza en Arduino IDE por separado.

Soy capaz de leer datos parciales, pero luego ellos datos impresos se repiten y comienzan a leer ceros como se ve a continuación. Si elimino O_NONBLOCK, el programa simplemente se bloquea. ¿Qué puedo hacer para solucionar este problema? En segundo lugar, dado que estoy leyendo datos en un bucle for, ¿cómo me aseguro de que la velocidad de lectura se corresponda con la velocidad en baudios?

Datos vistos: 296 310 0

320 295 311

320 295 311

9 296 311

320 295 311

320 295 311

9 296 311

...

0 0 0

0 0 0

0 0 0 etc.

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>

int buffer[300];

int main(int argc, const char* argv[])
{

// open serial port
int port;
port = open("/dev/tty.usbmodem1411", O_RDONLY | O_NONBLOCK);
if (port == -1)
{
printf("Unable to open serial port.n");
return 1;
}

// instantiate file
FILE* file = fdopen(port, "r");
if (file == NULL)
{
printf("Unable to instantiate file.n");
close(port);
return 2;
}

for (int j = 0; j < 200; j++)
{

fscanf(file, "%d %d %d", &buffer[3*i], &buffer[3*i+1], &buffer[3*i+2]);
printf("%d %d %dn", buffer[3*i], buffer[3*i+1], buffer[3*i+2]);

i = (i + 1) % 100;

usleep(10000);

}

fclose(file);
close(port);

return 0;

}

Respuestas

0 para la respuesta № 1

Para Chris Stratton:

if (fgets(temp, sizeof(temp), file) != NULL)
{
sscanf(temp, "%d %d %dn", &buffer[3*i], &buffer[3*i+1], &buffer[3*i+2]);
printf("%d %d %dn", buffer[3*i], buffer[3*i+1], buffer[3*i+2]);
}

Sin embargo, volviendo a mi pregunta original, inclusoSi estoy usando fscanf e printf, obtengo datos y luego solo leo los ceros de forma indefinida. ¿Estoy pensando que esto podría ser más un problema de comunicación de puerto serie?