Чтение и запись с последовательного порта, через loopback в c в Linux - PullRequest
2 голосов
/ 05 октября 2011

Я нахожусь на программе для чтения и записи с и на последовательный порт, используя последовательный кроссбэк и шлейф, запоминая 2-й и 3-й контакт кабеля. Я умею писать, но не умею читать. в выводе на чтение это показывает 0 как нет. прочитанных им байтов. Ошибка не отображается как -1.

#include <stdio.h> // standard input / output functions
#include <string.h> // string function definitions
#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 definitionss
#include <time.h>   // time calls
#include <sys/ioctl.h>


int open_port(void)
  {
    int fd; // file description for the serial port

  fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);

  if(fd == -1) // if open is unsucessful
 {
 perror("open_port: Unable to open /dev/ttyS0 - ");
 }
else
{
fcntl(fd, F_SETFL, 0);
}
 printf("%d",fd);
return(fd);
 }
  int configure_port(int fd)      // configure the port
{
struct termios port_settings;      // structure to store the port settings in

cfsetispeed(&port_settings, B9600);    // set baud rates
cfsetospeed(&port_settings, B9600);
port_settings.c_cflag |= ( CLOCAL | CREAD );

port_settings.c_cflag &= ~PARENB;    // set no parity, stop bits, data bits
port_settings.c_cflag &= ~CSTOPB;
port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;
tcflush( fd, TCIOFLUSH );
tcsetattr(fd, TCSANOW, &port_settings);    // apply the settings to the port
return(fd);

  }
int main()
{
int fd= open_port();
int d=configure_port(fd);
printf("%d",d);
int bytes;

char mk[10];
scanf("%s",&mk);
int w=write(fd,mk,strlen(mk));

int y=ioctl(fd,FIONREAD,&bytes);

printf("%d\n",w);
perror("write");
printf("%d",y);
char buffer[80];
char *data;
int nbytes;

data=buffer;
nbytes=read(fd,data,5);
printf("the outputis \n%d\n\n",nbytes);
perror("read");
while(nbytes > 0)
{printf("datmukun %d\n\n",nbytes);
data+=nbytes;
if (data[-1]=='\n'||data[-1]=='\r')
break;
}
return 0;
}

Ответы [ 2 ]

0 голосов
/ 07 мая 2014

Вы должны подождать некоторое время, чтобы данные стали доступны.Вы можете сделать это следующим образом:

  • очень просто и просто для целей тестирования, создав небольшую задержку, используя цикл while и функцию sleep() внутри нее и, возможно, счетчик, чтобы попытаться получить числораз.
  • вы можете использовать функцию select() в дескрипторе файла, чтобы позволить вашему процессу ненадолго засыпать и получать уведомление, когда данные доступны или истекло время ожидания.
0 голосов
/ 20 августа 2012

В зависимости от вашего TTY-драйвера O_NDELAY и O_NONBLOCK могут заставить read вести себя неблокирующим образом. Поэтому весьма вероятно, что данные не были получены к тому времени, когда вы звоните read. Если вы удалите эти флаги, вы должны заблокировать read, пока не будет доступен хотя бы один символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...