- 締切済み
VC++でrs232c通信
ハイパーターミナルで試したところ、以下のプログラムにも書いてありますが C,OL,1と入力すると OKという文字が返ってくるというものなのですが、 printf("%s,オンラインに失敗しました\n",l);の所で lがnoneのままでした。 説明書にはC,OL,1[CR][LF]と入力すると OK<CR><LF>またはER,n<CR><LF>と返ってくると書いてありました。 色々調べはしたのですが、わかりません。 根本から間違っているような気もします。 何処が間違っているかご指摘をお願いします。 ************************************* HANDLE COMHandle; DWORD dwRoad,dwWrite,dwError,dwCount; COMSTAT ComStat; char *l="none"; COMHandle=CreateFile("COM3",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);//ハンドルの取得 if ( COMHandle == INVALID_HANDLE_VALUE ) { printf("COMport Open Error!\n"); getch(); exit(1); } DCB dcb; GetCommState(COMHandle,&dcb);//シリアルポートの状態を取得 dcb.BaudRate=2400;//ボーレート,伝達速度,bps dcb.ByteSize = 8; // データサイズ,bit dcb.Parity = NOPARITY; // パリティ:エラー検出 dcb.StopBits = ONESTOPBIT; // ストップビット SetCommState(COMHandle,&dcb); // シリアルポートの状態を設定 ncf1="C,OL,1\r\n";//入力コマンド WriteFile(COMHandle,ncf1,strlen(ncf1),&dwWrite,NULL); ClearCommError(COMHandle,&dwError,&ComStat); dwCount=ComStat.cbInQue; ReadFile(COMHandle,l,dwCount,&dwRoad,NULL); if(l!="OK\r\n"){ printf("%s,オンラインに失敗しました\n",l); getch(); exit(1); }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- Wr5
- ベストアンサー率53% (2173/4061)
>char *l="none"; ポインタ変数lが指しているのは「文字列リラテル」の先頭アドレスです。 通常、「文字列リラテル」は書き換えすることが出来ません。 よって…… >ReadFile(COMHandle,l,dwCount,&dwRoad,NULL); の時点でdwCountが0以外(1以上)だった場合にアクセス違反で吹っ飛ぶかと思われますが……。 # 0だったらたぶん通るんでしょうが、それは期待した動作じゃないですよね? >if(l!="OK\r\n"){ ポインタ変数lの指しているアドレスと、メモリ上のどこかに格納されている"OK\r\n"の「アドレスを比較」しています。 通常、この方法では「文字列の比較」は出来ません。 l = "OK\r\n"; と、どこかで実行していれば成功する可能性はあります。 # が、当たり前ですが期待した動作ではないはずです。 ということで……いろいろ間違っているかと。 >ClearCommError(COMHandle,&dwError,&ComStat); >dwCount=ComStat.cbInQue; クリアしちゃっていいのか不明ですが…… 受信データのサイズが入っているとすると、ここで取得したdwCount分のメモリ確保を行い、 >ReadFile(COMHandle,l,dwCount,&dwRoad,NULL); で、受信することになります。 # 第2引数は事前に確保したメモリ領域を指すポインタを。 >if(l!="OK\r\n"){ 正しく「文字列比較」できるように修正する必要があります。 lではなく、直前のReadFile()の第2引数に渡したメモリ領域と比較します。 # strcmp()等を使うコトになるでしょう。
お礼
お礼が遅くなってすいません。 回答ありがとうございます。 そうですね、基礎的な部分もすっかり忘れていました。 とりあえずネットで調べてババッと作ったので使ってるコマンドもおかしいかもしれません。もう一度きちんと調べ直して作ってみます。