⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typeterm.c

📁 基于arm的嵌入式扫描仪和打印机的驱动程序!
💻 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 + -