commXの1文字送信関数
TransChar()ですが
www.moriq.com/delphi/CommX106.lzh
Windows API関数
WiteFile()で書く場合は、
WriteFile( hC, *** ,1, &WriteByte, 0 );
***の型式ですが 1文字送信の場合は
char ? BYTE ? int ?
どう書けばよいのでしょうか?
kikiさんこんにちわ
>char ? BYTE ? int ?
どれで定義しても大丈夫だと思いますよ。
ただWriteByteは書き込んだバイト数が返されますが var ですので
WriteFile( hC, c, 1, WriteByte, 0 );
の様に使用します。
訂正)
最後はポインタだから
WriteFile( hC, c, 1, WriteByte, nil);
「var ですので」のvarと
WriteFile( hC, c, 1, WriteByte, nil);のnliの
意味がよくわからないのですが?
あと、ですが受信する機器側で
文字列を受信する場合や数値を受け付ける場合
ですが型が合わないと
戻り値が帰ってこない場合がありますでしょうか?
といいますのも、実は
TransChar()で送信した場合は
ちゃんと戻り値が帰ってくるのに
WriteFileで送信した場合は、戻り値が帰って
こないのですが。原因がよくわかりません。
> WriteFile( hC, *** ,1, &WriteByte, 0 );
> ***の型式ですが 1文字送信の場合は
> char ? BYTE ? int ?
> どう書けばよいのでしょうか?
1バイトであれば、
var
buff: array[0..0] of byte;
begin
....
WriteFile(hc, buff, 1, &WriteByte, nil);
というようになります。
1つの要素をもつ配列ですね。
WriteFileは戻り値ありますよ。成功すれば0が帰ってくると思います。
失敗すれば0以外で、その理由はGetLastErrorで取得します。
APIのヘルプで、WriteFileを調べてみてください。googleやmicrosoftでも検索可能です。
嘘書きました。
0がエラーです。
0以外のとき、成功でした。
すいません、
Delphn用のcommXを
C++Builderdで使っていて
このサイトで質問させてもらっていますので
var
begin
nilの意味をわかっていません。
Builderではどうなりますでしょうか?
nilはNULLと同意ですね。ちょっと違うんですが、C++の場合、NULLはヌルポインタ、0の両方を意味しますが、nilはヌルポインタのみ意味します。
beginは、{と同じ、endは、}と同じです。
んで、C++で回答するならば、***の部分は、(void*)型でしょう。
APIの宣言は、だいたいはC++なので調べれば解ると思いますよ。
C++ですか・・・
---
DelphiでのWriteFile(Windows.pas)の定義
function WriteFile(
hFile: THandle;
const Buffer;
nNumberOfBytesToWrite: DWORD;
var lpNumberOfBytesWritten: DWORD;
lpOverlapped: POverlapped
): BOOL; stdcall;
---
C++でのWriteFileの定義
BOOL WriteFile(
HANDLE hFile, // ファイルのハンドル
LPCVOID lpBuffer, // データバッファ
DWORD nNumberOfBytesToWrite, // 書き込み対象のバイト数
LPDWORD lpNumberOfBytesWritten, // 書き込んだバイト数
LPOVERLAPPED lpOverlapped // オーバーラップ構造体のバッファ
);
---
Delphiでの lpNumberOfBytesWritten:DWORD は var ですがこれは参照渡しと言うものです。
C++では LPDWORDとなっていますがこれはC++での参照とは違いますがポインタ参照になるので結果は同じものです。
---
char c;
DWORD WriteByte;
とした場合は
C++では
WriteFile(hC, &c, 1, &WriteByte, 0);
Cの場合は
WriteFile(hC, &c, 1, &WriteByte, NULL);
となります。
>TransChar()で送信した場合は
>ちゃんと戻り値が帰ってくるのに
>WriteFileで送信した場合は、戻り値が帰って
>こないのですが。原因がよくわかりません。
CommXをご利用の状態ですと CommX内部では送信・受信それぞれが別Threadで動作しています。(かつ非同期I/Oで動作しています)
この様な場合はApp側で直接 WriteFileを使用するような事は避けなければいけません。
CommXを使用するのであれば
function TransChar(const c: Char): Boolean;
function TransString(const s: string): Boolean;
function TransBlock(const Data; BufSize: Integer): Boolean;
を使用してください。
この様な場合はApp側で直接 WriteFileを使用するような事は避けなければいけません。
とのご返事をいただきましたが、意味がよくわからないのですが。
お手数ですが、再度解説をお願い致します。
現状ですが、commXを使って
----- 中略 ----------------------------------
int buff[20];
int m=0;
buff[0]=0xFD;m++;
buff[1]=0x01;m++;
buff[2]=0x03;m++;
buff[3]=0x5a;m++;
for(int i=0;i<m;i++){
CommX1->TransChar(buff[i]);
Edit1->Text=Edit1->Text+" : "+ buff[i] ;
}
------------------------------------------------------
上記の場合はうまくシリアル送信ができたのですが
commXを使わずAPI関数で下記にようにした場合はうまくシリアル
送信が行きませんでした。
----------------------------------
for(int i=0;i<m;i++){
WriteFile( hC, &buff[i],1, &WriteByte, 0 );
Edit1->Text=Edit1->Text+":"+buff[i];
}
--------------------------------------
"WriteFileを使用するような事は避けなければいけません。"
ですが、commXに依存しないで
WriteFileにて1文字の送受信をおこないたいのです。
commXに依存しないで=commXコンポーネントをインストールしないで
の意味です。
commXの関数ではうまくいったものが
APIのWiteFileではうまくいかない原因がわからないでいます。
CommXを使わないでということならWriteFileの使用には問題ありません。
となると初期化がうまく行われていないのではないかと想像するのですが
通信ポートのオープン&初期化をはどのようにされていますか?
ツイート | ![]() |