У меня возникли проблемы с согласованием UART с BBB. Я установил все, как показано на this page для неканонических входов. Кажется, я могу передать очень хорошо, даже в третьем цикле. Это команда чтения, которая, кажется, получает меня. Я даже не уверен, с чего начать, поэтому любые указатели будут очень благодарны! Вот код, я использую:BeagleBone Black: UART разбивает BBB после двух успешных вызовов для записи на запись
EDIT: Для конкретности
Когда я говорю, два чтения и записи звонков, я имею в виду мой цикл выполняется, как ожидается, в два раза. Я отправляю данные и читаю именно то, что я ожидал. При третьей попытке чтения, после того, как «пишет данные ...» printf выполняется, программа выйдет из строя. Я все еще могу использовать 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]);
}
Просьба уточнить, что такое ваш проблет. – jdabrowski
Чтобы быть ясным: когда вы говорите «два успешных вызова для записи на чтение», вы имеете в виду, что прочитанные вызовы возвращают ожидаемые данные и что «num_bytes» было возвращено как 2 каждый раз? –
Но как он может выполнять две итерации с этим условием 'while'? –