9

キーボードをエミュレートする USB RFID カードリーダーがあります。そのため、カードを入れると、ターミナルウィンドウに文字列が表示されます-つまり"0684a24bc1"

しかし、Cプログラムでそれを読みたいです。私が使用しても問題はありません:scanf("%s",buff);

しかし、以下のコードを使用すると、認識されないデータが大量 (約 500 バイト) になりました。なんで?非ブロッキング読み取りを希望します。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>

int main(int argc, char ** argv) {
  int fd;
  char buf[256];

  fd = open("/dev/input/event3", O_RDWR | O_NOCTTY | O_NDELAY);
  if (fd == -1) {
    perror("open_port: Unable to open /dev/ttyAMA0 - ");
    return(-1);
  }

  // Turn off blocking for reads, use (fd, F_SETFL, FNDELAY) if you want that
  fcntl(fd, F_SETFL, 0);


  }

while(1){
  n = read(fd, (void*)buf, 255);
  if (n < 0) {
    perror("Read failed - ");
    return -1;
  } else if (n == 0) printf("No data on port\n");
  else {
    buf[n] = '\0';
    printf("%i bytes read : %s", n, buf);
  }
sleep(1);
printf("i'm still doing something");

}
  close(fd);
  return 0;
}
4

3 に答える 3

13

Linux 入力ドキュメントのセクション 5 によると、/dev/input/eventX デバイスは次のようにデータを返します。

ブロック読み取りと非ブロック読み取りを使用でき、/dev/input/eventX デバイスでも select() を使用でき、読み取りで常に整数の入力イベントを取得できます。それらのレイアウトは次のとおりです。

struct input_event {
      struct timeval time;
      unsigned short type;
      unsigned short code;
      unsigned int value; };

'time' はタイムスタンプで、イベントが発生した時刻を返します。タイプは、たとえば、相対モーメントの場合は EV_REL、キーの押下またはリリースの場合は EV_KEY です。include/linux/input.h には、さらに多くのタイプが定義されています。

'code' はイベント コードです。たとえば、REL_X や KEY_BACKSPACE です。完全なリストは include/linux/input.h にあります。

「値」は、イベントが運ぶ値です。EV_REL の相対的な変化、EV_ABS (ジョイスティックなど) の絶対的な新しい値、または EV_KEY のリリースの場合は 0、キープレスの場合は 1、オートリピートの場合は 2 のいずれかです。

于 2013-04-11T12:53:22.697 に答える
-1

の下でイベント デバイスを開くときのコードは明らかに間違っています/dev/input/。あなたのエラーメッセージでさえ、選択と矛盾しています:

perror("open_port: Unable to open /dev/ttyAMA0 - ");

ファイルからの読み取り/dev/input/eventNでは、テキストではなく、イベントの説明 (ポインターの移動やボタンの押下など) を含むバイナリ データが返されます。代わりに、ある種のシリアル エミュレーション デバイスを開きたいと思うでしょう。


回答10周年記念編

Unix.SE で入力デバイス (/dev/input/event*) からの入力をデバッグする方法を検討してください。

コンテンツ用の使いやすい参照デコーダー/dev/input/eventNがあります。これを使用して、コードを検証および比較できます。

于 2013-04-11T12:54:27.440 に答える