回答編集履歴

6

追記の補足

2016/10/29 02:24

投稿

hiim
hiim

スコア1689

test CHANGED
@@ -223,3 +223,123 @@
223
223
 
224
224
 
225
225
  ```
226
+
227
+
228
+
229
+ ・追記の補足
230
+
231
+
232
+
233
+ 酔った状態で回答してから翌日あまりにもはしょりすぎたサンプルなので少しだけ補足させてください。
234
+
235
+
236
+
237
+ 各シリアルポートがたったこれだけで送信受信しているのはループバックアダプタを各COMポートの先につけているから、ボーレート等すべて同じ事が保証されているからで、実際に外部の機器と通信する場合はそのあたりの設定をしてください。
238
+
239
+
240
+
241
+ 記載したソースはどちらかというとコメントのやりとりでスレッドを作成してマルチスレッドで動作するやり方があまりご存知でないという事でしたのでスレッドの作り方のサンプルとしてみていただければと、、、
242
+
243
+
244
+
245
+
246
+
247
+ 骨組みだけ記載しておくと
248
+
249
+
250
+
251
+ ```c
252
+
253
+
254
+
255
+ // サブスレッド
256
+
257
+ DWORD WINAPI ThreadFunc(LPVOID arg)
258
+
259
+ {
260
+
261
+ while(!iFlg)
262
+
263
+ {
264
+
265
+ // サブスレッドの処理
266
+
267
+ }
268
+
269
+
270
+
271
+ return 1;
272
+
273
+ }
274
+
275
+
276
+
277
+ int main()
278
+
279
+ {
280
+
281
+ HANDLE hThread;
282
+
283
+ DWORD dwThreadId;
284
+
285
+ int iFlg = 0; // たとえばこれを終了するためのフラグとする
286
+
287
+
288
+
289
+ //サブスレッド作成
290
+
291
+ hThread = CreateThread(
292
+
293
+ NULL,
294
+
295
+ 0,
296
+
297
+ ThreadFunc,
298
+
299
+ NULL,
300
+
301
+ 0,
302
+
303
+ &dwThreadId);
304
+
305
+
306
+
307
+    // 割り込みでもなんでも良いのですが、何か外的要因でiFlgを1に変更するとプログラムが終了できる
308
+
309
+ while(!iFlg)
310
+
311
+ {
312
+
313
+ // mainスレッドでの処理
314
+
315
+
316
+
317
+     // 現在このmainスレッドとサブスレッドが並行して実行されている段階
318
+
319
+ }
320
+
321
+
322
+
323
+   // サブスレッドがiFlgを検知して終了するまでまつ
324
+
325
+   // これをしなくとも不具合があるとはいいきれないけど(変な終了してメモリリークとかなってもあれなので。。)
326
+
327
+   // あくまでメインスレッドはサブスレッドの終了をまってから終了する
328
+
329
+   WaitForSingleObject(hThread, INFINITE);
330
+
331
+
332
+
333
+ return 0;
334
+
335
+ }
336
+
337
+
338
+
339
+ ```
340
+
341
+
342
+
343
+ 今回、メインとサブスレッドの2つですが、COM1をサブスレッド1、COM2をサブスレッド2というふうにメインスレッド、サブスレッド1、サブスレッド2と3スレッド構成で各サブスレッドは通信するためだけのスレッド、メインスレッドは各サブスレッドのハンドルを管理し、調停役のような役割で組んでも良いと思います。
344
+
345
+

5

追記

2016/10/29 02:24

投稿

hiim
hiim

スコア1689

test CHANGED
@@ -12,6 +12,8 @@
12
12
 
13
13
 
14
14
 
15
+ visual studio Comunity 2015のコンソールアプリケーションとしてビルド
16
+
15
17
  ```c
16
18
 
17
19
  // ConsoleApplication1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
@@ -220,4 +222,4 @@
220
222
 
221
223
 
222
224
 
223
- ```
225
+ ```

4

追記

2016/10/28 16:40

投稿

hiim
hiim

スコア1689

test CHANGED
File without changes

3

追記

2016/10/28 16:40

投稿

hiim
hiim

スコア1689

test CHANGED
File without changes

2

追記

2016/10/28 16:40

