?? serialfunc.c
字號:
#include "serialfunc.h"#include <gtk/gtk.h>#include <signal.h>#include <stdio.h>#include <termios.h>#include <fcntl.h>#include <sys/types.h>#include <unistd.h>#include <string.h>static speed_t baud_rate = B115200;static gint bit_size = 8;static gint checkmod = 0; // 0:none ; 1:odd ; 2:evenstatic struct termios term,termsave;static FILE* fp = NULL; //file pointer for serial portstatic gchar* port = NULL;void tty_set_port(const gchar* portname){ if (portname == NULL) { g_warning("portname can not be NULL"); return; } if (port != NULL) free(port); port = strdup(portname);}void tty_set_baud_rate(speed_t speed){ baud_rate = speed;}void tty_set_bit_size(gint size){ bit_size = size;}void tty_set_checkmod(gint mod){ checkmod = mod;}FILE* tty_get_fp(){ return fp;}gint tty_serial_open(){ gint fd; gint accessmod; if ((fp = fopen(port,"rb+")) == NULL) { g_warning("error open %s\n",port); return -1; } setbuf(fp,NULL); fd = fileno(fp); accessmod = fcntl(fd,F_GETFL,0); if ( tcgetattr(fd,&termsave)<0 ) { g_print("error in tcgetattr %s\n",port); fclose(fp); return -1; } if ( fcntl(fd,F_SETFL,accessmod|O_NONBLOCK) == -1) { g_warning("change access mod to nonblock failed\n"); fclose(fp); return -1; } term = termsave; //g_print("inlcr = %d\n",term.c_iflag & INLCR); //g_print("icrnl = %d\n",term.c_iflag & ICRNL); //g_print("Echonl = %d\n",term.c_lflag & ECHONL); //g_print("echo = %d\n",term.c_iflag & ECHO); // disable nl=>cr translate // disable cr=>nl translate // no SIGINT on BREAK, output flow control off term.c_iflag &= ~(INLCR|ICRNL|BRKINT|IXON); // disable nl echo // disable echo // extended ipnut processing off, signal chars off // canonical mode off i.e. terminal not in line buffer mode term.c_lflag &= ~(ECHONL|ECHO|IEXTEN|ISIG|ICANON); // output processing off term.c_oflag &= ~(OPOST); term.c_cc[VMIN] = TTY_MIN_READ_SIZE; term.c_cc[VTIME] = TTY_RETURN_TIME; //-------------- set serial port's baud_rate ---------------- if ( cfsetospeed(&term,baud_rate)<0 ) { g_warning("set serial output baud rate error\n"); fclose(fp); return -1; } if ( cfsetispeed(&term,baud_rate)<0 ) { g_warning("set serial input baud rate error\n"); fclose(fp); return -1; } //------------- set serial port's bits per byte --------------- switch(bit_size) { case 5: term.c_cflag &= ~(CSIZE); term.c_cflag |= CS5; break; case 6: term.c_cflag &= ~(CSIZE); term.c_cflag |= CS6; break; case 7: term.c_cflag &= ~(CSIZE); term.c_cflag |= CS7; break; case 8: term.c_cflag &= ~(CSIZE); term.c_cflag |= CS8; break; default: g_warning("set bit_size failed\n"); fclose(fp); return -1; } //-------- set serial port's odd\even check mode ------------- switch(checkmod) { case 0: term.c_cflag &= ~(PARENB); break; case 1: term.c_cflag |= PARENB; term.c_cflag |= PARODD; break; case 2: term.c_cflag |= PARENB; term.c_cflag |= ~(PARODD); break; default: g_warning("set checkmod failed\n"); fclose(fp); return -1; } //------- only now really set the serial port's parameters ------------ if ( tcsetattr(fd,TCSANOW,&term)<0 ) { g_warning("error tcsetattr %s\n",port); fclose(fp); return -1; } return 0;}void tty_serial_close(){ if (fp == NULL) return; // restore the terminal's mode if ( tcsetattr(fileno(fp),TCSANOW,&termsave)<0 ) { g_warning("error tcsetattr"); } if (tcflush(fileno(fp),TCIOFLUSH) == -1) g_warning("tcflush error\n"); fclose(fp); fp = NULL;}gint tty_read_data(gint event_fd,gchar* buffer,gint size){ gint readsize; if( event_fd == fileno(fp) ) { readsize = read(fileno(fp),buffer,size-1); if (readsize == -1) { g_warning("read data from serial error"); buffer[0] = '\0'; } else { buffer[readsize] = '\0'; } } else { g_warning("should not come here\n"); buffer[0] = '\0'; } return readsize;}int tty_write_data(const gchar* text){ int count; int i; size_t length; if ( fp == NULL ) return EOF; count = 0; length = strlen(text); for (i=0;i<length;i++) { if( fputc(text[i],fp) != EOF) { count++; } } return count;// fputs("\r\n",fp);}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -