Отправьте сообщение правильно UART - PullRequest
0 голосов
/ 28 августа 2018

В моем коде у меня есть последовательное прерывание, которое срабатывает, когда происходит событие (получение). В этом я сохраняю данные в буфер и отправляю буфер для анализа. У меня проблема в том, как я могу получить весь ответ от последовательного порта в буфер, а не только один символ за раз?

Serial pc(USBTX, USBRX);
Serial sim(GSM_TX_PIN, GSM_RX_PIN);
count =0;
int main()
{
    sim.attach(&dispatchMsg); //Interrupt handler
    wait(1);

    sim.puts("AT\r\n");

    while()
    {
    }
}

void dispatchMsg()
{
    while(sim.readable()){
        char c = sim.getc();
        buffer[count++] = c;
    } 

    //Here i want to wait for whole response from uart instead i fetch only one char
    void analyzeString(buffer);
}

void analyzeString(char* str)
{            
    /*Do something with the str ...*/         
}

Пример входящих ответов от модуля sim:

AT
OK
ERROR
+CMGI: ...

IDE: mbed

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Чтобы конкретно ответить на ваш вопрос, вы можете проверить готовность полученного буфера (при условии, что после получения "\ r \ n") для анализа:

void dispatchMsg()
{
    static int end_char_count = 0;
    while(sim.readable() && end_char_count < 2){
        char c = sim.getc();
        buffer[count++] = c;
        if(c == '\r' || c == '\n')
            end_char_count++;
        else
            end_char_count = 0;
    } 

    //Here i want to wait for whole response from uart instead i fetch only one char
    if(end_char_count == 2)
    {
        end_char_count = 0;
        analyzeString(buffer);
    }
}

Однако обработчик прерываний должен быть максимально быстрым. В противном случае вы можете начать терять последовательные данные. Обычно обработка данных делегируется основному потоку, оставляя данные в буфере / очереди и опрашивая основной поток для получения полных данных. Драйверы UART и ATCmdParser сделают это за вас, как указано @ Jan.

Кроме того, если ваш вопрос находится в контексте команд AT, то можно получить многострочный ответ. В этом случае ваш analyString () должен выполнять некоторую похожую буферизацию, пока не будут получены все ожидаемые строки. Или расшифруйте ответ при получении каждой строки.

0 голосов
/ 29 августа 2018

Используйте ATCmdParser вместо использования необработанного UART. Он уже выполняет анализ и буферизацию для вас и является частью Mbed OS 5.

...