commXのTransChar()関数


kiki  2005-05-24 00:07:36  No: 14951

commXの1文字送信関数
TransChar()ですが
www.moriq.com/delphi/CommX106.lzh

Windows  API関数
WiteFile()で書く場合は、

WriteFile( hC, ***  ,1, &WriteByte, 0 );

***の型式ですが  1文字送信の場合は

char ? BYTE ? int ?

どう書けばよいのでしょうか?


kkk  2005-05-24 00:55:28  No: 14952

kikiさんこんにちわ
>char ? BYTE ? int ?
どれで定義しても大丈夫だと思いますよ。
ただWriteByteは書き込んだバイト数が返されますが var ですので
WriteFile( hC,  c, 1, WriteByte, 0 );
の様に使用します。


kkk  2005-05-24 00:58:26  No: 14953

訂正)
最後はポインタだから
WriteFile( hC,  c, 1, WriteByte, nil);


kiki  2005-05-24 03:13:13  No: 14954

「var ですので」のvarと
WriteFile( hC,  c, 1, WriteByte, nil);のnliの
意味がよくわからないのですが?

あと、ですが受信する機器側で
文字列を受信する場合や数値を受け付ける場合
ですが型が合わないと
戻り値が帰ってこない場合がありますでしょうか?
といいますのも、実は
TransChar()で送信した場合は
ちゃんと戻り値が帰ってくるのに
WriteFileで送信した場合は、戻り値が帰って
こないのですが。原因がよくわかりません。


にしの  2005-05-24 03:26:05  No: 14955

> 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でも検索可能です。


にしの  2005-05-24 03:31:41  No: 14956

嘘書きました。
0がエラーです。
0以外のとき、成功でした。


kiki  2005-05-24 08:05:17  No: 14957

すいません、
Delphn用のcommXを
C++Builderdで使っていて
このサイトで質問させてもらっていますので
var
begin
nilの意味をわかっていません。
Builderではどうなりますでしょうか?


にしの  2005-05-24 08:58:16  No: 14958

nilはNULLと同意ですね。ちょっと違うんですが、C++の場合、NULLはヌルポインタ、0の両方を意味しますが、nilはヌルポインタのみ意味します。
beginは、{と同じ、endは、}と同じです。

んで、C++で回答するならば、***の部分は、(void*)型でしょう。
APIの宣言は、だいたいはC++なので調べれば解ると思いますよ。


kkk  2005-05-24 10:55:03  No: 14959

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);
となります。


kkk  2005-05-24 11:05:53  No: 14960

>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;
を使用してください。


kiki  2005-05-24 20:28:50  No: 14961

この様な場合は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];

     }

--------------------------------------


kiki  2005-05-24 20:35:26  No: 14962

"WriteFileを使用するような事は避けなければいけません。"
ですが、commXに依存しないで
WriteFileにて1文字の送受信をおこないたいのです。


kiki  2005-05-24 20:42:52  No: 14963

commXに依存しないで=commXコンポーネントをインストールしないで
の意味です。
commXの関数ではうまくいったものが
APIのWiteFileではうまくいかない原因がわからないでいます。


kkk  2005-05-25 01:43:09  No: 14964

CommXを使わないでということならWriteFileの使用には問題ありません。
となると初期化がうまく行われていないのではないかと想像するのですが
通信ポートのオープン&初期化をはどのようにされていますか?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加