- 締切済み
シリアルポートの初期化がおかしい?応答がないんです。
こんにちは、どうか僕の問題を解決してくださいませんか。いまシリアルポートを会したハードウェアの処理を行っています。しかし、ハードウェアに反応があるときと、ないときがあるのです。自分のプログラムで制御しようとすると、コマンドの応答がまったくなく、テラタームでコマンドを送信すると、応答があります。その後、再度自分のプログラムで制御すると、今度は反応があり、うまく制御できます。この状況を経験した方はいませんでしょうか。以下が初期化部分のコードです。 /////////******** 以下の関数でポートを開きます。 ***************://///////// CreateFileCom(comFileName, &phCom, lBaudRate, lDataByteSize, lParity, lStopBit) ///////*******省略 { DCB dcb; GetCommState((*phCom),&dcb); dcb.BaudRate = lBaudRate; dcb.ByteSize = (BYTE)lDataByteSize; dcb.Parity = (BYTE)lParity; dcb.StopBits = (BYTE)lStopBit; SetCommState((*phCom),&dcb); } } /////////////********* 以下がメイン関数の初期化部分です。 **************///////////// FILE* fp; LPCSTR comFileName = "COM1"; long lBaudRate = CBR_9600; long lDataByteSize = 8; long lParity = NOPARITY; long lStopBit = ONESTOPBIT; int returnValue; char str[1024]; char end_str[2] = "\r"; int j; fRetVal = CreateFileCom(comFileName, &phCom, lBaudRate, lDataByteSize, lParity, lStopBit); よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Haizy
- ベストアンサー率40% (404/988)
もしかして、SetCommStateがうまく働いていないのでは? Cはいいのですが、何Cで組んでます? ちょっと、DCB が何をカプセル化したものかわからないので、確かとはいえませんが・・。 ただ、テラターム 処理後に 動作するということは、当該命令だけでは、ACTIVE 状態 にはなりきっていないと思われますね。 つまり、COMが活性状態では無いので、いくら呼び出してもダメとか、OSへの通知が必要な場合などが、考えられませんか。 なにか、もうワンアクション必要なのではないでしょうか?? とりあえず、ハードがらみで、環境がわからないのは、キツイです 補足要求: ・使用機器(パソコンの機種。せめて、PC98かDOS/Vか) ・OS(DOSか、Winかすらわかりません) ・Cのバージョン(この場合コンパイラのバージョンというより、製品名+製品バージョンで)
お礼
お返事が遅れまして申し訳ありません。やはり、おっしゃるとおり、COMポートの初期化が問題でした。(DCBの設定を、しらみつぶしに変えたらできました。)C言語の経験が浅く、C言語といってもさまざまな種類があり、それぞれに違った拡張機能を持っているんですね。これからはそのあたりを明記して質問させていただきます。これからもよろしくお願いします。今回の場合は、MSのVC++6.0で、WINDOWS NT4.0 でプログラミングしました。