Jump to content

    

Проблема с UART

Ну и зачем тогда делать sudo adduser pi dialout, если группа у файла tty? Выполните

sudo usermod -a -G tty pi

и пробуйте открывать файл /dev/ttyAMA0

Share this post


Link to post
Share on other sites
1 hour ago, arhiv6 said:

Ну и зачем тогда делать sudo adduser pi dialout, если группа у файла tty? Выполните


sudo usermod -a -G tty pi

и пробуйте открывать файл /dev/ttyAMA0

после ристарта я вижу группу tty но errno = 13

 

может нужно добавить ttyAMA0 в группу tty с нужными разрешениями чтения\записи?

Edited by jenya7

Share this post


Link to post
Share on other sites

У группы на файл все права есть (crw-rw-rw- 1 root tty 204, 64 /dev/ttyAMA0). Посмотрите в каких группах состоит пользователь после перезагрузки (команда groups $USER), есть ли среди них группа tty ?

Share this post


Link to post
Share on other sites
18 minutes ago, arhiv6 said:

У группы на файл все права есть (crw-rw-rw- 1 root tty 204, 64 /dev/ttyAMA0). Посмотрите в каких группах состоит пользователь после перезагрузки (команда groups $USER), есть ли среди них группа tty ?

да. я вижу tty в группах. и ls - l /dev/ttyAMA0 возвращает crw-rw-rw- 1 root tty 204, 64 /dev/ttyAMA0 но после ристарт, если я не делаю sudo chmod +666 /dev/ttyAMA0 файл не открывается.

 

Edited by jenya7

Share this post


Link to post
Share on other sites
4 часа назад, arhiv6 сказал:

У группы на файл все права есть (crw-rw-rw- 1 root tty 204, 64 /dev/ttyAMA0). Посмотрите в каких группах состоит пользователь после перезагрузки (команда groups $USER), есть ли среди них группа tty ?

вероятно ТС надо запретить getty который "держит" консольный порт AMA0

"Disable the login shell on the serial port in the interfacing options of "sudo raspi-config", and reboot. For B+ that may be all that is required."

Share this post


Link to post
Share on other sites
11 hours ago, Jury093 said:

вероятно ТС надо запретить getty который "держит" консольный порт AMA0

"Disable the login shell on the serial port in the interfacing options of "sudo raspi-config", and reboot. For B+ that may be all that is required."

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

Share this post


Link to post
Share on other sites

Но сейчас другая проблема.

Настройка

#define UART_SPEED B9600  //B38400 B115200
  
struct termios config;

int uart_fd;

int UART_Init(const char *filename)
{
    uart_fd = open(filename, O_RDWR | O_NOCTTY | O_NDELAY /*| O_NONBLOCK*/);
    if (uart_fd  < 0)
    {
        printf("Failed to open UART\n");
        printf(filename);
        printf("  errno = %d\n", errno);
        return -1;
    }
    else
    {
        printf("UART OK\n");
    }

    config.c_iflag &= ~(IGNBRK | BRKINT | ICRNL | INLCR | PARMRK | INPCK | ISTRIP | IXON);
    config.c_oflag = 0;
    config.c_lflag &= ~(ECHO | ECHONL | ICANON | IEXTEN | ISIG);

    config.c_cflag &= ~(CSIZE | PARENB);
    config.c_cflag |= CS8;
 
    //read returns after one char
    config.c_cc[VMIN] = 1;
    //delay between chars
    config.c_cc[VTIME] = 0;

    if (cfsetispeed(&config, UART_SPEED) < 0 ||
        cfsetospeed(&config, UART_SPEED) < 0)
    {
        printf("Error setting baud rate\n");
        return -1;
    }

    if (tcsetattr(uart_fd, TCSANOW, &config) < 0)  //TCSAFLUSH
    {
        printf("Error setting UART configuration\n");
        return -1;
    }


    return 0;
}

И вывод строки

void UART_WriteString(const char *str)
{
    //discard pending chars in tx buffer
    //tcflush(uart_fd, TCOFLUSH); 

    write (uart_fd, &str, strlen(str));

    //wait all chars are sent
    tcdrain(uart_fd);
}

и в мэйн


UART_Init("/dev/ttyAMA0");

UART_WriteString("Hello from UART\n");

 Но я вижу муссор - это значит бод рэйт с большой погрешностью. Пробовал разные 9600, 38400, 115200 - на всех печатает мусор в терминале.

Edited by jenya7

Share this post


Link to post
Share on other sites

Вы передаете адрес адреса строки. Амперсанд лишний.

Share this post


Link to post
Share on other sites
8 minutes ago, GenaSPB said:

Вы передаете адрес адреса строки. Амперсанд лишний.

большое спасибо. действительно без амперсанда все работает. QT ругается на передачу структур без амперсанда так я леплю его везде :))

Share this post


Link to post
Share on other sites

у меня возник вопрос по приему из UART. В обычном микроконтролере я по прерыванию собирал чары в буфер. а тут не знаю как поступить

так (собирать посимвольно, возможна потеря символа)
//read returns after one char
config.c_cc[VMIN] = 1;

void UART_Read()
{
    int rx_size = read(uart_fd, &chr, 1);
    if (rx_size > 0)
    {
        uart_buf[idx] = chr; 
        idx++;
    }
}

или так

config.c_cc[VMIN] = BUF_SIZE;

void UART_Read()
{
    int rx_size = read(uart_fd, &temp_buf, BUF_SIZE);
    if (rx_size > 0)
    {
        memcpy(uart_buf+ total_size, temp_buf, rx_size);
         
        total_size += rx_size;
    }
}

во втором случае, я так понимаю, мне придется слать пакеты фиксированной длины BUF_SIZE, иначе я не выйду из read.

Share this post


Link to post
Share on other sites
1 hour ago, jenya7 said:

большое спасибо. действительно без амперсанда все работает. QT ругается на передачу структур без амперсанда так я леплю его везде :))

Ругань зависит от того какой параметр ожидает функция. А не глобально на всю библиотеку. 

Share this post


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

во втором случае, я так понимаю, мне придется слать пакеты фиксированной длины BUF_SIZE, иначе я не выйду из read

Вы можете устанавливать таймауты, посмотрите на tcsetattr(). Вам нужны параметры VMIN и VTIME.

Share this post


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

Вы можете устанавливать таймауты, посмотрите на tcsetattr(). Вам нужны параметры VMIN и VTIME.

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

но тут другая проблема - если ползователь вводит символы с терминала - какой VTIME между символами? я же не знаю его скорость печати, он и уснуть может на пол пути.

Edited by jenya7

Share this post


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

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

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

 

38 minutes ago, jenya7 said:

но тут другая проблема - если ползователь вводит символы с терминала - какой VTIME между символами

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

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