16bitのパラレル送信がうまくいかないで困っています

このQ&Aのポイント
  • 16bitのパラレル送信がうまくいかないで困っています。25ピンのパラレルポートからデータを送信して16個あるLEDを制御したいのですが上手くいきません。
  • 環境はC言語でデバイスはRobot I/O Port 32 DLL V5.4を使用しています。最初はGiveIoというデバイスを使用していたのですが、どうしても8bitまでしか送信できず今のデバイスに変更しました。
  • 変更したのはいいのですが、このデバイスでも8bitまでしか送信できません。多分私のプログラムのせいだと思うのですが・・・
回答を見る
  • ベストアンサー

16bitのパラレル送信がうまくいかないで困っています。

16bitのパラレル送信がうまくいかないで困っています。 25ピンのパラレルポートからデータを送信して16個あるLEDを制御したいのですが上手くいきません。 環境はC言語でデバイスはRobot I/O Port 32 DLL V5.4を使用しています。 最初はGiveIoというデバイスを使用していたのですが、どうしても8bitまでしか送信できず今のデバイスに変更しました。 変更したのはいいのですが、このデバイスでも8bitまでしか送信できません。多分私のプログラムのせいだと思うのですが・・・ 以下がソースになります。 #include <windows.h> #include <stdio.h> #include <math.h> #include "Rbtiop32.h" // デバイスのヘッダー #pragma comment(lib, "Rbtiop32.lib") // デバイスのlib int main(void) { short puls = 0; // ベースアドレスにいくつプラスするか short beas = 0; // ベースアドレス WORD sousin; // 送信データ int flg = 0; // 送信モード変更フラグ int ReturnData; // 送信したデータの戻り値 printf("--------------------------------------\n"); printf(" パラレルポート通信テストプログラム\n"); printf("--------------------------------------\n"); // PC/AT互換機かチェック if( GetPCArchitectureType() == 1 ) { // パラレルポートベースアドレスを自動設定 beas = SetPrinterPortIOAutoPCAT2(); if ( beas == 0 ) { printf( "パラレルポートを認識できませんでした\n" ); return 0; } printf( "パラレルポートベースアドレス = %x\n", beas ); } else { printf( "パソコンがPC/AT互換機ではありません\n" ); return 0; } printf( "操作するアドレス選択※0から2で入力\n" ); scanf( "%d", &puls ); printf( "操作するアドレス = %x\n", beas+puls ); // ループ while(1) { printf( "送信するデータを入力してください\n" ); scanf( "%d", &sousin ); // ループを抜ける if ( sousin == -1 ) break; // データ送信 printf( "sousin = %d\n", (WORD)sousin ); // データ送信 ReturnData = Out16( GetCurrentPrinterPortIOPCAT()+puls, sousin ); printf( "送信したデータ = %d\n", ReturnData ); // 送信が成功したかどうか? if( GetIOFunctionResult() == 0x00 ) { printf( "データ送信失敗\n\n" ); } else { printf( "データ送信成功!!\n\n" ); } } return 0; } ソースをいじりながら検証していたのでいらない処理等があると思いますがすみませんがこれでお願いします。 このプログラムを2つ起動させてコントロールレジスタとデータレジスタを同時に操作して検証しています。 教授願います。よろしくお願いします。 ※補足(現在の状況等) ・16bitを送信しても下位8bitしか反映されない。上位8bitが無視される。 ・I/Oの範囲は間違っていません。0x3bcがデータアドレスです。 ・必要とあらばGiveIo環境で使用していたソースも掲示できます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

そもそも何故プリンタポートから16Bit出力が出来ると思ったのでしょうか? プリンタポートの出力は、データ用8Bitと制御用信号4Bitだけです。 「Robot I/O Port 32 DLL V5.4」のI/Oポート汎用入出力関数は、自前で汎用パラレルポートを追加した場合に使う関数です。 http://www.vector.co.jp/soft/win95/prog/se127676.html ※ プリンタポートに使用している制御IC(おそらく8255系と思われる)の制御ポートに ※ Out8関数を使って制御コマンドを送り、入力用に設定されているビットを出力用に変更して ※ 16Bitの出力が可能かも知れませんが、入力用の配線がされている所にデータを出力すると制御ICが壊れるかも知れません。

