シリアル通信で最初だけ通信ができない

解決


ジル  2006-01-05 21:41:43  No: 60153

COM1とCOM3を使用したシリアル通信プログラムを書いています。
そこで、よくわからない現象に出会ったので、
どなたかのお知恵を拝借したいと思い、書き込ませていただきます。

1.PCを起動する。
2.自作ツールとTelaTermを立ち上げる。
    COM1(自作ツール使用) COM3(TelaTerm使用)
3.COM1からCOM3にデータを転送してもTelaTermにデータが送られません。
    COM3からCOM1にデータを転送しても、TelaTermからデータが来ません。
    (COMSTATのcbInQueが0のまま)
    WriteFileやReadFileの戻り値は1で正常です。書き込んだバイト数は正 
    常です。cbInQueが0なので、読み込みはできていません。

1.PCを起動。
2.TelaTermを2個起動。
    COM1(TelaTerm使用) COM3(TelaTerm使用)
3.COM1を使用しているTelaTermを閉じる。
4.自作ツール起動。COM1(自作ツール使用)
5.COM1(自作ツール)とCOM3(TelaTerm)の間で通信を行うと、
    送信受信ともに正常に行われる。
    COM1とCOM3を入れ替えても正常に送受信可能。

このようなことが起こる理由がわからず困っています。
一度他のツールでポートを使用した後ならば、正常に送受信可能なので、
ReadFileやWriteFileは正しく動いていると思うのですが・・・
よろしくお願いします。


ジル  2006-01-05 22:09:13  No: 60154

一応送信するときのプログラム載せてみます。

HANDLE hComm;
LPCTSTR comm;
COMSTAT comstat;
DWORD dwErrors;
COMMTIMEOUTS commTO;
DWORD size;
DCB dcb;

comm = "COM1";
SetupComm(hComm,256,256);
GetCommState(hComm,&dcb);
dcb.BaudRate = 38400;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fBinary = TRUE;
SetCommState(hComm,&dcb);
commTO.ReadIntervalTimeout = 0;
commTO.ReadTotalTimeoutConstant = 0;
commTO.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hComm,&commTO);
  hComm = CreateFile(
  comm,
  GENERIC_WRITE,
  0,
  NULL,
  OPEN_EXISTING,
  0,
  NULL);
if( hComm == INVALID_HANDLE_VALUE ){
  CloseHandle(hComm);
  return SEND_NG;
}
ClearCommError(hComm,&dwErrors,&comstat);
WriteFile(hComm, msg, bytes, &size, NULL);
CloseHandle(hComm);

よろしくお願いします。


ジル  2006-01-06 00:04:22  No: 60155

自己解決しました。
お騒がせしました。


PATIO  2006-01-06 02:32:54  No: 60156

せっかく書き込んだのですから
何が原因でどう解決したのか紹介しておくと
後からこのスレッドを見た人の参考になると思うのですけれど。
自己解決した場合でも掲示板のスペースを借りた訳ですし、
掲示板を読む他の人に情報提供するという姿勢があったほうが
よいと思いますよ。


瀬戸っぷ  2006-01-06 08:57:15  No: 60157

DCB dcb;
が未初期化なままGetCommState()呼んでいるのが問題とか?
APIで構造体のアドレス渡して使う場合、
「構造体のサイズ」を指定するメンバがある時に未初期化だと誤動作する例があるらしい…

とりあえず、PATIOさんの意見には賛成。


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

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






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