arhiv6 14 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба Ну и зачем тогда делать sudo adduser pi dialout, если группа у файла tty? Выполните sudo usermod -a -G tty pi и пробуйте открывать файл /dev/ttyAMA0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 1 декабря, 2019 Опубликовано 1 декабря, 2019 (изменено) · Жалоба 1 hour ago, arhiv6 said: Ну и зачем тогда делать sudo adduser pi dialout, если группа у файла tty? Выполните sudo usermod -a -G tty pi и пробуйте открывать файл /dev/ttyAMA0 после ристарта я вижу группу tty но errno = 13 может нужно добавить ttyAMA0 в группу tty с нужными разрешениями чтения\записи? Изменено 1 декабря, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
arhiv6 14 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба У группы на файл все права есть (crw-rw-rw- 1 root tty 204, 64 /dev/ttyAMA0). Посмотрите в каких группах состоит пользователь после перезагрузки (команда groups $USER), есть ли среди них группа tty ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 1 декабря, 2019 Опубликовано 1 декабря, 2019 (изменено) · Жалоба 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 файл не открывается. Изменено 1 декабря, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jury093 2 1 декабря, 2019 Опубликовано 1 декабря, 2019 · Жалоба 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." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 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." может быть. при поднятии я вижу системные уведомления в терминале. а как это сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба Это помогло Raspberry Pi Configuration -> Interfaces -> Serial Console -> Disable Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 (изменено) · Жалоба Но сейчас другая проблема. Настройка #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 - на всех печатает мусор в терминале. Изменено 2 декабря, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба Вы передаете адрес адреса строки. Амперсанд лишний. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 8 minutes ago, GenaSPB said: Вы передаете адрес адреса строки. Амперсанд лишний. большое спасибо. действительно без амперсанда все работает. QT ругается на передачу структур без амперсанда так я леплю его везде :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба у меня возник вопрос по приему из 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 1 hour ago, jenya7 said: большое спасибо. действительно без амперсанда все работает. QT ругается на передачу структур без амперсанда так я леплю его везде :)) Ругань зависит от того какой параметр ожидает функция. А не глобально на всю библиотеку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrey_p 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 32 minutes ago, jenya7 said: во втором случае, я так понимаю, мне придется слать пакеты фиксированной длины BUF_SIZE, иначе я не выйду из read Вы можете устанавливать таймауты, посмотрите на tcsetattr(). Вам нужны параметры VMIN и VTIME. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 (изменено) · Жалоба 5 minutes ago, andrey_p said: Вы можете устанавливать таймауты, посмотрите на tcsetattr(). Вам нужны параметры VMIN и VTIME. то есть если я не получу BUF_SIZE он выйдет по VTIME? ну если это так это просто праздник какой то. но тут другая проблема - если ползователь вводит символы с терминала - какой VTIME между символами? я же не знаю его скорость печати, он и уснуть может на пол пути. Изменено 2 декабря, 2019 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrey_p 0 2 декабря, 2019 Опубликовано 2 декабря, 2019 · Жалоба 37 minutes ago, jenya7 said: то есть если я не получу BUF_SIZE он выйдет по VTIME? ну если это так это просто праздник какой то. Да, именно так. 38 minutes ago, jenya7 said: но тут другая проблема - если ползователь вводит символы с терминала - какой VTIME между символами Для ответа на этот вопрос нужно понимать, по какому "интерфейсу" у Вас работает то, что подключено к UART. Также нужно понимать, каким образом Вы планируете обрабатывать данные UART в приложении. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться