Member 14499788 Ответов: 1

Проблема с получением более одного символа


Здравствуйте! после того, как,
Я новичок, занимающийся проектами с TTN
В настоящее время я работаю с микрочипом SAMR34.Я пытался сделать проект, где он считывает введенный номер и dsiplays его, enetred номер можно увидеть с помощью эмулятора. Я использовал TeraTerm для этой цели.

Последовательный обработчик данных, приведенный в примере проекта, считывает только один символ, я изменил код таким образом, чтобы он считывал более одного символа одновременно.Полученное значение хранится int в буфере SerialBuffer, но как только номер вводится для запроса соединения, он останавливает процесс подачи заявки и не движется дальше.

Приведенный ниже код является формой примера проекта:

static char SerialBuffer;

void serial_data_handler(void)
{
    int rxChar;
    char serialData;
    /* verify if there was any character received*/
    if (startReceiving == true)
    {
        if((-1) != (rxChar = sio2host_getchar_nowait()))
        {
            serialData = (char)rxChar;
            if((serialData != ‘\r’) && (serialData != ‘\n’) && (serialData != ‘\b’))
            {
                startReceiving = false;
                serialBuffer = rxChar;
                appPostTask(PROCESS_TASK_HANDLER);
                printf("\r\n");
            }
        }
    }
}


Что я уже пробовал:

то, что я пробовал: но это не работает !
void serial_data_handler(void)
{
    // uint8_t rxChar;
    char serialData;
    char arr[10];
    char recv;
    int i = 0;
    int value;
    recv = 0x00;

    /* verify if there was any character received*/
    if (startReceiving == true)
    {
        while(('\n' != recv)&&('\r' != recv) && ('\b' != recv))
        {
            recv = sio2host_getchar();
            arr[i] = recv;
            i++;		
        }
        //startReceiving = false;
        value =(int)atoi(arr);
        serialBuffer = value;
        appPostTask(PROCESS_TASK);
    }
}
если у кого-то есть какие-то идеи, пожалуйста, поделитесь ими . Это было бы большим подспорьем!

Спасибо

1 Ответов

Рейтинг:
7

Rick York

Кое-что для меня примечательно.

1: Вы не инициализируете значение recv. Вероятно, он должен быть установлен в 0, чтобы быть уверенным, что он входит в ваш цикл while хотя бы один раз.

2: ваш буфер массива arr имеет размер 10, но вы потенциально можете получить более десяти символов, потому что циклу все равно, сколько вы получите. Это может быть очень плохо.

3: atoi ожидает строку с нулевым завершением. Вы должны убедиться, что нулевой символ находится в конце этой строки. Похоже, что этого не происходит с вашим кодом.

4: пример кода вызывает sio2host_getchar_nowait (), а ваш-sio2host_getchar(). Это не одно и то же. Вероятно, вам следует убедиться, что вы вызываете правильную функцию. Если бы я догадался, то оказалось бы, что вы вызываете блокирующую версию.


KarstenK

Отличный ответ, я надеюсь, что спрашивающий понимает все пункты. :-)

Member 14499788

Спасибо за ваши ценные предложения. Я постараюсь сделать то же самое