Я относительно новичок во встроенном linux, поэтому извиняюсь, если есть простой ответ на этот вопрос или я не предоставляю необходимую информацию.
И если здесь есть концепция, которую я явно не понимаю, пожалуйста, укажите это, поскольку я делаю все это в качестве учебного упражнения.
Мне недавно нужно было использовать GPS-приемник neo -6 м и 3-осевой ускоритель adxl345 для сбора данных GPS и ускорения на Raspberry Pi 3 для проекта, над которым я сейчас работаю. По отдельности оба работают нормально. Однако, когда моя программа запускает их вместе, только один из них получит данные. Ниже мой код для настройки обоих:
int setup_for_acc_impl(void) {
// Create I2C bus
int file;
char *bus = "/dev/i2c-1";
if ((file = open(bus, O_RDWR)) < 0) {
printf("Failed to open the bus. \n");
exit(1);
}
// Get I2C device, ADXL345 I2C address is 0x53(83)
ioctl(file, I2C_SLAVE, 0x53);
// Select Bandwidth rate register(0x2C)
// Normal mode, Output data rate = 100 Hz(0x0A)
char config[2] = {0};
config[0] = 0x2C;
config[1] = 0x0A;
write(file, config, 2);
// Select Power control register(0x2D)
// Auto-sleep disable(0x08)
config[0] = 0x2D;
config[1] = 0x08;
write(file, config, 2);
// Select Data format register(0x31)
// Self test disabled, 4-wire interface, Full resolution, range = +/-2g(0x08)
config[0] = 0x31;
config[1] = 0x08;
write(file, config, 2);
return file;
}
и настройки для gps:
void gps_setup(void){
int uart0_filestream = -1;
uart0_filestream = open(PORTNAME, O_RDWR | O_NOCTTY | O_NDELAY);
if (uart0_filestream == -1)
{
printf("Failed to open the ttyS0. \n");
exit(1);
}
struct termios options;
tcgetattr(uart0_filestream, &options);
options.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
tcflush(uart0_filestream, TCIFLUSH);
tcsetattr(uart0_filestream, TCSANOW, &options);
}
и как я читаю данные с обоих из них:
//read data from adxl345,simply read
read(obu->i2c_fd, data, 6) ;
//read data from gps module
void serial_read_for_gps(char *buffer, int len)
{
char c;
char *b = buffer;
int rx_length = -1;
while(1) {
rx_length = read(uart0_filestream, (void*)(&c), 1);
if (rx_length <= 0) {
//wait for messages
printf("didn't receive any data\n");
sleep(1);
} else {
if (c == '\n') {
*b++ = '\0';
break;
}
*b++ = c;
}
}
}
Я не уверен, откуда проблема, любая помощь будет отличной.
Спасибо