2016-03-10 5 views
0

У меня возникли проблемы с согласованием 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]); 

    } 
+2

Просьба уточнить, что такое ваш проблет. – jdabrowski

+0

Чтобы быть ясным: когда вы говорите «два успешных вызова для записи на чтение», вы имеете в виду, что прочитанные вызовы возвращают ожидаемые данные и что «num_bytes» было возвращено как 2 каждый раз? –

+0

Но как он может выполнять две итерации с этим условием 'while'? –

ответ

0

Проблема была решена путем перехода к VMIN = 2, что соответствует количество данных я ожидал с каждой команды чтения. Чтение этой страницы было невероятно полезным. Я думал, что установка VMIN высокой не была проблемой, так как я все еще получал первые две команды, хотя количество байтов было ниже старого значения VMIN, однако теперь имеет смысл сказать: «Мы считаем, что это неопределенное поведение, если nbytes меньше VMIN ». Большое спасибо за помощь!