Хорошая новость и плохая
Хорошая - уже в сторону контроллера OR-AVR-M128-DS пробросился UART, т.е. сервами уже рулю, отправляя с ПК в сокет роутера команду, а моя софтина на роутере пересылает её на UART и контроллер выполняет.
Плохая - с контроллера какая-то фигня приходит вместо инфы
т.е. какие-то заморочки с обратной связью, хотя с перемычкой всё окей было.
Добавлено спустя 15 минут 10 секунд:При этом команда возвращающая 1 символ проходит на ура, Q возвращает . или + в зависимости от того - завершилась ли предыдущая команда.
Добавлено спустя 40 минут 55 секунд:Полная победа над созданием своего приложения. В настройках порта исходников espirit'а стояло использование бита четности
убрал и всё заработало на 100%
Актуальная версия:
- Код: Выделить всё • Развернуть
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
int main(int argc, char *argv[])
{
int sock_fd, listener;
struct sockaddr_in addr;
char buf[100];
int bytes_read;
listener = socket(AF_INET, SOCK_STREAM, 0);
if(listener < 0)
{
perror("Can't create socket");
return -1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(3000);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("Can't bind port");
close(sock_fd);
return -1;
}
listen(listener, 1);
// printf("Listening port :%s\n",prt);
int tty_fd; /* File descriptor for the port */
int n;
struct termios options;
tty_fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK);
if (tty_fd == -1) perror("open_port: Unable to open /dev/ttyS0 - ");
else
{
fcntl(tty_fd, F_SETFL, 0);
tcgetattr(tty_fd, &options);
cfmakeraw(&options);
/************************************************************************/
// c_cflag
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag |= CREAD; // Enable Receiver
options.c_cflag |= CLOCAL; // Ignore modem control lines.
cfsetispeed(&options, B115200);
cfsetospeed(&options, B115200);
tcsetattr(tty_fd, TCSAFLUSH, &options);
tcflush(tty_fd, TCIOFLUSH); /**/
}
while(1)
{
sock_fd = accept(listener, NULL, NULL);
if(sock_fd < 0)
{
perror("Can't bind port");
close(sock_fd);
return -1;
}
printf("Connect accepted\n");
while(1)
{
fd_set rfds;
struct timeval tv;
int retval;
int nfds=tty_fd+1;
if(sock_fd>tty_fd) nfds=sock_fd+1;
FD_ZERO(&rfds);
FD_SET(tty_fd, &rfds);
FD_SET(sock_fd, &rfds);
tv.tv_sec = 10;
tv.tv_usec = 0;
retval = select(nfds, &rfds, NULL, NULL, &tv);
/* Не полагаемся на значение tv! */
if (retval)
{
printf("Some data available.\n");
if (FD_ISSET(tty_fd, &rfds))
{
bytes_read = read(tty_fd, buf, 50);
send(sock_fd, buf, bytes_read, 0);
buf[bytes_read]=0;
printf("=>Socket: %s\n",buf);
};
if (FD_ISSET(sock_fd, &rfds))
{
bytes_read = recv(sock_fd, buf, 50, 0);
if(bytes_read <= 0) break;
write(tty_fd, buf, bytes_read);
buf[bytes_read]=0;
printf("Socket=>: %s\n",buf);
};
}
else
printf("No data in 10 seconds.\n");
}
close(sock_fd);
}
return 0;
}
Добавлено спустя 41 секунду:Осталось поместить эту программу во флеш роутера, поставить в автозагрузку и собрать из этого готовую прошивку
Добавлено спустя 2 часа 2 минуты 30 секунд:Трындец подкрался незаметно
То ли в линухе тоже есть динамические библиотеки, то ли что-то еще, но в общем "suart" свой я скопировал во флеш роутера в /usr/local, но он, зараза, не запускается, пока я не подмонтирую флешку
При этом если флешка подмонтирована в /opt, то запускается из каталога /usr/local без вопросов, а если нет - пишет:
-sh: ./suart: not found
Пробовал запускать явно с путём - та же ерунда, если подмонтирована флешка - запускается, иначе пишет:
-sh: /usr/local/suart: not found
Кто нибудь в курсе как это лечится?