Я еще пытаюсь правильней сделать - через select
Но пока не очень получается
Добавлено спустя 6 минут 9 секунд:А, всё, нашел свой косяк, первый параметр в select кривой передаю
Добавлено спустя 20 минут 47 секунд:esprit писал(а):http://dipcore.com/wp-content/uploads/2010/05/dir320_UART_pinout.jpg
А это проверенная распиновка? А то когда я на ней Rx и Tx замыкаю через 6.8кОм резистор - у меня роутер умирает и не возвращается в чувство, пока перемычку не уберу....
Добавлено спустя 1 минуту 9 секунд:Актуальный исходник программы suart.c для проброса сокета в уарт и обратно с использованием select:
- Код: Выделить всё • Развернуть
#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[1];
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, 100);
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, 1, 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;
}
Добавлено спустя 20 минут 56 секунд:Похоже проблема не в распиновке, только не знаю как подступиться, завтра будут осциллографом тыкать в контакты.
В общем при старте видимо нельзя замыкать RX/TX, потому как там консоль отладочная похоже, а при работе очень оно к статике чувствительно, перезагружает на раз-два видимо.