Как управлять последовательным выводом GPIO Raspberry Pi через веб-сервер Apache

Я хотел бы отправить данные из Raspberry Pi в Arduino Uno через последовательный порт GPIO с помощью сервера Apache, работающего на Raspberry Pi. Я подключил вывод TX RPI к переключателю уровня 3,3 В на 5 В, а его выход — к PIN RX Arduino.

Для отправки данных из Raspberry Pi в Arduino я использовал следующую программу на C, которую я перекомпилировал для Raspberry Pi, и она отлично работает. Я переименовал исполняемый код SendUART,

#include <stdio.h>
#include <unistd.h>   //Used for UART
#include <fcntl.h>    //Used for UART
#include <termios.h>  //Used for UART
#include <string.h>

main(int argc,char **argv)
{
//----- TX BYTES -----
unsigned char tx_buffer[20];
unsigned char *p_tx_buffer;
int lx;

//-------------------------
//----- SETUP USART 0 -----
//-------------------------
//At bootup, pins 8 and 10 are already set to UART0_TXD, UART0_RXD (ie the alt0 function) respectively
int uart0_filestream = -1;

//OPEN THE UART
//The flags (defined in fcntl.h):
//    Access modes (use 1 of these):
//        O_RDONLY - Open for reading only.
//        O_RDWR - Open for reading and writing.
//        O_WRONLY - Open for writing only.
//
//    O_NDELAY / O_NONBLOCK (same function) - Enables nonblocking mode. When set read requests on the file can return immediately with a failure status
//                                            if there is no input immediately available (instead of blocking). Likewise, write requests can also return
//                                            immediately with a failure status if the output can't be written immediately.
//
//    O_NOCTTY - When set and path identifies a terminal device, open() shall not cause the terminal device to become the controlling terminal for the process.
uart0_filestream = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY);        //Open in non blocking read/write mode
if (uart0_filestream == -1)
{
//ERROR - CAN'T OPEN SERIAL PORT
printf("Error - Unable to open UART.  Ensure it is not in use by another application\n");
}

//CONFIGURE THE UART
//The flags (defined in /usr/include/termios.h - see http://pubs.opengroup.org/onlinepubs/007908799/xsh/termios.h.html):
//    Baud rate:- B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000, B2500000, B3000000, B3500000, B4000000
//    CSIZE:- CS5, CS6, CS7, CS8
//    CLOCAL - Ignore modem status lines
//    CREAD - Enable receiver
//    IGNPAR = Ignore characters with parity errors
//    ICRNL - Map CR to NL on input (Use for ASCII comms where you want to auto correct end of line characters - don't use for bianry comms!)
//    PARENB - Parity enable
//    PARODD - Odd parity (else even)
struct termios options;
tcgetattr(uart0_filestream, &options);
options.c_cflag = B9600 | CS8 | CLOCAL | CREAD;  //<Set baud rate
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
tcflush(uart0_filestream, TCIFLUSH);
tcsetattr(uart0_filestream, TCSANOW, &options);
p_tx_buffer = &tx_buffer[0];
strcpy(tx_buffer, argv[1]);
lx=strlen(tx_buffer);if (uart0_filestream != -1)
{
int count = write(uart0_filestream, &tx_buffer[0], 10);  //Filestream, bytes to write, number of bytes to write
if (count < 0)
{
printf("UART TX error\n");
}
}
//----- CLOSE THE UART -----
close(uart0_filestream);
}

Затем я использовал скрипт PHP (test.php) для управления программным обеспечением с помощью команды «system»:

<?php
$mes = "0123456789";
$retval = 0;
$last_line = 0;
echo($mes);
$SndMsg = "/var/www/SendUART " . $mes;
$last_line = system($SndMsg, $retval);
echo $last_line
?>

И я выполнил это через командную строку:

php -f test.php

Строка правильно принята Arduino (я разработал простой эскиз для Arduino, который включает встроенный светодиод, если все символы получены от вывода Rx).

Затем я вызвал PHP-скрипт через веб-сервер Apache, написав в адресной строке:
http://192.168.1.103/test.php

где 192.168.1.103 — IP-адрес Raspberry Pi и test.php это скрипт PHP Конечно, оба test.php и программа SenUART хранятся в той же папке / var / www /, но в браузере отображается следующая ошибка:

0123456789Error — Невозможно открыть UART. Убедитесь, что оно не используется другим приложением

Как мне решить проблему?

1

Решение

Пользователь, запустивший ваш веб-сервер, вероятно, не имеет доступа к UART. Вы можете быстро проверить это, настроив Apache для запуска с правами root, установив следующее в httpd.conf:

User root

Так как запускать веб-сервер от имени root не очень хорошая идея, вам нужно выяснить, какой пользователь Apache обычно работает в вашей системе (возможно, www) и дайте этому пользователю разрешение на использование последовательного порта. Нечто подобное может работать:

chown :www /dev/ttyAMA0
chmod g+rw /dev/ttyAMA0

В качестве альтернативы, вам может просто понадобиться добавить пользователя www такой группе, как callout:

useradd -G callout www

Настройте для вашей конкретной системы.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]