Jump to content

    

Проблема с UART

9 minutes ago, andrey_p said:

Да, именно так.

 

Для ответа на этот вопрос нужно понимать, по какому "интерфейсу" у Вас работает то, что подключено к UART. Также нужно понимать, каким образом Вы планируете обрабатывать данные UART в приложении.

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

Share this post


Link to post
Share on other sites
3 minutes ago, jenya7 said:

пользователь вводит команду и по терминальному символу

В таком случае от посимвольного ввода на уровне приложения Вам не уйти. Во время ожидания лучше не прыгать по таймаутам. Однако нужно предусмотреть возможность обработки copy/paste в консоль, то есть после приёма первого символа от пользователя есть смысл перейти на буферный приём и обработать все данные из буфера до следующей паузы. Таким образом Вы уменьшите количество вызовов read().

Share this post


Link to post
Share on other sites

Используйте объект serial(вроде так называется) - он вам сообщит когда появится байт, ну или "в лоб" запускайте в отдельном треде чтение порта в цикле.

Share this post


Link to post
Share on other sites
5 minutes ago, HardEgor said:

Используйте объект serial(вроде так называется) - он вам сообщит когда появится байт, ну или "в лоб" запускайте в отдельном треде чтение порта в цикле.

отдельный тред это идея. буду разбираться как в линуксе запустить тред.

Share this post


Link to post
Share on other sites
1 минуту назад, jenya7 сказал:

отдельный тред это идея. буду разбираться как в линуксе запустить тред.

:) и еще 3 страницы "как запустить тред в линуксе"

Share this post


Link to post
Share on other sites
4 minutes ago, HardEgor said:

:) и еще 3 страницы "как запустить тред в линуксе"

может и одной страницы хватит :))

#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>

pthread_t tid[2];

void* doSomeThing(void *arg)
{
    unsigned long i = 0;
    pthread_t id = pthread_self();

    if(pthread_equal(id,tid[0]))
    {
        printf("\n First thread processing\n");
    }
    else
    {
        printf("\n Second thread processing\n");
    }

    for(i=0; i<(0xFFFFFFFF);i++);

    return NULL;
}

int main(void)
{
    int i = 0;
    int err;

    while(i < 2)
    {
        err = pthread_create(&(tid[i]), NULL, &doSomeThing, NULL);
        if (err != 0)
            printf("\ncan't create thread :[%s]", strerror(err));
        else
            printf("\n Thread created successfully\n");

        i++;
    }

    sleep(5);
    return 0;
}

щас буду в код запихивать :))

Share this post


Link to post
Share on other sites

сделал так

pthread_t tid[2];

void *UartTask (void * arg)
{
    arg = NULL;

    if (UART_Read())
    {
        UART_WriteString(uart_buff_rx);
        printf("%s", uart_buff_rx);
    }

    return arg;
}

int main(void)
{
    UART_Init("/dev/ttyAMA0");
  
    stat = pthread_create(&(tid[0]), NULL, &UartTask, NULL);
    if (stat != 0)
    {
        printf("Thread UartTask ERROR = %s\n", strerror(stat));
    }
    else
    {
        printf("Thread UartTask OK\n");
      
     while (1)
     {
       udp_rx_size = UDP_Read(udp_buff_rx, 1024);

       if (udp_rx_size > 0)
       {
           printf("message size = %d \n", udp_rx_size);
           UDP_HandleRecvPacket(udp_buff_rx);
       }
    }
      
    return 0;
  }

все скомпилировалось но я не вижу приходящих символов.

если этот код

if (UART_Read())
    {
        UART_WriteString(uart_buff_rx);
        printf("%s", uart_buff_rx);
    }

помещаю в while (1) то все работает, символы приходят.

Share this post


Link to post
Share on other sites

Всё правильно - он прочитал один байт в треде и вышел из него.

А подумать не пробовали? :)

 

Share this post


Link to post
Share on other sites
10 minutes ago, HardEgor said:

Всё правильно - он прочитал один байт в треде и вышел из него.

А подумать не пробовали? :)

 

void *UartTask (void * arg)
{
    arg = NULL;
    
    while (1)
    {  
        if (UART_Read())
        {
            UART_WriteString(uart_buff_rx);
            printf("%s", uart_buff_rx);
        }
    }
    return arg;
}

так тоже не работает

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this