📄 key.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 + -