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

📄 key.c

📁 linux/unix下的密码小键盘功能源码(C语言)
💻 C
字号:
/***************************************************************************
Last modified: 2001-09-06 Saiwen Yu
Modified: 1、为了适应可发声的小键盘,增加了每次关掉串口都断开。
		  2、为了能使用COIN的串口卡,将小键盘的打开参数变成无奇偶校验(原来
		  程序不是奇校验就是偶校验,没有无校验)
****************************************************************************/
#include <fcntl.h>
#include <sys/types.h>
#include <time.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/times.h>
#include <sys/select.h>
#include <string.h>
#include <termios.h>

void CalcBCC(int num,char *sinit);
int  checkinput(unsigned char *input,char *buf1,char *buf2,char *buf3,int total);

void k_setrts(fd)
int fd;
{
 struct termios tty;
 tcgetattr(fd,&tty);
 tty.c_cflag &= ~(CTSFLOW | RTSFLOW | ORTSFL);
 tty.c_cflag |=(ORTSFL | RTSFLOW);
 tcsetattr(fd,TCSANOW,&tty);
}


void k_flush(fd)
int fd;
{
  ioctl(fd, TCFLSH, 2);
}

int k_readchk(int fd) {
  fd_set read;
   struct timeval m_timeout;
   m_timeout.tv_sec=0;
   m_timeout.tv_usec=0;
	FD_ZERO(&read);
	FD_SET(fd,&read);
	switch(select(fd+1,&read,NULL,NULL,&m_timeout)){
		case -1:
			 return -1;
		case 1:
			if(FD_ISSET(fd,&read)) return 1;
			return 0;
	
	}
	return 0;
}

/*
 * Set baudrate, parity and number of bits.
 */
void k_setparms(fd, baudr, par, bits, stop)
int fd;
char *baudr;
char *par;
char *bits;
char *stop;
{
  int spd = -1;
  int newbaud;
  int bit = bits[0];

  struct termios tty;
  tcgetattr(fd, &tty);
  if (bit == '7' && (par[0] == 'M' || par[0] == 'S'))
	bit = '8';
  if ((newbaud = (atol(baudr) / 100)) == 0 && baudr[0] != '0') newbaud = -1;
  switch(newbaud) {
  	case 0:
			spd = B0;	break;
  	case 3:		spd = B300;	break;
  	case 6:		spd = B600;	break;
  	case 12:	spd = B1200;	break;
  	case 24:	spd = B2400;	break;
  	case 48:	spd = B4800;	break;
  	case 96:	spd = B9600;	break;
  	case 192:	spd = B19200;	break;
  	case 384:	spd = B38400;	break;
  }
  tty.c_cflag=0;
  if (spd != -1) {
	cfsetospeed(&tty, (speed_t)spd);
	cfsetispeed(&tty, (speed_t)spd);
  }
  switch (bit) {
  	case '5':
  		tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS5;
  		break;
  	case '6':
  		tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS6;
  		break;
  	case '7':
  		tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS7;
  		break;
  	case '8':
	default:
  		tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
  		break;
  }		
  tty.c_iflag = 0 ;
  tty.c_lflag = 0;
  tty.c_oflag = 0;
  tty.c_cflag |= CLOCAL | CREAD | CTSFLOW | RTSFLOW | ORTSFL;
  tty.c_cc[VMIN] = 1;
  tty.c_cc[VTIME] =0 ;
  tty.c_cflag &= ~(PARENB | PARODD | CSTOPB);
  if(atoi(stop)==2)
	tty.c_cflag |=CSTOPB;
  if (par[0] == 'O')
  {
  	tty.c_cflag |=PARENB;
	tty.c_cflag |= PARODD;
  }
  else if(par[0] == 'E')
  	tty.c_cflag |=PARENB;
  else
  	tty.c_cflag &= ~PARENB;
  tty.c_cflag |= HUPCL;
  tcsetattr(fd, TCSANOW, &tty);
//  tcsetattr(fd, TCSETA, &tty);
}

int open_key(acu)
char *acu;
{
 int portfd;
  if ((portfd = open(acu, O_RDWR | O_NDELAY)) < 0) {
		exit(0);
    }
  if (portfd < 0)  return(-1);
  k_flush(portfd);
  k_setparms(portfd, "1200", "N", "8", "1");
  return (portfd);
}

unsigned char read_key(int portfd,int rtime)
{   
unsigned char key;

char key_code[18]={0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
                   0x74}; 

char key_ret[18]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x1b,0x2f,0x2a,0x2d,0x2b,0x2e,0x30, 
		   0x0d};
char code; 
int i,n;
time_t start,end;
time(&start);
for(;;) {
	n=k_readchk(portfd);
	  if(n>0) 
		{
		 read(portfd,&code,20);
		 if(code<0x60 | code==0x79)  continue;
   		 else 
			{		
			i=0;
  	   	 	while(i<17 && (code!=key_code[i])) i++ ;
		       	if(i>=17) return -1; 
     			return (key_ret[i]);
    			}
		}
	 if(n==-1) return -1;
	 end=time((time_t *)NULL);
	 if(difftime(end,start)>(double)rtime) return 0;
	usleep(100);
    }
}

void close_key(int fd)
{
 k_flush(fd);
 close(fd);
}



/*
main()
{
int hd,i;
unsigned char key;
if((hd=open_key("/dev/tty1a"))==NULL)
	{
	printf("open tty1a failure\n");
	exit(-1);
	}
for(i=0;i<50;i++)
{
if((key=read_key(hd,10))<0)
	{
	printf("read key failure\n");
	break;
	}
printf("enter key=%c\n",key);
}
printf("read over\n");
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -