※ ChatGPTを利用し、要約された質問です(原文:16bitのパラレル送信がうまくいかないで困っています。)
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環境で使用していたソースも掲示できます。
補足
回答ありがとうございます。 16bit送信が可能と思ったのは実際に手元にこのデバイスを使用して(バージョンはV4.9)16個のLEDを制御しているツールがあるからなんです。ただ実行ファイルだけでソースがないのでOut16関数を使用してひとつの命令で送信してるかどうかはわからないんです。 Out8関数でデータ用8bitにデータ送信して16個あるLEDの下位8個にコントロールレジスタからそのデータを反映させて、と同じことを上位8個でしているのかもしれません。実際この方法なら16個のLEDを管理することは現時点で可能です。 ただ、私がしたいのはひとつの命令で16bitをLEDに反映させたいのです。 何から何まで聞いてすみませんが、もし方法があるのならばご教授願います。