COMポートを開放し、受信イベントを並列で行いたいです。
流れ
外部機器Aから受信し、処理
外部機器Aを受信している最中に外部機器Bから受信したら外部機器Aの受信処理をとめる
openmpで並列化させ、受信イベントを2つ作成しても、ひとつしか正常に受信できません。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
COMポートは1つだけ(例えばCOM1だけ)ですか?一つのCOMポートに2つの外部機器という1:多は無理だと思います。
それとも外部機器AとCOM1、外部機器BとCOM2という風にCOMポートを二つ仕様ですか?
できれば該当部分のソース記載お願い致します。
追記
visual studio Comunity 2015のコンソールアプリケーションとしてビルド
c
1// ConsoleApplication1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 2// 3 4#include "stdafx.h" 5#include <windows.h> 6 7int mainthread(void); 8 9DWORD WINAPI ThreadFunc(LPVOID arg) 10{ 11 HANDLE hPort; 12 char cRcv; 13 DWORD dwSendSize; 14 DWORD lRead; 15 16 hPort = CreateFile( 17 _T("COM2"), 18 GENERIC_READ | GENERIC_WRITE, 19 0, 20 NULL, 21 OPEN_EXISTING, 22 FILE_ATTRIBUTE_NORMAL, 23 NULL 24 ); 25 26 27 while (1) 28 { 29 WriteFile(hPort, _T("2"), 1, &dwSendSize, NULL); 30 31 Sleep(100); 32 33 cRcv = '\0'; 34 35 ReadFile(hPort, &cRcv, 1, &lRead, NULL); 36 37 if (lRead > 0) 38 printf("%c", cRcv); 39 40 Sleep(100); 41 } 42 43 44 return 0; 45} 46 47 48 49int main() 50{ 51 HANDLE hThread; 52 DWORD dwThreadId; 53 54 //スレッド起動 55 hThread = CreateThread( 56 NULL, 57 0, 58 ThreadFunc, 59 NULL, 60 0, 61 &dwThreadId); 62 63 mainthread(); 64 return 0; 65} 66int mainthread() 67{ 68 HANDLE hPort; 69 char cRcv; 70 DWORD dwSendSize; 71 DWORD lRead; 72 73 hPort = CreateFile( 74 _T("COM1"), 75 GENERIC_READ | GENERIC_WRITE, 76 0, 77 NULL, 78 OPEN_EXISTING, 79 FILE_ATTRIBUTE_NORMAL, 80 NULL 81 ); 82 83 84 while (1) 85 { 86 WriteFile(hPort,_T("1"),1,&dwSendSize,NULL); 87 88 Sleep(100); 89 90 cRcv = '\0'; 91 92 ReadFile(hPort,&cRcv,1,&lRead,NULL); 93 94 if(lRead > 0) 95 printf("%c", cRcv); 96 97 Sleep(100); 98 } 99 100 return 1; 101 102} 103
・追記の補足
酔った状態で回答してから翌日あまりにもはしょりすぎたサンプルなので少しだけ補足させてください。
各シリアルポートがたったこれだけで送信受信しているのはループバックアダプタを各COMポートの先につけているから、ボーレート等すべて同じ事が保証されているからで、実際に外部の機器と通信する場合はそのあたりの設定をしてください。
記載したソースはどちらかというとコメントのやりとりでスレッドを作成してマルチスレッドで動作するやり方があまりご存知でないという事でしたのでスレッドの作り方のサンプルとしてみていただければと、、、
骨組みだけ記載しておくと
c
1 2// サブスレッド 3DWORD WINAPI ThreadFunc(LPVOID arg) 4{ 5 while(!iFlg) 6 { 7 // サブスレッドの処理 8 } 9 10 return 1; 11} 12 13int main() 14{ 15 HANDLE hThread; 16 DWORD dwThreadId; 17 int iFlg = 0; // たとえばこれを終了するためのフラグとする 18 19 //サブスレッド作成 20 hThread = CreateThread( 21 NULL, 22 0, 23 ThreadFunc, 24 NULL, 25 0, 26 &dwThreadId); 27 28 // 割り込みでもなんでも良いのですが、何か外的要因でiFlgを1に変更するとプログラムが終了できる 29 while(!iFlg) 30 { 31 // mainスレッドでの処理 32 33 // 現在このmainスレッドとサブスレッドが並行して実行されている段階 34 } 35 36 // サブスレッドがiFlgを検知して終了するまでまつ 37 // これをしなくとも不具合があるとはいいきれないけど(変な終了してメモリリークとかなってもあれなので。。) 38 // あくまでメインスレッドはサブスレッドの終了をまってから終了する 39 WaitForSingleObject(hThread, INFINITE); 40 41 return 0; 42} 43
今回、メインとサブスレッドの2つですが、COM1をサブスレッド1、COM2をサブスレッド2というふうにメインスレッド、サブスレッド1、サブスレッド2と3スレッド構成で各サブスレッドは通信するためだけのスレッド、メインスレッドは各サブスレッドのハンドルを管理し、調停役のような役割で組んでも良いと思います。
投稿2016/10/26 06:21
編集2016/10/29 02:24総合スコア1689
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/26 06:31
2016/10/26 07:24
2016/10/26 07:48
2016/10/26 08:18
2016/10/27 00:47
2016/10/28 16:38
2016/10/28 16:44
2016/10/29 02:24