- 论坛徽章:
- 0
|
按实达终端编的
该例子密码小键盘接到终端的辅口2上,密码小键盘的通讯参数为:波特率为9600、停止位1位、数据位8位、不校验。在密码小键盘输入过程中,<Enter>;为确认键,<Clear>;为更正键,其余各键均为发送对应ASCII码。在SETUP中“辅口仿真”选项为本终端或实达终端。建议使用密码小键盘的同时锁定终端大键盘,命令如下:
ESC [ 2 h 键盘锁定(终端大键盘不接收输入)
ESC [ 2 l 键盘解锁(终端大键盘工作正常)
C语言程序例子如下:
#include<stdio.h>;
#include<termio.h>;
#include<fcntl.h>;
#include<time.h>;
/*送密码小键盘的数据*/
#define ERR 1
#define OK 2
#define RED ″\x81″ /*红灯亮,请再输入一次*/
#define GREEN ″\x82″ /*绿灯亮,您好请输入密码*/
#define DARK ″\x83″ /*密码小键盘二灯全灭*/
#define QUITKEY 0x7f
/*终端辅口命令*/
#define SELAUX2 ″\x1b!0;0;0;0Z″
/*选择辅口2:波特率为9600、停止位1位、数据位8位、不校验*/
#define INITAUX ″\x1b[/50h\x1b[/54h\x1b[53h″
/*打开辅口、辅口数据集中发送、辅口数据前后不加识别码*/
#define KEYLOCK ″\x1b[2h″ /*锁定终端大键盘*/
#define CLOSEAUX ″\x1b[/501\x1b[2l″ /*关闭辅口、解锁终端大键盘*/
#define AUXLEAD ″\x1b[/51h″ /*主机发送到终端的数据全部送给辅口*/
#define AUXEND ″\x1b[/51l″ /*结束主机往辅口送数据*/
static struct termio oterm,term;
static int term_fd;
main()
{
int i;
char ch,passwd_buf[20];
setterm(0); /*设置终端状态*/
selaux2(); /*初始化辅口2*/
sendaux(GREEN); /*密码键盘绿灯亮,发声:您好请输入密码*/
i=0;
while(1){
read(term_fd,&ch,1);
passwd_buf[i++]=ch;
if(ch==0x0a) /*确认键退出*/
break;
}
printf(″The input passward is %s\n″,passwd_buf);
sendaux(DARK); /*灭密码键盘红、绿灯*/
closeaux(); /*关闭辅口*/
resetterm(); /*恢复终端状态*/
return;
}
/*设置终端状态
参数:fstat
返回:-1,出错
*/
setterm(int fstat)
{
term_fd=open((char*)ttyname(1),0_RDWR|fstat);
if(term_fd<0)return-1;
if(ioct1(term_fd,TCGETA,&term)<0) return ERR;
oterm=term;
term.c_iflag&=~IXON;
term.c_1flag&=~ECHO;
term.c_1flag&=~ICANON;
term.c_cc[VMIN]=1;
term.c_cc[VTIME]=1;
term.c_cc[VQUIT]=QUITKEY;
if(ioct1(term_fd,TCSETA,&term)<0)return ERR;
return term_fd;
}
/*恢复终端状态
参数:term_fd:终端文件句柄
返回:ERR:出错
OK:正确
*/
resetterm()
{
if(term_fd<0) return-1;
if(ioct1(term_fd,TCSETA,&oterm)<0)return ERR;
close(term_fd);
return OK;
}
*/设置终端辅口2*/
selaux2()
{
write(term_fd,SELAUX2,strlen(SELAUX2));
write(term_fd,INITAUX,strlen(INITAUX));
write(term_fd,KEYLOCK,strlen(KEYLOCK));
return OK;
}
/*向辅口发送字符串*/
sendaux(s)
char*s;
{
write(term_fd,AUXLEAD,strlen(AUXLEAD));
write(term_fd,s,strlen(s));
write(term_fd,AUXEND,strlen(AUXEND));
}
/*关闭辅口*/
closeaux()
{
write(term_fd,CLOSEAUX,strlen(CLOSEAUX));
} |
|