teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

追記の補足

2016/10/29 02:24

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -110,4 +110,63 @@
110
110
 
111
111
  }
112
112
 
113
- ```
113
+ ```
114
+
115
+ ・追記の補足
116
+
117
+ 酔った状態で回答してから翌日あまりにもはしょりすぎたサンプルなので少しだけ補足させてください。
118
+
119
+ 各シリアルポートがたったこれだけで送信受信しているのはループバックアダプタを各COMポートの先につけているから、ボーレート等すべて同じ事が保証されているからで、実際に外部の機器と通信する場合はそのあたりの設定をしてください。
120
+
121
+ 記載したソースはどちらかというとコメントのやりとりでスレッドを作成してマルチスレッドで動作するやり方があまりご存知でないという事でしたのでスレッドの作り方のサンプルとしてみていただければと、、、
122
+
123
+
124
+ 骨組みだけ記載しておくと
125
+
126
+ ```c
127
+
128
+ // サブスレッド
129
+ DWORD WINAPI ThreadFunc(LPVOID arg)
130
+ {
131
+ while(!iFlg)
132
+ {
133
+ // サブスレッドの処理
134
+ }
135
+
136
+ return 1;
137
+ }
138
+
139
+ int main()
140
+ {
141
+ HANDLE hThread;
142
+ DWORD dwThreadId;
143
+ int iFlg = 0; // たとえばこれを終了するためのフラグとする
144
+
145
+ //サブスレッド作成
146
+ hThread = CreateThread(
147
+ NULL,
148
+ 0,
149
+ ThreadFunc,
150
+ NULL,
151
+ 0,
152
+ &dwThreadId);
153
+
154
+    // 割り込みでもなんでも良いのですが、何か外的要因でiFlgを1に変更するとプログラムが終了できる
155
+ while(!iFlg)
156
+ {
157
+ // mainスレッドでの処理
158
+
159
+     // 現在このmainスレッドとサブスレッドが並行して実行されている段階
160
+ }
161
+
162
+   // サブスレッドがiFlgを検知して終了するまでまつ
163
+   // これをしなくとも不具合があるとはいいきれないけど(変な終了してメモリリークとかなってもあれなので。。)
164
+   // あくまでメインスレッドはサブスレッドの終了をまってから終了する
165
+   WaitForSingleObject(hThread, INFINITE);
166
+
167
+ return 0;
168
+ }
169
+
170
+ ```
171
+
172
+ 今回、メインとサブスレッドの2つですが、COM1をサブスレッド1、COM2をサブスレッド2というふうにメインスレッド、サブスレッド1、サブスレッド2と3スレッド構成で各サブスレッドは通信するためだけのスレッド、メインスレッドは各サブスレッドのハンドルを管理し、調停役のような役割で組んでも良いと思います。

5

追記

2016/10/29 02:24

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -5,6 +5,7 @@
5
5
 
6
6
  > 追記
7
7
 
8
+ visual studio Comunity 2015のコンソールアプリケーションとしてビルド
8
9
  ```c
9
10
  // ConsoleApplication1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
10
11
  //
@@ -109,4 +110,4 @@
109
110
 
110
111
  }
111
112
 
112
- ```
113
+ ```

4

追記

2016/10/28 16:40

投稿

hiim
hiim

スコア1689

answer CHANGED
File without changes

3

追記

2016/10/28 16:40

投稿

hiim
hiim

スコア1689

answer CHANGED
File without changes

2

追記

2016/10/28 16:40

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -1,4 +1,112 @@
1
1
  COMポートは1つだけ(例えばCOM1だけ)ですか?一つのCOMポートに2つの外部機器という1:多は無理だと思います。
2
2
  それとも外部機器AとCOM1、外部機器BとCOM2という風にCOMポートを二つ仕様ですか?
3
3
 
4
- できれば該当部分のソース記載お願い致します。
4
+ できれば該当部分のソース記載お願い致します。
5
+
6
+ > 追記
7
+
8
+ ```c
9
+ // ConsoleApplication1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
10
+ //
11
+
12
+ #include "stdafx.h"
13
+ #include <windows.h>
14
+
15
+ int mainthread(void);
16
+
17
+ DWORD WINAPI ThreadFunc(LPVOID arg)
18
+ {
19
+ HANDLE hPort;
20
+ char cRcv;
21
+ DWORD dwSendSize;
22
+ DWORD lRead;
23
+
24
+ hPort = CreateFile(
25
+ _T("COM2"),
26
+ GENERIC_READ | GENERIC_WRITE,
27
+ 0,
28
+ NULL,
29
+ OPEN_EXISTING,
30
+ FILE_ATTRIBUTE_NORMAL,
31
+ NULL
32
+ );
33
+
34
+
35
+ while (1)
36
+ {
37
+ WriteFile(hPort, _T("2"), 1, &dwSendSize, NULL);
38
+
39
+ Sleep(100);
40
+
41
+ cRcv = '\0';
42
+
43
+ ReadFile(hPort, &cRcv, 1, &lRead, NULL);
44
+
45
+ if (lRead > 0)
46
+ printf("%c", cRcv);
47
+
48
+ Sleep(100);
49
+ }
50
+
51
+
52
+ return 0;
53
+ }
54
+
55
+
56
+
57
+ int main()
58
+ {
59
+ HANDLE hThread;
60
+ DWORD dwThreadId;
61
+
62
+ //スレッド起動
63
+ hThread = CreateThread(
64
+ NULL,
65
+ 0,
66
+ ThreadFunc,
67
+ NULL,
68
+ 0,
69
+ &dwThreadId);
70
+
71
+ mainthread();
72
+ return 0;
73
+ }
74
+ int mainthread()
75
+ {
76
+ HANDLE hPort;
77
+ char cRcv;
78
+ DWORD dwSendSize;
79
+ DWORD lRead;
80
+
81
+ hPort = CreateFile(
82
+ _T("COM1"),
83
+ GENERIC_READ | GENERIC_WRITE,
84
+ 0,
85
+ NULL,
86
+ OPEN_EXISTING,
87
+ FILE_ATTRIBUTE_NORMAL,
88
+ NULL
89
+ );
90
+
91
+
92
+ while (1)
93
+ {
94
+ WriteFile(hPort,_T("1"),1,&dwSendSize,NULL);
95
+
96
+ Sleep(100);
97
+
98
+ cRcv = '\0';
99
+
100
+ ReadFile(hPort,&cRcv,1,&lRead,NULL);
101
+
102
+ if(lRead > 0)
103
+ printf("%c", cRcv);
104
+
105
+ Sleep(100);
106
+ }
107
+
108
+ return 1;
109
+
110
+ }
111
+
112
+ ```

1

追記

2016/10/28 16:26

投稿

hiim
hiim

スコア1689

answer CHANGED
@@ -1,2 +1,4 @@
1
1
  COMポートは1つだけ(例えばCOM1だけ)ですか?一つのCOMポートに2つの外部機器という1:多は無理だと思います。
2
- それとも外部機器AとCOM1、外部機器BとCOM2という風にCOMポートを二つ仕様ですか?
2
+ それとも外部機器AとCOM1、外部機器BとCOM2という風にCOMポートを二つ仕様ですか?
3
+
4
+ できれば該当部分のソース記載お願い致します。