Open ShellAlbert opened 3 years ago
Select version `
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;
}
`
Poll version `
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");
}
}
} `
Epoll version `
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;
} `
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); } `