【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22371

Windows上でRS232C
投稿者---c_study(2005/08/02 15:41:12)


過去にここで投稿していたのですが、しばらく書き込みをしていなかったためログが消えてしましました。
そこで、アドバイスをもらっていたのを参考にもう一度考えていたのですが、まだわからないことが多くあるので、もう一度投稿させてもらいます。

スレッドを使ったRS232Cのプログラムを作っています。
リングバッファを使い、読み込み専用のスレッドで書き込んでいくのですが、スレッドの使い方や書き込みの方法、また、受信イベントの使い方がいまいちわからないので何かアドバイスをお願いします。
途中までのプログラムを載せておきますのでおかしい部分など指摘をお願いします。

<pre>
HANDLE hCom;
BYTE          ReadBuf[256], SendBuf[256];   // 受信データ, 送信データ
DWORD         Readsize, Transsize;          // 受信データサイズ
DWORD         Sendsize,dwError;             // 送信データサイズ
DCB           dcb;                          // DCB構造体
BOOL          Ret;                          // 関数戻り値
COMSTAT       cmst;                         // COMSTAT構造体
OVERLAPPED    Overlapped;                   // オーバーラップ構造体
COMMTIMEOUTS  Timeout;                      // タイムアウト構造体
int           n;                            // ループ用



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HANDLE Com_Open(void)
{//ポートオープン
//  CString PortName[] = {&quot;COM1&quot;,&quot;COM2&quot;,&quot;COM3&quot;,&quot;COM4&quot;}
    hCom = CreateFile(&quot;COM1&quot;, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
    SetCommMask(hCom, EV_RXCHAR);//監視するイベントと示すマスク : EV_RXCHAR 1文字受信し、入力バッファに入れたとき
    if(hCom  == INVALID_HANDLE_VALUE){
        printf(&quot;★ポートをオープンできませんでした。\n&quot;);
        return FALSE;
    }else{
        printf(&quot;☆ポートをオープンしました。\n&quot;);
        // タイマー設定 : 受信待ち無制限、送信待ち100ms + 1文字10ms   
        Timeout.ReadIntervalTimeout = 0;
        Timeout.ReadTotalTimeoutMultiplier = 0;
        Timeout.ReadTotalTimeoutConstant = 0;//タイムアウト時間
        Timeout.WriteTotalTimeoutMultiplier = 10;
        Timeout.WriteTotalTimeoutConstant = 100;

        Ret = SetCommTimeouts(hCom, &amp;Timeout);
        if(Ret == FALSE){
            printf(&quot;★タイムアウト失敗\n&quot;);
            CloseHandle(hCom);
            exit(0);
        } else printf(&quot;☆タイムアウト成功 \n&quot;);
    
        //通信設定 19200, 8BIT, 偶数パリティ, STOP1に固定
        Ret = GetCommState(hCom, &amp;dcb);
        if(Ret == FALSE){
            printf(&quot;★通信設定失敗しました。\n&quot;);
            CloseHandle(hCom);
            exit(0);
        }else printf(&quot;☆通信デバイスの設定を制御ブロックに格納しました。\n&quot;);
        dcb.BaudRate = 19200;
        dcb.ByteSize = 8;
        dcb.Parity = EVENPARITY;
        dcb.StopBits = ONESTOPBIT;
        Ret = SetCommState(hCom, &amp;dcb);//通信デバイス構成の初期化
        if(Ret == FALSE){
            printf(&quot;★通信デバイス構成の初期化に失敗しました。\n&quot;);
            CloseHandle(hCom);
            exit(0);
        }else printf(&quot;☆伝送方法を設定しました。\n&quot;);

        return(hCom);
    }
}







void run(void* lpvoid)
{
    //メモリブロックに値0を書き込む////////////////////////////////////////////////////////////
    ZeroMemory(&amp;Overlapped, sizeof(OVERLAPPED));
    Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);//CreateEvent:名前付きまたは名前なしのイベントオブジェクトを作成または開きます。

    Ret = ReadFile(hCom, ReadBuf, 256, &amp;Readsize, &amp;Overlapped);

    if(!Ret){
        if(GetLastError() == ERROR_IO_PENDING){//GetLastError:エラーコードを取得
            GetOverlappedResult(hCom, &amp;Overlapped, &amp;Transsize, TRUE);//非同期操作の結果を返す
            Readsize = Transsize;
        }else{
            Readsize = 0;
        }
        printf(&quot;%d byte受信しました。\n&quot;,Readsize);
    }else{
        printf(&quot;受信に失敗しました。\n&quot;);
    }

}


int main()
{
    Com_Open();

    hThread[0] = (HANDLE)_beginthread(run,0,NULL);  //スレッド1作成
    
    serial_close();

}


</pre>



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:Windows上でRS232C 22372 REE 2005/08/02 16:22:38


No.22372

Re:Windows上でRS232C
投稿者---REE(2005/08/02 16:22:38)


>リングバッファを使い、読み込み専用のスレッドで書き込んでいくのですが、スレッドの使い方や書き込みの方法、また、受信イベントの使い方がいまいちわからないので何かアドバイスをお願いします。

アドバイスです。
質問する時には、何が分からないのかを具体的にしてから質問しましょう。
このような質問では、あなたが分からない内容がさっぱりわかりません。

>途中までのプログラムを載せておきますのでおかしい部分など指摘をお願いします。

投稿前に確認画面で正しくプログラムが表示されているか確認しましょう。
ソース部分だけではなく、文章も合わせた上でツールで変換する必要があります。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