Попытка получить данные из последовательного порта, но программа зависла на getchar

Я использую встроенную систему для отправки данных с 25 датчиков на замазочный терминал на моем компьютере. Прекрасно работает.

Я хотел добавить функцию чтения из терминала во встроенную систему (чтобы я мог отправлять команды). Поэтому я попытался использовать getchar(), чтобы прочитать все, что я напишу на своем терминале шпатлевки. Сначала я просто хотел получить char и распечатать символ обратно на замазке. Это вроде работает, но данные моего датчика, которые должны печатать каждые 500 мс, не печатаются, пока я не наберу символ в замазке. Это как если бы мой код застрял на getchar() и застрял в цикле while, пока getchar() что-то не прочитает.

Вот мой вечный цикл в моем int main(). Я не делюсь остальным, так как он на самом деле не нужен и слишком громоздкий (это просто инициализация модулей). В этом цикле я считываю датчик, пытаюсь прочитать из замазки, записываю в замазку и начинаю следующее сканирование:

for(;;)
{

    CapSense_ProcessAllWidgets(); // Process all widgets 
    CapSense_RunTuner();    // To sync with Tuner application           

    read_sensor(curr_elem);  //read curr_elem

    (curr_elem < RX4_TX4)?(curr_elem++):(curr_elem = 0, touchpad_readings_flag++);

// Here is the part to read I added which blocks until I type in something.
// If I remove this if and all of what's in it, I print to putty every 500ms
    if(touchpad_readings_flag) 
        {
                    char received_char = getchar();
                if (received_char) //if something was returned, received_char != 0
                    {
                        printf("%c", received_char);
                    }
        }

//Here I write to putty. works fine when I remove getchar()    
    if (print_counter_flag && touchpad_readings_flag) 
    {
        print_counter_flag = 0;
        touchpad_readings_flag = 0;
        for (int i = 0; i < 25; i++)
        {
            printf("\n");
            printf("%c", 97 + i);
            printf("%c", val[i] >> 8);
            printf("%c", val[i] & 0x00ff);  // For raw counts
            printf("\r");
        }  
    }       


    /* Start next scan */
    CapSense_UpdateAllBaselines();
    CapSense_ScanAllWidgets();
}

person JCSB    schedule 09.04.2020    source источник


Ответы (1)


По-видимому, ваш вызов getchar() блокируется, если нет входных данных для извлечения. Одно из решений для изменения этого поведения было дано еще одна статья на другой доске SE.

Также обратите внимание, что getchar() является оболочкой для getc(), которая действует на stdin как этого сайта. 1 описывает. Для getc() вы найдете дальнейшие обсуждения. В одном из них указано, что некоторые важные реализации даже ожидают появления символа новой строки, пока ввод доставляется в вашу функцию. Я думаю, это зависит от стандартных библиотек/типа встроенной системы, которую вы фактически используете. Пожалуйста, ознакомьтесь с документацией вашего поставщика набора инструментов.2


1 Я не искал нормативный источник, это просто мой первый поиск в Google.

2 В вопросе не указан тип встроенной системы, поэтому требуется общий ответ, а не обсуждение конкретных комбинаций целевой/инструментальной цепочки, IMO.

person HelpingHand    schedule 10.04.2020
comment
Ты был прав. В качестве устройства использовалась плата разработки PSoC 6 от Cypress semiconductors. решение состояло в том, чтобы добавить оператор if, чтобы проверить, был ли буфер пуст или нет, перед вызовом getchar(). В случае, если он был пуст, вызов getchar() был тем, что блокировало мой код! - person JCSB; 11.04.2020
comment
Отлично. Я добавил арку. информацию явно на ваш вопрос, потому что я пропустил только тег psoc при чтении в первый раз. - person HelpingHand; 11.04.2020