投稿

hiim
hiim

スコア1689

test CHANGED
@@ -5,3 +5,219 @@
5
5
 
6
6
 
7
7
  できれば該当部分のソース記載お願い致します。
8
+
9
+
10
+
11
+ > 追記
12
+
13
+
14
+
15
+ ```c
16
+
17
+ // ConsoleApplication1.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
18
+
19
+ //
20
+
21
+
22
+
23
+ #include "stdafx.h"
24
+
25
+ #include <windows.h>
26
+
27
+
28
+
29
+ int mainthread(void);
30
+
31
+
32
+
33
+ DWORD WINAPI ThreadFunc(LPVOID arg)
34
+
35
+ {
36
+
37
+ HANDLE hPort;
38
+
39
+ char cRcv;
40
+
41
+ DWORD dwSendSize;
42
+
43
+ DWORD lRead;
44
+
45
+
46
+
47
+ hPort = CreateFile(
48
+
49
+ _T("COM2"),
50
+
51
+ GENERIC_READ | GENERIC_WRITE,
52
+
53
+ 0,
54
+
55
+ NULL,
56
+
57
+ OPEN_EXISTING,
58
+
59
+ FILE_ATTRIBUTE_NORMAL,
60
+
61
+ NULL
62
+
63
+ );
64
+
65
+
66
+
67
+
68
+
69
+ while (1)
70
+
71
+ {
72
+
73
+ WriteFile(hPort, _T("2"), 1, &dwSendSize, NULL);
74
+
75
+
76
+
77
+ Sleep(100);
78
+
79
+
80
+
81
+ cRcv = '\0';
82
+
83
+
84
+
85
+ ReadFile(hPort, &cRcv, 1, &lRead, NULL);
86
+
87
+
88
+
89
+ if (lRead > 0)
90
+
91
+ printf("%c", cRcv);
92
+
93
+
94
+
95
+ Sleep(100);
96
+
97
+ }
98
+
99
+
100
+
101
+
102
+
103
+ return 0;
104
+
105
+ }
106
+
107
+
108
+
109
+
110
+
111
+
112
+
113
+ int main()
114
+
115
+ {
116
+
117
+ HANDLE hThread;
118
+
119
+ DWORD dwThreadId;
120
+
121
+
122
+
123
+ //スレッド起動
124
+
125
+ hThread = CreateThread(
126
+
127
+ NULL,
128
+
129
+ 0,
130
+
131
+ ThreadFunc,
132
+
133
+ NULL,
134
+
135
+ 0,
136
+
137
+ &dwThreadId);
138
+
139
+
140
+
141
+ mainthread();
142
+
143
+ return 0;
144
+
145
+ }
146
+
147
+ int mainthread()
148
+
149
+ {
150
+
151
+ HANDLE hPort;
152
+
153
+ char cRcv;
154
+
155
+ DWORD dwSendSize;
156
+
157
+ DWORD lRead;
158
+
159
+
160
+
161
+ hPort = CreateFile(
162
+
163
+ _T("COM1"),
164
+
165
+ GENERIC_READ | GENERIC_WRITE,
166
+
167
+ 0,
168
+
169
+ NULL,
170
+
171
+ OPEN_EXISTING,
172
+
173
+ FILE_ATTRIBUTE_NORMAL,
174
+
175
+ NULL
176
+
177
+ );
178
+
179
+
180
+
181
+
182
+
183
+ while (1)
184
+
185
+ {
186
+
187
+ WriteFile(hPort,_T("1"),1,&dwSendSize,NULL);
188
+
189
+
190
+
191
+ Sleep(100);
192
+
193
+
194
+
195
+ cRcv = '\0';
196
+
197
+
198
+
199
+ ReadFile(hPort,&cRcv,1,&lRead,NULL);
200
+
201
+
202
+
203
+ if(lRead > 0)
204
+
205
+ printf("%c", cRcv);
206
+
207
+
208
+
209
+ Sleep(100);
210
+
211
+ }
212
+
213
+
214
+
215
+ return 1;
216
+
217
+
218
+
219
+ }
220
+
221
+
222
+
223
+ ```

1

追記

2016/10/28 16:26

投稿

hiim
hiim

スコア1689

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