首先用 cat /proc/bus/input/devices 确定读卡器设备在系统里的注册信息
cat /proc/bus/input/devices |
I: Bus=0019 Vendor=0001 Product=0001 Version=0100 I: Bus=0019 Vendor=0001 Product=0001 Version=0001 I: Bus=0013 Vendor=dead Product=beef Version=0101 I: Bus=0003 Vendor=08ff Product=0009 Version=0110 |
系统input_event事件定义
struct input_event {
struct timeval time; //事件触发的时间
__u16 type; //事件类型
__u16 code; //代码,如果是键盘则是按键代码
__s32 value; //如果是键盘则value = KeyDown 或者 KeyUP
};
(1)详细的type定义
#define EV_SYN 0x00 #define EV_KEY 0x01 //按键 #define EV_REL 0x02 //相对坐标(轨迹球) #define EV_ABS 0x03 //绝对坐标 #define EV_MSC 0x04 //其他 #define EV_SW 0x05 #define EV_LED 0x11 //LED #define EV_SND 0x12//声音 #define EV_REP 0x14//repeat #define EV_FF 0x15 #define EV_PWR 0x16 #define EV_FF_STATUS 0x17 #define EV_MAX 0x1f #define EV_CNT (EV_MAX+1) |
(2)value定义
当按键按下时值为1,松开时值为0
用 ls /dev/input 查看
完整的测试代码如下:
#include <unistd.h> int main(int argc, char *argv[]) { } |
运行的结果如下:
以上程序在:
飞凌OK6410开发板上运行通过。
IC卡读卡器为:USB Reader With Keyboard (淘宝上买的56元钱,不知道是什么品牌的)
PC 开发环境为:
Ubuntu 11.10 + Eclipse + JRE7 + arm-linux-gcc 4.3.3
代码原理:
USB Reader虽然是USB接口,但是大多数是模拟键盘输入的。
因此,可以通过 open("/dev/tty0".....) 这个系统函数打开设备。
那么就可以像读取文件一样读取IC卡的ID。
要点注意:
由于开发板上Linux驱动的不同,因此键盘可能会产生多个字节的扫描码(最多可能有6个)。因此程序要进行过滤。
例如:过滤【键盘码】>128的值。
在Linux下,键盘码值(1~127),释放键(KeyUP)的值为【键值】+128
即: 键盘码= 10,则释放键=10+128
如果仅仅是转换 0~9这几个值,可以采用下面的算法
int key = '0' + 【键盘码值】 - 1;
//Reader.h
#ifndef READER_H
#define READER_H
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int OpenReader(char* dev)
{
int Reader_Fd=-1;
Reader_Fd = open(dev, O_RDWR);
return Reader_Fd;
}
void CloseReader(int fd)
{
close(fd);
}
int ReadId(int fd,char *id_buf,int len)
{
unsigned char key[5];
unsigned char K;
int i=0;
do
{
K=0;
if(read(fd,key,4)>0)
{
if(key[0]<128)
{
id_buf[i++]='0'+key[0]-1;
K=key[0];
}
}
if(i>len)i==0;
}while(K!=28);
id_buf[i-1]='\0';
return 1;
}
#endif // READER_H
//主程序
#include"reader.h"
int main(int argc, char *argv[])
{
int reader_fd;
char buf[32];
if((reader_fd=OpenReader("/dev/tty0"))==-1)
{
puts("Open Dev Error!\r\n");
}
while(1)
{
if(ReadId(reader_fd,buf,32)==1)
{
printf("Read ID=%s\r\n",buf);
}
}
CloseReader(reader_fd);
return 0;
}
程序运行效果: