ShellAlbert / 3-axies-robot-arm

Apache License 2.0
1 stars 1 forks source link

select/poll/epoll on serial port #41

Open ShellAlbert opened 3 years ago

ShellAlbert commented 3 years ago

Naive version The naive serial port communication version Open the device, set the baud rate, and set parity `

include /标准输入输出定义/

include

include /标准函数库定义/

include /Unix标准函数定义/

include <sys/types.h> /**/

include <sys/stat.h> /**/

include /文件控制定义/

include /PPSIX终端控制定义/

include /错误号定义/

define FALSE 0

define TRUE 1

void set_speed(int fd) { struct termios Opt; tcgetattr(fd, &Opt); cfsetispeed(&Opt,B115200); cfsetospeed(&Opt,B115200); tcsetattr(fd,TCSANOW,&Opt); return; }

void set_Parity(int fd) { struct termios options; tcgetattr(fd, &options); options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /Input/ options.c_oflag &= ~OPOST; /Output/ tcsetattr(fd,TCSANOW,&options); return; }

int OpenSerial(char Dev) { int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY if (-1 == fd) { /设置数据位数*/ perror("Can't Open Serial Port"); return -1; } else { set_speed(fd); set_Parity(fd); return fd; }

}

int main(){ int fd; ssize_t length; char buff[512]; char *dev ="/dev/ttyAMA0"; fd = OpenSerial(dev); for(;;){ length = read(fd,buff,sizeof(buff)); if(length > 0) { buff[length] = 0; printf("plain:%s\n",buff); } } close(fd); exit(0); } `

ShellAlbert commented 3 years ago

Select version `

include <sys/time.h>

include <sys/types.h>

include "serial/serial.h"

int main() { int fd; fd_set rfds; struct timeval tv; char buff[512]; ssize_t length; fd = OpenSerial("/dev/ttyAMA0");

for(;;) {
    FD_ZERO(&rfds);
    FD_SET(fd, &rfds);

    //timeout = 5s
    tv.tv_sec = 5;
    tv.tv_usec = 0;
    //Wait for 5 seconds, then go
    int n;
    n = select(fd + 1, &rfds, NULL, NULL, &tv);
    //choose the target from set
    if(n > 0) {
        if (FD_ISSET(fd, &rfds)) {
            length = read(fd, &buff, sizeof(buff));
            buff[length] = 0;
            printf("select:%s\n", buff);
        }
    } else {
        printf("No data within 5 seconds.\n");
    }
}
return 0;

}

`

ShellAlbert commented 3 years ago

Poll version `

include <sys/poll.h>

include "serial/serial.h"

int main(void) { struct pollfd fds[1]; ssize_t length; char buff[512]; fds[0].fd = OpenSerial("/dev/ttyAMA0"); fds[0].events = POLLIN ; for(;;) { int n; n = poll( fds, 1, 5000); //got data, and look up which fd has data, but we just have 1 if(n > 0) { //if( fds[0].revents & POLLIN ) { length = read(fds[0].fd, buff, sizeof(buff) ); buff[length] = 0; printf("poll:%s\n",buff);

    } else {
        printf("No data within 5 seconds.\n");
    }
}

} `

ShellAlbert commented 3 years ago

Epoll version `

include <sys/epoll.h>

include "serial/serial.h"

define MAXEVENTS 64

int main(void){ int fd; int efd; struct epoll_event event; struct epoll_event *events; int length; char buff[512]; fd = OpenSerial("/dev/ttyAMA0"); efd = epoll_create1 (0);//initial is 0

event.data.fd = fd;
event.events = EPOLLIN | EPOLLET;

epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event);
/* Buffer where events are returned */
events = calloc (MAXEVENTS, sizeof event);

/* The event loop */
for(;;) {
    int n;
    n = epoll_wait (efd, events, MAXEVENTS, 5000);
    if(n > 0) {
        length = read(events[0].data.fd, buff, sizeof(buff));

        if(length > 0) {
            buff[length] = 0;
            printf("epoll:%s\n", buff);
        }
    } else {
        printf("No data whthin 5 seconds.\n");
    }
}
free (events);
close (fd);
return 0;

} `

ShellAlbert commented 3 years ago

Image 25