У меня возникли проблемы с согласованием UART с BBB. Я настроил все, как показано на этой странице для не -канонические входы. Кажется, я могу нормально передавать даже на третьем цикле. Это команда чтения, которая, кажется, меня достала. Я даже не совсем уверен, с чего начать, поэтому любые указатели будут очень признательны! Вот код, который я использую:
РЕДАКТИРОВАТЬ: Для конкретики
Когда я говорю два вызова чтения и записи, я имею в виду, что мой цикл выполняется, как и ожидалось, дважды. Я отправляю данные и читаю именно то, что я ожидал. При третьей попытке чтения, после выполнения printf "write data...", программа вылетает. Я по-прежнему могу нажать CTRL-C и запустить BBB, как обычно, а перезапуск программы позволит мне читать и писать ровно дважды, прежде чем возникнет та же проблема.
С условием цикла while я случайно забыл добавить инициализацию переменной read_test в код, который вы видите ниже. Я добавляю эту последовательную связь к гораздо более крупной программе, управляющей роботом, которого я исследую. Я считаю, что захватил весь соответствующий код, этот тест — первое, что происходит после того, как я инициализирую все необходимые мне переменные, однако, если весь файл полезен, я могу его добавить.
void SERIAL_Init(void)
{
/*******************************************************************/
printf("\tSerial Port Initialization ...");
SERIAL_fd = open(MODEMDEVICE,O_RDWR | O_NOCTTY /*| O_NDELAY*/);
if (SERIAL_fd < 0)
{ perror(MODEMDEVICE);
exit(-1);
}
fcntl(SERIAL_fd,F_SETFL,0);
tcgetattr(SERIAL_fd,&newtio);
newtio.c_cflag |= CS8 | CLOCAL | CREAD ;
cfsetispeed(&newtio,BAUDRATE);
cfsetospeed(&newtio,BAUDRATE);
newtio.c_iflag = IGNBRK | IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0;
newtio.c_cc[VTIME]=0; /* inter-character timer unused */
newtio.c_cc[VMIN]=31; /* blocking read until 18 chars received */
tcflush(SERIAL_fd,TCIFLUSH);
tcsetattr(SERIAL_fd,TCSANOW,&newtio);
/****************************************************************/
printf("Done\n");
return;
}
//Test data for reading serial
unsigned char test_data[2] = {0x00,0x00};
//Read from maestro command
unsigned char read_command[2][2] = {
{0x1a,0x2b},
{0x90,0x05},
};
while(readTest == 0)
{
printf("Enter 0 to read from maestro pin, 1 to continue with testing\n");
scanf("%d",&readTest);
write(SERIAL_fd,read_command[0],2);
printf("Wrote values...\n");
num_bytes = read(SERIAL_fd,&test_data,2);
printf("Value read: %x %x\n",test_data[0],test_data[1]);
}
while
? - person Eugene Sh.   schedule 11.03.2016