Android uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1105,0); uart_sendevent_键盘(dev_kb,0,0,0); } else if(输出_buf[i+2]==6){ printf(“==>Detect RIGHT\n”); uart_sendevent_键盘(dev_kb,1106,1); uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1106,0); uart_sendevent_键盘(dev_kb,0,0,0); } } } //记录时间 gettimeofday(&last_receive_time,NULL); //如果我们从uart获取命令,则将其发送到套接字 pthread_create(&send_thread,NULL,socket_send_handler,(void*)output_buf); } FD_CLR(ut.FD和readFds); 关闭_端口(); 返回0; } void*socket\u receive\u处理程序(){ 内特莱尼特,i; adr clnt中的结构sockaddr\u; 未签名字符socket_buf[bufsize],socket_buf_show[bufsize]; 我的地址中的结构sockaddr\u; pthread_t write_线程; 我的地址sin家庭=AFINET; 我的地址sin港口=htons(10000); my_addr.sin_addr.s_addr=htonl(INADDR_ANY); bzero(&(我的地址sin_zero),8); if((sockfd=socket(AF_INET,SOCK_DGRAM,0))=-1){ 佩罗(“插座”); 出口(1); } if(bind(sockfd,(struct sockaddr*)和my_addr,sizeof(struct sockaddr))=-1){ perror(“绑定错误”); 出口(1); } 而(1){ len_inet=日均房价的大小; memset(插座尺寸,0,尺寸); udp_receive=recvfrom(sockfd,//Socket socket\u buf,//接收缓冲区 插槽大小\u buf,//最大recv buf大小 0,//标志:无选项 (结构sockaddr*)&adr\u clnt,//Addr &len_inet);//添加len,输入和输出 如果(udp_接收
Android uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1105,0); uart_sendevent_键盘(dev_kb,0,0,0); } else if(输出_buf[i+2]==6){ printf(“==>Detect RIGHT\n”); uart_sendevent_键盘(dev_kb,1106,1); uart_sendevent_键盘(dev_kb,0,0,0); uart_sendevent_键盘(dev_kb,1106,0); uart_sendevent_键盘(dev_kb,0,0,0); } } } //记录时间 gettimeofday(&last_receive_time,NULL); //如果我们从uart获取命令,则将其发送到套接字 pthread_create(&send_thread,NULL,socket_send_handler,(void*)output_buf); } FD_CLR(ut.FD和readFds); 关闭_端口(); 返回0; } void*socket\u receive\u处理程序(){ 内特莱尼特,i; adr clnt中的结构sockaddr\u; 未签名字符socket_buf[bufsize],socket_buf_show[bufsize]; 我的地址中的结构sockaddr\u; pthread_t write_线程; 我的地址sin家庭=AFINET; 我的地址sin港口=htons(10000); my_addr.sin_addr.s_addr=htonl(INADDR_ANY); bzero(&(我的地址sin_zero),8); if((sockfd=socket(AF_INET,SOCK_DGRAM,0))=-1){ 佩罗(“插座”); 出口(1); } if(bind(sockfd,(struct sockaddr*)和my_addr,sizeof(struct sockaddr))=-1){ perror(“绑定错误”); 出口(1); } 而(1){ len_inet=日均房价的大小; memset(插座尺寸,0,尺寸); udp_receive=recvfrom(sockfd,//Socket socket\u buf,//接收缓冲区 插槽大小\u buf,//最大recv buf大小 0,//标志:无选项 (结构sockaddr*)&adr\u clnt,//Addr &len_inet);//添加len,输入和输出 如果(udp_接收,android,c,select,Android,C,Select,#include "ts_uart_common.h" int writeport(int *fd, unsigned char *chars,int len) { int lock_result = -1; /* Lock. */ do{ lock_result = pthread_mutex_lock(¶ms.mutex); }while(lock_result != 0); /* Work. */ i
#include "ts_uart_common.h"
int writeport(int *fd, unsigned char *chars,int len) {
int lock_result = -1;
/* Lock. */
do{
lock_result = pthread_mutex_lock(¶ms.mutex);
}while(lock_result != 0);
/* Work. */
int n = write(*fd, chars,len);
/* Unlock and signal completion. */
pthread_mutex_unlock(¶ms.mutex);
pthread_cond_signal (¶ms.done);
if (n < 0) {
fputs("write failed!\n", stderr);
return 0;
}
return n;
}
int readport(int *fd, unsigned char *result) {
int iIn=0;
iIn = read(*fd, result, bufsize);
tcflush(*fd, TCIFLUSH);
if (iIn < 0) {
if (errno == EAGAIN) {
//printf("SERIAL EAGAIN ERROR\n");
return 0;
} else {
//printf("SERIAL read error %d %s\n", errno, strerror(errno));
return 0;
}
}
return iIn;
}
int getbaud(int fd) {
struct termios termAttr;
int Speed = -1;
speed_t baudRate;
tcgetattr(fd, &termAttr);
/* Get the input speed. */
baudRate = cfgetispeed(&termAttr);
switch (baudRate) {
case B300: Speed = 300; break;
case B600: Speed = 600; break;
case B1200: Speed = 1200; break;
case B1800: Speed = 1800; break;
case B2400: Speed = 2400; break;
case B4800: Speed = 4800; break;
case B9600: Speed = 9600; break;
case B19200: Speed = 19200; break;
case B38400: Speed = 38400; break;
case B115200: Speed = 115200; break;
case B230400: Speed = 230400; break;
case B460800: Speed = 460800; break;
case B500000: Speed = 500000; break;
case B576000: Speed = 576000; break;
case B921600: Speed = 921600; break;
case B1000000:Speed = 1000000; break;
case B1152000:Speed = 1152000; break;
case B1500000:Speed = 1500000; break;
case B2000000:Speed = 2000000; break;
case B2500000:Speed = 2500000; break;
case B3000000:Speed = 3000000; break;
case B3500000:Speed = 3500000; break;
}
return Speed;
}
int initport(int fd,long baudrate,int flow_ctrl)
{
struct termios options;
memset(&options, 0 , sizeof(options));
if(ERROR == tcgetattr(fd, &options)) {
perror("tcgetattr: ");
return ERROR;
}
switch (baudrate) {
case 300: cfsetispeed(&options,B300);
cfsetospeed(&options,B300);
options.c_cflag |= B300 | CBAUD;
break;
case 600: cfsetispeed(&options,B600);
cfsetospeed(&options,B600);
options.c_cflag |= B600 | CBAUD;
break;
case 1200: cfsetispeed(&options,B1200);
cfsetospeed(&options,B1200);
options.c_cflag |= B1200 | CBAUD;
break;
case 1800: cfsetispeed(&options,B1800);
cfsetospeed(&options,B1800);
options.c_cflag |= B1800 | CBAUD;
break;
case 2400: cfsetispeed(&options,B2400);
cfsetospeed(&options,B2400);
options.c_cflag |= B2400 | CBAUD;
break;
case 4800: cfsetispeed(&options,B4800);
cfsetospeed(&options,B4800);
options.c_cflag |= B4800 | CBAUD;
break;
case 9600:
default: cfsetispeed(&options,B9600);
cfsetospeed(&options,B9600);
options.c_cflag |= B9600 | CBAUD;
break;
case 19200: cfsetispeed(&options,B19200);
cfsetospeed(&options,B19200);
options.c_cflag |= B19200 | CBAUD;
break;
case 38400: cfsetispeed(&options,B38400);
cfsetospeed(&options,B38400);
options.c_cflag |= B38400 | CBAUD;
break;
case 115200: cfsetispeed(&options,B115200);
cfsetospeed(&options,B115200);
options.c_cflag |= B115200 | CBAUDEX;
break;
case 230400: cfsetispeed(&options,B230400);
cfsetospeed(&options,B230400);
options.c_cflag |= B230400 | CBAUDEX;
break;
case 460800: cfsetispeed(&options,B460800);
cfsetospeed(&options,B460800);
options.c_cflag |= B460800 | CBAUDEX;
break;
case 500000: cfsetispeed(&options,B500000);
cfsetospeed(&options,B500000);
options.c_cflag |= B500000 | CBAUDEX;
break;
case 576000: cfsetispeed(&options,B576000);
cfsetospeed(&options,B576000);
options.c_cflag |= B576000 | CBAUDEX;
break;
case 921600: cfsetispeed(&options,B921600);
cfsetospeed(&options,B921600);
options.c_cflag |= B921600 | CBAUDEX;
break;
case 1000000: cfsetispeed(&options,B1000000);
cfsetospeed(&options,B1000000);
options.c_cflag |= B1000000 | CBAUDEX;
break;
case 1152000: cfsetispeed(&options,B1152000);
cfsetospeed(&options,B1152000);
options.c_cflag |= B1152000 | CBAUDEX;
break;
case 1500000: cfsetispeed(&options,B1500000);
cfsetospeed(&options,B1500000);
options.c_cflag |= B1500000 | CBAUDEX;
break;
case 2000000: cfsetispeed(&options,B2000000);
cfsetospeed(&options,B2000000);
options.c_cflag |= B2000000 | CBAUDEX;
break;
case 2500000: cfsetispeed(&options,B2500000);
cfsetospeed(&options,B2500000);
options.c_cflag |= B2500000 | CBAUDEX;
break;
case 3000000: cfsetispeed(&options,B3000000);
cfsetospeed(&options,B3000000);
options.c_cflag |= B3000000 | CBAUDEX;
break;
case 3500000: cfsetispeed(&options,B3500000);
cfsetospeed(&options,B3500000);
options.c_cflag |= B3500000 | CBAUDEX;
break;
}
/* Enable or Disable Hardware flow control. */
if(!flow_ctrl) {
options.c_cflag &= ~CRTSCTS;
//printf("Flow control disabled \n");
}
else {
options.c_cflag |= CRTSCTS;
//printf("Flow control enabled \n");
}
/* No Parity, 8N1. */
options.c_cflag &= ~PARENB; // No parity bit
options.c_cflag &= ~CSTOPB; // 1 stop bit
options.c_cflag &= ~CSIZE; // character size 8
options.c_cflag |= CS8 ;
/* Hardware Control Options - Set local mode and Enable receiver to receive characters */
options.c_cflag |= (CLOCAL | CREAD );
/* Terminal Control options */
/* - Disable signals. Disable canonical input processing. Disable echo. */
options.c_lflag &= ~(ICANON | IEXTEN | ECHO | ISIG); /* Line options - Raw input */
options.c_iflag &= ~(ICRNL | INPCK | ISTRIP | BRKINT | IXON | IXOFF | IXANY);
/* Output processing - Disable post processing of output. */
options.c_oflag &= ~OPOST; /* Output options - Raw output */
/* Control Characters - Min. no. of characters */
options.c_cc[VMIN] = 0;
/* Character/Packet timeouts. */
options.c_cc[VTIME] = 3;
if(ERROR == tcflush(fd,TCOFLUSH) ) {
//printf("tcflush failed");
return ERROR;
}
if(ERROR == tcsetattr(fd, TCSANOW, &options)) {
//printf("Error: Couldn't configure Serial port " );
return ERROR;
}
/*
//printf("\n\n");
system("stty -F /dev/ttyS0 -a");
//printf("\n\n");
*/
return SUCCESS;
}
void signalHandler()
{
//printf("\n Closing device %s\n",UART_DEV_NAME);
close_port();
}
void close_port()
{
/* Destroy all synchronization primitives. */
pthread_mutex_destroy (¶ms.mutex);
pthread_cond_destroy (¶ms.done);
tcsetattr(ut.fd, TCSANOW, &oldtio);
if(tx_rx == 'r')
close(fd2);
else
close(fd1);
close(ut.fd);
exit(1);
}
int uart_sendevent_keyboard(int dev_kb, int type, int code, int value) {
int i;
int fd;
int ret;
int version;
struct input_event event;
if (ioctl(dev_kb, EVIOCGVERSION, &version)) {
return 1;
}
memset(&event, 0, sizeof(event));
event.type = type;
event.code = code;
event.value = value;
ret = write(dev_kb, &event, sizeof(event));
if(ret < sizeof(event)) {
return -1;
}
return 0;
}
int timeval_subtract (struct timeval * result, struct timeval * x, struct timeval * y) {
/* Perform the carry for the later subtraction by updating y. */
if (x->tv_usec < y->tv_usec) {
int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
y->tv_usec -= 1000000 * nsec;
y->tv_sec += nsec;
}
if (x->tv_usec - y->tv_usec > 1000000) {
int nsec = (x->tv_usec - y->tv_usec) / 1000000;
y->tv_usec += 1000000 * nsec;
y->tv_sec -= nsec;
}
/* Compute the time remaining to wait.
tv_usec is certainly positive. */
result->tv_sec = x->tv_sec - y->tv_sec;
result->tv_usec = x->tv_usec - y->tv_usec;
/* Return 1 if result is negative. */
return x->tv_sec < y->tv_sec;
}
int read_ints (const char* file_name) {
int i = 50;
if( access( file_name, F_OK ) == 0 ) {
FILE* file = fopen (file_name, "r");
fscanf (file, "%d", &i);
while (!feof (file)) {
fscanf (file, "%d", &i);
}
fclose (file);
}
return i * 1000;
}
void write_ints (const char* file_name, int value) {
FILE* file = fopen (file_name, "w+");
fprintf(file, "%d", value);
fclose (file);
}
t\u uart\u common.c#include "ts_uart_common.h"
int writeport(int *fd, unsigned char *chars,int len) {
int lock_result = -1;
/* Lock. */
do{
lock_result = pthread_mutex_lock(¶ms.mutex);
}while(lock_result != 0);
/* Work. */
int n = write(*fd, chars,len);
/* Unlock and signal completion. */
pthread_mutex_unlock(¶ms.mutex);
pthread_cond_signal (¶ms.done);
if (n < 0) {
fputs("write failed!\n", stderr);
return 0;
}
return n;
}
int readport(int *fd, unsigned char *result) {
int iIn=0;
iIn = read(*fd, result, bufsize);
tcflush(*fd, TCIFLUSH);
if (iIn < 0) {
if (errno == EAGAIN) {
//printf("SERIAL EAGAIN ERROR\n");
return 0;
} else {
//printf("SERIAL read error %d %s\n", errno, strerror(errno));
return 0;
}
}
return iIn;
}
int getbaud(int fd) {
struct termios termAttr;
int Speed = -1;
speed_t baudRate;
tcgetattr(fd, &termAttr);
/* Get the input speed. */
baudRate = cfgetispeed(&termAttr);
switch (baudRate) {
case B300: Speed = 300; break;
case B600: Speed = 600; break;
case B1200: Speed = 1200; break;
case B1800: Speed = 1800; break;
case B2400: Speed = 2400; break;
case B4800: Speed = 4800; break;
case B9600: Speed = 9600; break;
case B19200: Speed = 19200; break;
case B38400: Speed = 38400; break;
case B115200: Speed = 115200; break;
case B230400: Speed = 230400; break;
case B460800: Speed = 460800; break;
case B500000: Speed = 500000; break;
case B576000: Speed = 576000; break;
case B921600: Speed = 921600; break;
case B1000000:Speed = 1000000; break;
case B1152000:Speed = 1152000; break;
case B1500000:Speed = 1500000; break;
case B2000000:Speed = 2000000; break;
case B2500000:Speed = 2500000; break;
case B3000000:Speed = 3000000; break;
case B3500000:Speed = 3500000; break;
}
return Speed;
}
int initport(int fd,long baudrate,int flow_ctrl)
{
struct termios options;
memset(&options, 0 , sizeof(options));
if(ERROR == tcgetattr(fd, &options)) {
perror("tcgetattr: ");
return ERROR;
}
switch (baudrate) {
case 300: cfsetispeed(&options,B300);
cfsetospeed(&options,B300);
options.c_cflag |= B300 | CBAUD;
break;
case 600: cfsetispeed(&options,B600);
cfsetospeed(&options,B600);
options.c_cflag |= B600 | CBAUD;
break;
case 1200: cfsetispeed(&options,B1200);
cfsetospeed(&options,B1200);
options.c_cflag |= B1200 | CBAUD;
break;
case 1800: cfsetispeed(&options,B1800);
cfsetospeed(&options,B1800);
options.c_cflag |= B1800 | CBAUD;
break;
case 2400: cfsetispeed(&options,B2400);
cfsetospeed(&options,B2400);
options.c_cflag |= B2400 | CBAUD;
break;
case 4800: cfsetispeed(&options,B4800);
cfsetospeed(&options,B4800);
options.c_cflag |= B4800 | CBAUD;
break;
case 9600:
default: cfsetispeed(&options,B9600);
cfsetospeed(&options,B9600);
options.c_cflag |= B9600 | CBAUD;
break;
case 19200: cfsetispeed(&options,B19200);
cfsetospeed(&options,B19200);
options.c_cflag |= B19200 | CBAUD;
break;
case 38400: cfsetispeed(&options,B38400);
cfsetospeed(&options,B38400);
options.c_cflag |= B38400 | CBAUD;
break;
case 115200: cfsetispeed(&options,B115200);
cfsetospeed(&options,B115200);
options.c_cflag |= B115200 | CBAUDEX;
break;
case 230400: cfsetispeed(&options,B230400);
cfsetospeed(&options,B230400);
options.c_cflag |= B230400 | CBAUDEX;
break;
case 460800: cfsetispeed(&options,B460800);
cfsetospeed(&options,B460800);
options.c_cflag |= B460800 | CBAUDEX;
break;
case 500000: cfsetispeed(&options,B500000);
cfsetospeed(&options,B500000);
options.c_cflag |= B500000 | CBAUDEX;
break;
case 576000: cfsetispeed(&options,B576000);
cfsetospeed(&options,B576000);
options.c_cflag |= B576000 | CBAUDEX;
break;
case 921600: cfsetispeed(&options,B921600);
cfsetospeed(&options,B921600);
options.c_cflag |= B921600 | CBAUDEX;
break;
case 1000000: cfsetispeed(&options,B1000000);
cfsetospeed(&options,B1000000);
options.c_cflag |= B1000000 | CBAUDEX;
break;
case 1152000: cfsetispeed(&options,B1152000);
cfsetospeed(&options,B1152000);
options.c_cflag |= B1152000 | CBAUDEX;
break;
case 1500000: cfsetispeed(&options,B1500000);
cfsetospeed(&options,B1500000);
options.c_cflag |= B1500000 | CBAUDEX;
break;
case 2000000: cfsetispeed(&options,B2000000);
cfsetospeed(&options,B2000000);
options.c_cflag |= B2000000 | CBAUDEX;
break;
case 2500000: cfsetispeed(&options,B2500000);
cfsetospeed(&options,B2500000);
options.c_cflag |= B2500000 | CBAUDEX;
break;
case 3000000: cfsetispeed(&options,B3000000);
cfsetospeed(&options,B3000000);
options.c_cflag |= B3000000 | CBAUDEX;
break;
case 3500000: cfsetispeed(&options,B3500000);
cfsetospeed(&options,B3500000);
options.c_cflag |= B3500000 | CBAUDEX;
break;
}
/* Enable or Disable Hardware flow control. */
if(!flow_ctrl) {
options.c_cflag &= ~CRTSCTS;
//printf("Flow control disabled \n");
}
else {
options.c_cflag |= CRTSCTS;
//printf("Flow control enabled \n");
}
/* No Parity, 8N1. */
options.c_cflag &= ~PARENB; // No parity bit
options.c_cflag &= ~CSTOPB; // 1 stop bit
options.c_cflag &= ~CSIZE; // character size 8
options.c_cflag |= CS8 ;
/* Hardware Control Options - Set local mode and Enable receiver to receive characters */
options.c_cflag |= (CLOCAL | CREAD );
/* Terminal Control options */
/* - Disable signals. Disable canonical input processing. Disable echo. */
options.c_lflag &= ~(ICANON | IEXTEN | ECHO | ISIG); /* Line options - Raw input */
options.c_iflag &= ~(ICRNL | INPCK | ISTRIP | BRKINT | IXON | IXOFF | IXANY);
/* Output processing - Disable post processing of output. */
options.c_oflag &= ~OPOST; /* Output options - Raw output */
/* Control Characters - Min. no. of characters */
options.c_cc[VMIN] = 0;
/* Character/Packet timeouts. */
options.c_cc[VTIME] = 3;
if(ERROR == tcflush(fd,TCOFLUSH) ) {
//printf("tcflush failed");
return ERROR;
}
if(ERROR == tcsetattr(fd, TCSANOW, &options)) {
//printf("Error: Couldn't configure Serial port " );
return ERROR;
}
/*
//printf("\n\n");
system("stty -F /dev/ttyS0 -a");
//printf("\n\n");
*/
return SUCCESS;
}
void signalHandler()
{
//printf("\n Closing device %s\n",UART_DEV_NAME);
close_port();
}
void close_port()
{
/* Destroy all synchronization primitives. */
pthread_mutex_destroy (¶ms.mutex);
pthread_cond_destroy (¶ms.done);
tcsetattr(ut.fd, TCSANOW, &oldtio);
if(tx_rx == 'r')
close(fd2);
else
close(fd1);
close(ut.fd);
exit(1);
}
int uart_sendevent_keyboard(int dev_kb, int type, int code, int value) {
int i;
int fd;
int ret;
int version;
struct input_event event;
if (ioctl(dev_kb, EVIOCGVERSION, &version)) {
return 1;
}
memset(&event, 0, sizeof(event));
event.type = type;
event.code = code;
event.value = value;
ret = write(dev_kb, &event, sizeof(event));
if(ret < sizeof(event)) {
return -1;
}
return 0;
}
int timeval_subtract (struct timeval * result, struct timeval * x, struct timeval * y) {
/* Perform the carry for the later subtraction by updating y. */
if (x->tv_usec < y->tv_usec) {
int nsec = (y->tv_usec - x->tv_usec) / 1000000 + 1;
y->tv_usec -= 1000000 * nsec;
y->tv_sec += nsec;
}
if (x->tv_usec - y->tv_usec > 1000000) {
int nsec = (x->tv_usec - y->tv_usec) / 1000000;
y->tv_usec += 1000000 * nsec;
y->tv_sec -= nsec;
}
/* Compute the time remaining to wait.
tv_usec is certainly positive. */
result->tv_sec = x->tv_sec - y->tv_sec;
result->tv_usec = x->tv_usec - y->tv_usec;
/* Return 1 if result is negative. */
return x->tv_sec < y->tv_sec;
}
int read_ints (const char* file_name) {
int i = 50;
if( access( file_name, F_OK ) == 0 ) {
FILE* file = fopen (file_name, "r");
fscanf (file, "%d", &i);
while (!feof (file)) {
fscanf (file, "%d", &i);
}
fclose (file);
}
return i * 1000;
}
void write_ints (const char* file_name, int value) {
FILE* file = fopen (file_name, "w+");
fprintf(file, "%d", value);
fclose (file);
}
#包括“ts_uart_common.h”
int writeport(int*fd,无符号字符*chars,int len){
int lock_result=-1;
/*锁*/
做{
lock_result=pthread_mutex_lock(¶ms.mutex);
}while(lock_result!=0);
/*工作*/
int n=写入(*fd,chars,len);
/*解锁和信号完成*/
pthread_mutex_unlock(¶ms.mutex);
pthread_cond_信号(¶ms.done);
if(n<0){
fputs(“写入失败!\n”,stderr);
返回0;
}
返回n;
}
int readport(int*fd,无符号字符*结果){
int-iIn=0;
iIn=读取(*fd,结果,bufsize);
tcflush(*fd,TCIFLUSH);
如果(iIn<0){
if(errno==EAGAIN){
//printf(“串行EAGAIN错误\n”);
返回0;
}否则{
//printf(“串行读取错误%d%s\n”,errno,strerror(errno));
返回0;
}
}
返回iIn;
}
int getbaud(int fd){
结构termios termAttr;
整数速度=-1;
速率;
tcgetattr(fd和termAttr);
/*获取输入速度*/
波特率=cfgetispeed(&termAttr);
交换机(波特率){
案例B300:速度=300;中断;
案例B600:速度=600;中断;
案例B1200:速度=1200;中断;
案例B1800:速度=1800;中断;
案例B2400:速度=2400;中断;
案例B4800:速度=4800;中断;
案例B9600:速度=9600;中断;
案例B19200:速度=19200;中断;
案例B38400:速度=38400;中断;
案例B115200:速度=115200;中断;
案例B230400:速度=230400;中断;
案例B460800:速度=460800;中断;
案例B500000:速度=500000;中断;
案例B576000:速度=576000;断裂;
案例B921600:速度=921600;中断;
案例B1000000:速度=1000000;中断;
案例B1152000:速度=1152000;中断;
案例B1500000:速度=1500000;中断;
案例B2000000:速度=2000000;中断;
案例B2500000:速度=2500000;中断;
案例B3000000:速度=3000000;中断;
案例B3500000:速度=3500000;中断;
}
返回速度;
}
int initport(int fd、长波特率、int flow\u ctrl)
{
结构termios选项;
memset(&options,0,sizeof(options));
如果(错误==tcgetattr(fd和选项)){
佩罗尔(“tcgetattr:”);
返回错误
while (1) {
FD_ZERO(&readFds);
FD_SET(ut.fd, &readFds);
respTime.tv_sec = 0;
respTime.tv_usec = timeout;
retval = select(FD_SETSIZE, &readFds, NULL, NULL, &respTime);
if (retval == 0) {
//determine send heartbeat signal or not
struct timeval now_time, result;
gettimeofday(&now_time, NULL);
timeval_subtract(&result, &now_time, &last_send_time);
if(result.tv_sec > 5) {
int r = pthread_create( &watchdog_thread , NULL , send_watchdog , (void*) NULL);
gettimeofday(&last_send_time, NULL);
}
continue;
}
else if (retval == ERROR) {
printf("select: error :: %d\n", retval);
}
usleep(10 * 10000);
...
...
...
}