質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

4076閲覧

シリアル通信 イベント 受信

xasax0404

総合スコア27

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/10/31 06:50

編集2016/10/31 07:00

whileで受信イベントのオープンクローズを2つループさせたいです。

c++

1i = 0; 2 3 while (i <= 50){ 4 //データ受信PLC 5 // COMポートの受信イベント作成 6 OVERLAPPED ovRead2; 7 memset(&ovRead2, 0, sizeof(ovRead2)); 8 ovRead2.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 9 if (ovRead2.hEvent == NULL){ 10 printf("RS232C CreateEvent Error\n"); 11 return -1; 12 } 13 // COMポートの受信イベントマスク 14 if (SetCommMask(Rs232c2, EV_RXCHAR) == FALSE){ 15 printf("RS232C SetCommMask Error\n"); 16 return -1; 17 } 18 19 // COMポートの受信待ち 20 DWORD EvtMask2 = 0; 21 DWORD Transfer2 = 0; 22 if (WaitCommEvent(Rs232c2, &EvtMask2, &ovReadH) == FALSE){ 23 if (GetLastError() == ERROR_IO_PENDING) { 24 GetOverlappedResult(Rs232c2, &ovReadH, &Transfer2, TRUE); 25 } 26 else{ 27 printf("RS232C WaitCommEvent Error\n"); 28 return -1; 29 } 30 } 31 32 // COMポートの受信データチェックPLC 33 COMSTAT comstZ; 34 DWORD dwErrZ; 35 ClearCommError(Rs232c2, &dwErrZ, &comstZ); 36 37 // COMポートからデータ受信 38 if (ReadFile(Rs232c2, RcvBuf, comstZ.cbInQue, &dwSize, &ovRead2) == FALSE){ 39 printf("RS232C ReadFile Error\n"); 40 return -1; 41 } 42 else{ 43 // 受信成功 44 printf("%d\n", i); 45 } 46 47 CloseHandle(ovRead2.hEvent); 48 memset(RcvBuf, 0, sizeof(RcvBuf)); 49 50 51 52 //データ受信Android 53 // COMポートの受信イベント作成 54 OVERLAPPED ovRead3; 55 memset(&ovRead3, 0, sizeof(ovRead3)); 56 ovRead3.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 57 if (ovRead3.hEvent == NULL){ 58 printf("RS232C CreateEvent Error\n"); 59 return -1; 60 } 61 // COMポートの受信イベントマスク 62 if (SetCommMask(Rs232c1, EV_RXCHAR) == FALSE){ 63 printf("RS232C SetCommMask Error\n"); 64 return -1; 65 } 66 67 // COMポートの受信データチェックAndroid 68 COMSTAT comstA; 69 DWORD dwErrA; 70 ClearCommError(Rs232c1, &dwErrA, &comstA); 71 72 // COMポートからデータ受信 73 if (ReadFile(Rs232c1, RcvBuf, comstA.cbInQue, &dwSize, &ovRead3) == FALSE){ 74 printf("RS232C ReadFile Error\n"); 75 return -1; 76 } 77 else{ 78 // 受信成功 79 break; 80 } 81 CloseHandle(ovRead3.hEvent); 82 i++; 83 }

ovRead2でPLCから送信された物を受信し、ovRead2を閉じる。その後ovRead3でAndroidから送信された物を受信した時にbreakしたいです。ですが、上記だとAndroidから受信するしない関係なくループせずにbreakまで到達してしまいます。何が原因なのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Androidの方にはWaitCommEventがないからでは?

投稿2016/10/31 08:06

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xasax0404

2016/10/31 09:22

入れてもbreakまで通ってしまいます。。。
ttyp03

2016/11/01 00:27

少なくともSetCommMaskのあとにWaitCommEventを入れましょう。 これで何かしら受信されたら先に進むという実装になると思います。 そのあとはReadFileで戻り値がFALSEにならないということは受信ができているということになるので、以前の回答と同じように、何が送られてきているのかをRcvBufの中身を解析してみてください。
guest

0

iventを使った割り込み?
でも内部は割り込み処理っぽくなく見えるのは私だけ??

投稿2016/10/31 07:01

MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問