📄 typeterm.c
字号:
#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<termios.h>#include<stdio.h>#include <stdlib.h>#include <string.h>#include <netdb.h>#include <netinet/in.h>#include <sys/socket.h>#include <errno.h>#include "weida_printer.h"#define FALSE -1#define TRUE 0#define SERVPORT 3490#define MAXDATASIZE 100 /*每次最大数据传输量 */#define SERV_HOST_ADDR "192.168.1.221" /***@brief 设置串口通信速率*@param fd 类型 int 打开串口的文件句柄*@param speed 类型 int 串口速度*@return void*/int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, };int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, };void set_speed(int fd, int speed){ int i; int status; struct termios Opt; tcgetattr(fd, &Opt); for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { if (speed == name_arr[i]) { tcflush(fd, TCIOFLUSH); cfsetispeed(&Opt, speed_arr[i]); cfsetospeed(&Opt, speed_arr[i]); status = tcsetattr(fd, TCSANOW, &Opt); if (status != 0) perror("tcsetattr fd1"); return; } tcflush(fd,TCIOFLUSH); }}/***@brief 设置串口数据位,停止位和效验位*@param fd 类型 int 打开的串口文件句柄**@param databits 类型 int 数据位 取值 为 7 或者8**@param stopbits 类型 int 停止位 取值为 1 或者2**@param parity 类型 int 效验类型 取值为N,E,O,,S*/int set_Parity(int fd,int databits,int stopbits,int parity){ struct termios options; if ( tcgetattr( fd,&options) != 0) { perror("SetupSerial 1"); return(FALSE); } options.c_cflag &= ~CSIZE; switch (databits) /*设置数据位数*/ { case 7: options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: fprintf(stderr,"Unsupported data size\n"); return (FALSE); } switch (parity) { case 'n': case 'N': options.c_cflag &= ~PARENB; /* Clear parity enable */ options.c_iflag &= ~INPCK; /* Enable parity checking */ break; case 'o': case 'O': options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/ options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'e': case 'E': options.c_cflag |= PARENB; /* Enable parity */ options.c_cflag &= ~PARODD; /* 转换为偶效验*/ options.c_iflag |= INPCK; /* Disnable parity checking */ break; case 'S': case 's': /*as no parity*/ options.c_cflag &= ~PARENB; options.c_cflag &= ~CSTOPB; break; default: fprintf(stderr,"Unsupported parity\n"); return (FALSE); } /* 设置停止位*/ switch (stopbits) { case 1: options.c_cflag &= ~CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: fprintf(stderr,"Unsupported stop bits\n"); return (FALSE); } /* Set input parity option */ if (parity != 'n') options.c_iflag |= INPCK; options.c_cc[VTIME] = 150; // 15 seconds options.c_cc[VMIN] = 0; tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */ if (tcsetattr(fd,TCSANOW,&options) != 0) { perror("SetupSerial 3"); return (FALSE); } return (TRUE); }/***@breif 打开串口*/int OpenDev(char *Dev){int fd = open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY if (-1 == fd) { /*设置数据位数*/ perror("Can't Open Serial Port"); return -1; } else return fd;}main(){ int fd; int nread; int weida_fd,ret,length; char sure,sure1,ch,ch1; char buff[512],buf1[256]; int sockfd, recvbytes; char buf[MAXDATASIZE]; char data[MAXDATASIZE]; struct hostent *host; struct sockaddr_in serv_addr; char *dev ="/dev/tts/1"; weida_fd = open("/dev/weida_printer", O_WRONLY); if (weida_fd < 0) { perror("open device buttons"); exit(1); } fd = OpenDev(dev); if (fd>0) set_speed(fd,9600); else { printf("Can't Open Serial Port!\n"); exit(0); } if (set_Parity(fd,8,1,'n')== FALSE) { printf("Set Parity Error\n"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket创建出错!"); exit(1); } serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVPORT); serv_addr.sin_addr.s_addr=inet_addr(SERV_HOST_ADDR); bzero(&(serv_addr.sin_zero),8); if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) { perror("connect出错!"); exit(1); }while(1){ int iread,count,times; iread=0; times=0; nread=0; memset(buf1,'\0',50); memset(buff,'\0',50); memset(buf,'\0',50); printf("Are you sure to search the data,please enter y or n:\n"); scanf("%c",&sure); scanf("%c",&sure1); if(sure=='y') { while((iread = read(fd,buff,100))>0) { printf("%s\n",buff); count=0; strcat(buf1,buff); if(buff[7]=='\0') { memset(buff,'\0',50); break; } } printf("%s\n",buf1); if(buf1[0]!='\0') { if(send(sockfd,buf1,MAXDATASIZE,0)==-1) { perror("send error!"); exit(1); } if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) { perror("received wrong!"); exit(1); } buf[recvbytes] = '\0'; printf("Received: %s\n",buf); ret = write(weida_fd, buf, strlen(buf)); if (ret != strlen(buf)) { perror("print worng\n"); } } } fflush(stdin);} close(weida_fd); close(fd); close(sockfd);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -