usb读卡器

首先用  cat /proc/bus/input/devices 确定读卡器设备在系统里的注册信息

cat /proc/bus/input/devices

I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="gpio-keys"
P: Phys=gpio-keys/input0
S: Sysfs=/devices/platform/gpio-keys/input/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=3
B: KEY=1680 0 0 10000002

I: Bus=0019 Vendor=0001 Product=0001 Version=0001
N: Name="s3c-keypad"
P: Phys=s3c-keypad/input0
S: Sysfs=/devices/virtual/input/input1
U: Uniq=
H: Handlers=kbd event1
B: PROP=0
B: EV=100003
B: KEY=1680 0 0 10004ffc

I: Bus=0013 Vendor=dead Product=beef Version=0101
N: Name="S3C TouchScreen"
P: Phys=input(ts)
S: Sysfs=/devices/virtual/input/input2
U: Uniq=
H: Handlers=mouse0 event2
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0 0 0 0 0 0
B: ABS=1000003

I: Bus=0003 Vendor=08ff Product=0009 Version=0110
N: Name="USB Reader With Keyboard"
P: Phys=usb-s3c24xx-1/input0
S: Sysfs=/devices/platform/s3c2410-ohci/usb1/1-1/1-1:1.0/input/input3
U: Uniq=
H: Handlers=sysrq kbd event3
B: PROP=0
B: EV=120013
B: KEY=e080ffdf 1cfffff ffffffff fffffffe
B: MSC=10
B: LED=1f

 系统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>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/input.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char *argv[]) {
 int fd;
 struct input_event ev;
 int nBytes;
 fd = open("/dev/input/event3", O_RDONLY);
 if (fd < 0) {
  perror("can not open device\r\n");
  exit(1);
 }
 while (1) {
  nBytes = read(fd, (char *) &ev, sizeof(struct input_event));
  if (nBytes > 0) {
   if (ev.type == 1) {
    //按键值
    if (ev.value == 0) {
     //放开的按键值
     printf("nBytes=[%d] type =[%d] code=[%d] value=[%d] \n",
       nBytes, ev.type, ev.code, ev.value);
    }
   }

  }
 }
}

 

运行的结果如下:

以上程序在:


   飞凌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;
}

 

程序运行效果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值