Попытка извлечь данные из последовательного порта, но программа зависла на getchar - PullRequest
1 голос
/ 10 апреля 2020

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

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

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

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();
}

1 Ответ

1 голос
/ 10 апреля 2020

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

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


1 Я не сделал не ищите нормативный источник, это всего лишь мой первый хит в Google.

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

...