Size: a a a

2021 July 01

KD

Konstantin Dolgikh in ru_raspberry
В одном случае данные по SBUS передавались ESP8266 -> Raspberry Pi. Успех. Питание ESP8266 получала от малины. Использовался пример из https://github.com/Carbon225/raspberry-sbus (просто сделал make и стало хорошо)

Во втором случае Raspberry Pi -> Mini Pix. Использовались часть файлов из проекта выше, но суть одна — функция open вызывается с РОВНО теми же параметрами
источник

АС

Александр Соломатин... in ru_raspberry
https://www.raspberrypi.org/documentation/configuration/uart.md
https://www.circuits.dk/setup-raspberry-pi-3-gpio-uart/
в первой ссылке про юарты что такое мини юарт и что он вроде как изначально включен. в 2 туториал кажется заставляет работать нормальный юарт, по крайней мере я что то похожее делал на убунте на 4 малине.
источник

KD

Konstantin Dolgikh in ru_raspberry
По первой ссылке сказано, что надо юзать AMA0. Результат тот же
источник

KD

Konstantin Dolgikh in ru_raspberry
Итак, с помощью sudo minicom -D /dev/ttyS0 я достоверно выяснил, что порт рабочий и замыкание Rx-Tx приводит к возврату передаваемых данных
источник

KD

Konstantin Dolgikh in ru_raspberry
То есть проблема именно в открытии порта моей программой, но я сейчас отдельно проверил, я делаю это точно также как в упомянутом выше проекте
источник

A

Andrey Sea in ru_raspberry
ага, то есть из консоли всё работает, а из программы нет?
источник

A

Andrey Sea in ru_raspberry
откуда вообще взялся этот sbus_install?
источник

KD

Konstantin Dolgikh in ru_raspberry
Я кидал ссылку выше
источник

KD

Konstantin Dolgikh in ru_raspberry
Сейчас вообще полное колдунство происходит
источник

KD

Konstantin Dolgikh in ru_raspberry
Я выяснил, что если сделать open с теми параметрами, которые в sbus_install, то всё отрабатывает корректно. Но если потом с дескриптором происходит кухня из функции sbus_install, то появляется ошибка сегментирования и система уверена, что проблема именно на функции open

То есть:

if(open(...)!=-1)printf("OK"); — исполняется нормально

`open(...);
printf("OK");` -- исполняется нормально

`open(...);
printf("OK");
//sbus_install code` — ошибка сегментирования на строчке open, в терминале не выводится ОК

Эксперимент воспроизводится даже если указать компилятору -g -O0
источник

АС

Александр Соломатин... in ru_raspberry
ты уверен что у тебя полноценный юарт а не урезанный?
источник

KD

Konstantin Dolgikh in ru_raspberry
1)Да, уверен
источник

KD

Konstantin Dolgikh in ru_raspberry
2)Я уверен, что проблема именно в момент компиляции. Компилятор каким-то образом оптимизирует код так, что он ведёт себя не как написано. Из-за этого я не могу под отладчиком увидеть, где происходит сегфолт
источник

A

Andrey Sea in ru_raspberry
выше ты кидал кусок кода, откуда функция эта взялась? что в ней?
источник

KD

Konstantin Dolgikh in ru_raspberry
Внутри функции sbus_install находится код, который вы можете прочитать по ссылке
источник

KD

Konstantin Dolgikh in ru_raspberry
источник

A

Andrey Sea in ru_raspberry
ага, если дебаггером пройти. где внутри неё падает?
источник

KD

Konstantin Dolgikh in ru_raspberry
Если ваш провайдер не позволяет открывать github, то вот листинг функции:
sbus_err_t sbus_install(int *fd, const char *path, int blocking, uint8_t timeout)
{
   *fd = open(path, O_RDWR | O_NOCTTY | (blocking ? 0 : O_NONBLOCK));
   if (*fd == -1)
   {
       return SBUS_ERR_OPEN;
   }

   struct termios2 options;
   if (ioctl(*fd, TCGETS2, &options) != 0)
   {
       return SBUS_ERR_TCGETS2;
   }

   options.c_cflag |= PARENB;
   options.c_cflag |= CSTOPB;
   options.c_cflag |= CS8;
   options.c_cflag &= ~CRTSCTS;
   options.c_cflag |= CREAD | CLOCAL;

   options.c_lflag &= ~ICANON;
   options.c_lflag &= ~ECHO;
   options.c_lflag &= ~ECHOE;
   options.c_lflag &= ~ECHONL;
   options.c_lflag &= ~ISIG;

   options.c_iflag &= ~(IXON | IXOFF | IXANY);
   options.c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL);

   options.c_oflag &= ~OPOST;
   options.c_oflag &= ~ONLCR;

   options.c_cc[VTIME] = timeout;
   options.c_cc[VMIN] = timeout == 0 ? SBUS_PACKET_SIZE : 0;

   options.c_cflag &= ~CBAUD;
   options.c_cflag |= BOTHER;
   options.c_ispeed = options.c_ospeed = SBUS_BAUD;

   if (ioctl(*fd, TCSETS2, &options) != 0)
   {
       return SBUS_ERR_TCSETS2;
   }

   return SBUS_OK;
}
источник

A

Andrey Sea in ru_raspberry
и нхрена её вообще использовать? )) там изи-функции все
источник

KD

Konstantin Dolgikh in ru_raspberry
В функцию open
источник