shogo5121
質問者

補足

回答ありがとうございます。 16bit送信が可能と思ったのは実際に手元にこのデバイスを使用して(バージョンはV4.9)16個のLEDを制御しているツールがあるからなんです。ただ実行ファイルだけでソースがないのでOut16関数を使用してひとつの命令で送信してるかどうかはわからないんです。 Out8関数でデータ用8bitにデータ送信して16個あるLEDの下位8個にコントロールレジスタからそのデータを反映させて、と同じことを上位8個でしているのかもしれません。実際この方法なら16個のLEDを管理することは現時点で可能です。 ただ、私がしたいのはひとつの命令で16bitをLEDに反映させたいのです。 何から何まで聞いてすみませんが、もし方法があるのならばご教授願います。

関連するQ&A

  • パラレルポートのアドレスについて質問です。XP(SP3)に、パラレルポ

    パラレルポートのアドレスについて質問です。XP(SP3)に、パラレルポートを入れたのですが、アドレスが分かりません。現象としては、デバイスマネジャー->ポート->パラレルポートまでは見れるのですが、パラレルポートをクリック後リソースのタグがありません。おそらくインストールが間違っているのだろうと思いますが、再インストールしても同じ結果でした。教えていただきたいのは、1)この状況はパラレルポートが認識されているという事なのでしょうか?2)もし認識されているとするならば、どのようにしてアドレス取得できるのでしょうか。よろしくお願いいたします。

  • 文字と数字の判定について

    c言語を学び始めたばかりの者です。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <ctype.h> main(){ printf("数当てゲームを開始します。\n"); int a,count,n,b; srand((unsigned)time(NULL)); printf("1~10の中から1つ数字を選びます。\n"); a = (rand()%10)+1; printf("選びました\n"); for(count=0;;count++){ printf("その数字はズバリ:"); scanf("%d",&n); //もし数字でなければという文にしたい!! if (?){ printf("数字を入力してください。\n"); continue; } else{ if(n<a){ printf("もっと大きな値です。\n"); printf("%d回間違えました。\n",count+1); continue; } if(n==a){ printf("正解です!!\n"); b=0; exit(0); } if(n>a){ printf("もっと小さな値です。\n"); printf("%d回間違えました。\n",count+1); continue; } } } } というプログラムなのですが数字の判定の仕方が分からなくて最初のifの条件に何をいれればいいのか分からないので分かるかたいましたら教えてもらえないでしょうか?

  • すいません 助けてください

    #include <stdio.h> int main(void) { int a, ##########; int ##########; int vc[]={1,2,3}; a= 10; ptr = &a; b= *ptr; c=&vc[1]; printf("*ptr のデータ =###\n", ####); printf("*ptr のアドレス=####\n", ####); printf("bのデータ =####\n", ####); printf("bのアドレス=####\n", ####); printf("vc[1]のデータ=####\n", ####); printf("vc[1]のアドレス=####\n", ####); printf("cのデータ=###\n", ###); printf("cのアドレス=####\n", ####); return (0); } #の部分がわかりません 教えてください><

  • じゃんけんゲームをつくったのですが・・・。

    自分でじゃんけんゲームを作ってみたのですが、他の人のソースで どういう風に組んでいるのか研究したいのでソースお願いします。 後、もっとこういう風にした方がいいとおもう所があればおねがいします。 <ソース> #include<stdio.h> #include<time.h> #include<stdlib.h> int main() { int i; int n; srand(time(NULL)); n=rand()%3; printf("じゃんけんをします,0がグーで1がチョキで2がパーです\n"); printf("じゃんけんぽい!"); scanf("%d",&i); if(i==0&&n==0){ printf("あいこです\n"); } else if(i==0&&n==1){ printf("勝ちました\n"); } else if(i==0&&n==2) { printf("負けました\n"); } if(i==1&&n==0){ printf("負けました\n"); } else if(i==1&&n==1){ printf("あいこです\n"); } else if(i==1&&n==2) { printf("勝ちました\n"); } if(i==2&&n==0){ printf("勝ちました\n"); } else if(i==2&&n==1){ printf("負けました\n"); } else if(i==2&&n==2){ printf("あいこです\n"); } if(i>2) { printf("やりなおしてください\n"); } return 0; }

  • bit?static?unsigned?

    1年前に出された問題です。 いまだに解けずに、どうすればいいのか・・・ ****** 関数hitotsuumae()を作ってプログラムを完成させよ。 printf文で同じ値が出れば正解である。 main内部を変更してはならない。広域変数を使用してはならない。 ****** #include <stdio.h> #include <stdlib.h> float hitotsumae(float); int main() { float x; x = 1.10; printf("%f = 0.000000\n", hitotsumae(x)); x = 2.20; printf("%f = 1.100000\n", hitotsumae(x)); x = 3.14; printf("%f = 2.200000\n", hitotsumae(x)); x = 5.55; printf("%f = 3.140000\n", hitotsumae(x)); x = 2.71; printf("%f = 5.550000\n", hitotsumae(x)); x = 1.41; printf("%f = 2.710000\n", hitotsumae(x)); exit(0); } float hitotsumae(float x) { //static?unsigned? x < 1; return x; } <<とやるとエラーが出ます。 シフトは関係ないのでしょうか?

  • continueとbreakの位置

    「address2.txt」に登録してあるアドレスを検索するプログラムなのですが、アドレスが検索されない時に再度検索できるように付け足したのですが、「continueとbreakの位置が誤っている」と表示されます。どう訂正すればうまくいくのでしょうか? #define FNAME "address2.txt" #define RECORDLEN 16 #include <stdio.h> #include <stdlib.h> #include <string.h> char *format = "%-15s\n"; int main() { FILE *fp; char search[16], address[16],ans[8]; int no = 0, find = 0; fp = fopen(FNAME, "r+"); if(fp==NULL){ perror("ファイルエラー\n"); return -1; } printf("アドレスの入力-- "); gets(search); while (1) { fseek(fp, RECORDLEN * no++, SEEK_SET); if (fscanf(fp, "%s", address) == EOF) break; if (strstr(address, search) != NULL) { find++; printf("アドレス: %s\n", address); } } if(find>=1){ printf("アドレスが一致しました。" ); } else { printf("アドレスが一致しません。\n"); printf("再度検索し直しますか?(Y/N)\n"); gets(ans); if(ans[0]=='y'||ans[0]=='Y') continue; else break; } fclose(fp); return 0; }

  • パラレルポートのアドレスについて質問です。XP(SP3)に、PCI増設

    パラレルポートのアドレスについて質問です。XP(SP3)に、PCI増設タイプのパラレルポートインターフェースカードを増設したのですが(例 http://www.pc-koubou.jp/goods/214449.html)、アドレスが分かりませんでした。現象としては、デバイスマネジャー->ポート->パラレルポートまでは見れるのですが、パラレルポートをクリック後リソースのタグのみがありません。おそらくインストールが間違っているのだろうと思いますが、再インストールしても同じ結果でした。教えていただきたいのは、1)この状況はパラレルポートが認識されているという事なのでしょうか?2)もし認識されているとするならば、どのようにしてアドレス取得できるのでしょうか。よろしくお願いいたします。前回もどうようの質問をしたのですが、1)に関してはおそらく認識していると考えるべきだと思いました。今回は主に2)についてお願いいたします。

  • USB-パラレル変換ケーブルに関して。

    PCにそれほど詳しくない初心者です。 PCのパラレルポートから信号を出力させるソフト(過去に詳しい人間が作製したもの)を使用しています。最近パラレルポートを装備しているノートパソコンが少なく、パラレルポート増設できるPCカード(高額)を用いているのですが、このたび、新たにUSB-パラレル(25ピン)ケーブルを購入し、使用できないか試行錯誤中です。 現在使用中のソフトではI/Oアドレスを指定して通信しているようなのですが USB-パラレル(25ピン)ケーブルでもI/Oアドレスの指定は可能でしょうか?? (ちなみに、このケーブルをPCに接続後、「デバイスマネージャ」で確認すると「USB印刷サポート」という名前でUSBデバイスとして認識されています。) とんちんかんな質問なのかもしれませんがなにかアドバイスいただけると幸いです。よろしくお願いいたします。

  • 再検索プログラムについて

    再びすみません。 先ほどは別の問題で質問させていただきました。 今回は、address2.txtに保存してあるアドレスを検索するプログラム(下記)なのですが、 (1)アドレスが一致しないときに、再び検索できるようにしたいのですが、うまくできません。 (2)address2.txtに登録してあるアドレスの7行目以降は検索されなくなってしまいます。 これらの問題解決のご指摘をお願いします。 #define FNAME "address2.txt" #define RECORDLEN 16 #include <stdio.h> #include <stdlib.h> #include <string.h> char *format = "%-15s\n"; int main() { FILE *fp; char search[16], address[16],ans[8]; int no = 0, find = 0; fp = fopen(FNAME, "r+"); if(fp==NULL){ perror("ファイルエラー\n"); return -1; } printf("アドレスの入力-- "); gets(search); while (1) { fseek(fp, RECORDLEN * no++, SEEK_SET); if (fscanf(fp, "%s", address) == EOF) break; if (strstr(address, search) != NULL) { find++; printf("アドレス: %s\n", address); } } if(find>=1){ printf("アドレスが一致しました。" ); } else { printf("アドレスが一致しません。\n"); printf("再度検索し直しますか?(Y/N)\n"); gets(ans); if(ans[0]=='y'||ans[0]=='Y') continue; else break; } fclose(fp); return 0; }

  • C言語のことについて教えてください

    C言語のことで教えてください。お願いします #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> #include <windows.h> int main(int argc, char* argv[]) { char *data[] = {"おひつじ","おうし","ふたご","かに","しし","おとめ","てんびん", "さそり","いて","やぎ","みずがめ","うお"}; int data_len = 12; //データの数 char input[10]; //プレイヤーの入力値 int i,p,start; int win = 1; int mawari = 1; //内回りの場合は1 int p_turn = 0; //プレイヤーのターン if ((argc > 1) && (strcmp(argv[1], "-soto") == 0)) { mawari = 0; } srand(time(NULL)); start = rand()%data_len; printf("古今東西山手線ゲ~ム!\n"); printf("お題:星座の名前\n"); for(p = start,i = 1; i<= data_len; i++,p_turn = !p_turn ) { sleep(500); if(p_turn == 0) {printf("コンピューター");} else if (p_turn == 1) {printf("プレイヤー");} sleep(500); printf("ちゃん! >"); if(p_turn == 0) { printf("%s\n",*(data+p)); } else { scanf("%s", input); while (getchar() != '\n') { } if(strcmp(*(data+p),input) != 0) { win = 0; break; } } if(mawari == 1) { p++; } else {p--;} if((mawari ==1) && (p == data_len)) { p = 0;} if((mawari ==0) && (p == -1)) {p = data_len-1;} } if(win == 1) {printf("あなたの勝ち");} else {printf("あなたの負け");} return 0; } なんですが、どうしても } if(mawari == 1) { p++; } else {p--;} if((mawari ==1) && (p == data_len)) { p = 0;} if((mawari ==0) && (p == -1)) {p = data_len-1;} } 変数Pに今は乱数1-12がはいっているのに、なぜこの処理を行うかがわかりません。どうしてなんですか?教えてください。

専門家に質問してみよう