[[SiioLaboratory]] #author("2022-01-13T19:14:49+09:00","","") *Linuxでパラレルポート(プリンタポート)を読み書きする [#a49b1131] Linuxで、ppdevを利用して、 パラレルポート(プリンタポート)(/dev/parport0) を読み書きする方法のメモ。 参考ホームページ - http://people.redhat.com/twaugh/parport/html/ppdev.html -- ppdevの使い方に関する資料 ** /dev/parport0 [#j8b5bcfa] /dev/lp0はハンドシェークしながらパラレルポートにデータを出すのに対して、 /dev/parport0を利用するとパラレルポートのピンを直接読み書きすることができる。 通常, /dev/parport0は一般ユーザが読み書きできない設定なので、 su chmod a+rw /dev/parport0 などして読み書き可能にしておく。 ** ポートを読み書きするサンプル [#sf2d7d94] 以下のプログラムで、 データラインのピンを順番に1にして、 つぎにステータスピン(ackとかbusyなどのピン)の値を読んでいる。 (逆スラッシュが?に文字化けしているので注意) #include <stdio.h> #include <fcntl.h> #include <sys/ioctl.h> #include <linux/ppdev.h> #include <linux/parport.h> main() { int fd; unsigned char byte; int i, rc, count; //open the printer port fd = open("/dev/parport0", O_RDWR); if(fd==-1) { printf("open error?n"); return 1; } if(ioctl(fd,PPCLAIM)) { printf("PPCLAIM error?n"); close(fd); return 1; } //write a byte to data pins for(i=1;i<256;i=i<<1) { usleep(100000); ioctl(fd, PPWDATA, &i); } //read the status pins ioctl(fd, PPRSTATUS, &byte); printf("status is %2x?n", byte); //close the printer port rc=ioctl(fd, PPRELEASE); close(fd); } ** 解説 [#x9c51fbe] - 使い方は非常に簡単。 他の入出力と同じく、ファイルとしてopenしたあとioctlで、 ioctl(fd, XXXXXX); または ioctl(fd, XXXXXX, &byte); のように操作する。 - 簡単だけど罠がひとつ。 ioctl(fd, PPDATADIR, &byte); でデータラインの入出力方向を切り替えられるはず(byte=1で出力、byte=0で入力) なのだけど、なぜかこれを行うとデータラインに書きこめなくなった。 - ioctlの説明は、冒頭のURLの場所の次のページが詳しい。 http://people.redhat.com/twaugh/parport/html/x623.html