• R/O
  • SSH
  • HTTPS

ttssh2: コミット


コミットメタ情報

リビジョン10551 (tree)
日時2023-01-31 01:09:28
作者zmatsuo

ログメッセージ

ハードフロー(RTS/CTS)ができるよう修正

- タイムアウト値を修正
- オーバーフロー制御の設定を見直し
- 'v' verbose on/off
- 'D' ダイアログで設定した後、verbose=on時は設定値が表示されるようにした
- 'o' open後、verbose=on時は設定値が表示されるようにした

変更サマリ

差分

--- branches/ttcomtester/tools/ttcomtester/device_com.cpp (revision 10550)
+++ branches/ttcomtester/tools/ttcomtester/device_com.cpp (revision 10551)
@@ -103,30 +103,14 @@
103103 SetupComm(h, CommInQueSize, CommOutQueSize);
104104 PurgeComm(h, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
105105
106- COMMTIMEOUTS ctmo;
107- r = GetCommTimeouts(h, &ctmo);
108- assert(r == TRUE);
109- printf("Maximum time between read chars %d\n", ctmo.ReadIntervalTimeout);
110- printf("read Multiplier of characters %d\n", ctmo.ReadTotalTimeoutMultiplier);
111- printf("read Constant in milliseconds %d\n", ctmo.ReadTotalTimeoutConstant);
112- printf("write Multiplier of characters %d\n", ctmo.WriteTotalTimeoutMultiplier);
113- printf("write Constant in milliseconds %d\n", ctmo.WriteTotalTimeoutConstant);
114-
115106 if (p->commtimeouts_setted) {
116107 r = SetCommTimeouts(h, &p->commtimeouts);
117108 assert(r == TRUE);
118109 }
119- else {
120- // Tera Term が設定しているパラメータ
121-#if 0
122- memset(&ctmo, 0, sizeof(ctmo));
123- ctmo.ReadIntervalTimeout = MAXDWORD;
124- ctmo.WriteTotalTimeoutConstant = 500;
125- r = SetCommTimeouts(h, &ctmo);
126- assert(r == TRUE);
127-#endif
128- }
129110
111+ r = GetCommTimeouts(h, &p->commtimeouts);
112+ assert(r == TRUE);
113+
130114 if (p->dcb_setted) {
131115 if (p->dcb.XonChar == p->dcb.XoffChar) {
132116 p->dcb.XonChar = 0x11;
@@ -140,6 +124,9 @@
140124 }
141125 }
142126
127+ r = GetCommState(h, &p->dcb);
128+ assert(r == TRUE);
129+
143130 SetCommMask(h, 0);
144131 SetCommMask(h, EV_RXCHAR);
145132
@@ -451,6 +438,12 @@
451438 retval = ERROR_SUCCESS;
452439 break;
453440 }
441+ case GET_COM_DCB: {
442+ DCB *dcb = va_arg(ap, DCB *);
443+ *dcb = p->dcb;
444+ retval = ERROR_SUCCESS;
445+ break;
446+ }
454447 case SET_COM_TIMEOUTS: {
455448 COMMTIMEOUTS *commtimeouts = va_arg(ap, COMMTIMEOUTS *);
456449 p->commtimeouts = *commtimeouts;
@@ -458,6 +451,12 @@
458451 retval = ERROR_SUCCESS;
459452 break;
460453 }
454+ case GET_COM_TIMEOUTS: {
455+ COMMTIMEOUTS *commtimeouts = va_arg(ap, COMMTIMEOUTS *);
456+ *commtimeouts = p->commtimeouts;
457+ retval = ERROR_SUCCESS;
458+ break;
459+ }
461460 case SET_CHECK_LINE_STATE_BEFORE_SEND: {
462461 int check_line_state = va_arg(ap, int);
463462 p->check_line_state_before_send = check_line_state;
@@ -479,6 +478,8 @@
479478 if (r == TRUE) {
480479 r = SetCommConfig(p->h, &cc, size);
481480 assert(r == TRUE);
481+ r = GetCommState(p->h, &p->dcb);
482+ assert(r == TRUE);
482483 }
483484 break;
484485 }
--- branches/ttcomtester/tools/ttcomtester/deviceope.h (revision 10550)
+++ branches/ttcomtester/tools/ttcomtester/deviceope.h (revision 10551)
@@ -37,7 +37,9 @@
3737 SET_PORT_NAME,
3838 GET_RAW_HANDLE,
3939 SET_COM_DCB,
40+ GET_COM_DCB,
4041 SET_COM_TIMEOUTS,
42+ GET_COM_TIMEOUTS,
4143 SET_CHECK_LINE_STATE_BEFORE_SEND,
4244 GET_CHECK_LINE_STATE_BEFORE_SEND,
4345 OPEN_CONFIG_DIALOG,
--- branches/ttcomtester/tools/ttcomtester/main.cpp (revision 10550)
+++ branches/ttcomtester/tools/ttcomtester/main.cpp (revision 10551)
@@ -41,6 +41,7 @@
4141 "'l' disp line state\n"
4242 "'L' check line state before sending\n"
4343 "'D' open device dialogbox\n"
44+ "'v' verbose on/off\n"
4445 " send mode\n"
4546 "':' go command mode\n"
4647 );
@@ -101,6 +102,14 @@
101102 printf("Fill for now. %d\n", p->wReserved1);
102103 }
103104
105+void dumpCOMMTIMEOUTS(const COMMTIMEOUTS *p)
106+{
107+ printf("Maximum time between read chars %d\n", p->ReadIntervalTimeout);
108+ printf("read Multiplier of characters %d\n", p->ReadTotalTimeoutMultiplier);
109+ printf("read Constant in milliseconds %d\n", p->ReadTotalTimeoutConstant);
110+ printf("write Multiplier of characters %d\n", p->WriteTotalTimeoutMultiplier);
111+ printf("write Constant in milliseconds %d\n", p->WriteTotalTimeoutConstant);
112+}
104113
105114 int wmain(int argc, wchar_t *argv[])
106115 {
@@ -112,7 +121,7 @@
112121
113122 bool verbose = false;
114123 wchar_t *ini_base = L"ttcomtester.ini";
115- int arg_rts = RTS_CONTROL_DISABLE;
124+ const wchar_t *arg_rts = L"off";
116125 wchar_t *prog = argv[0];
117126 wchar_t *arg_device_name = NULL;
118127
@@ -146,13 +155,13 @@
146155 break;
147156 case L'r': {
148157 if (wcscmp(optarg_w, L"off") == 0) {
149- arg_rts = RTS_CONTROL_DISABLE;
158+ arg_rts = L"off";
150159 } else if (wcscmp(optarg_w, L"on") == 0) {
151- arg_rts = RTS_CONTROL_ENABLE;
160+ arg_rts = L"on";
152161 } else if (wcscmp(optarg_w, L"hs") == 0) {
153- arg_rts = RTS_CONTROL_HANDSHAKE;
154- } else if (wcscmp(optarg_w, L"on") == 0) {
155- arg_rts = RTS_CONTROL_TOGGLE;
162+ arg_rts = L"hs";
163+ } else if (wcscmp(optarg_w, L"toggle") == 0) {
164+ arg_rts = L"toggle";
156165 } else {
157166 printf("check rts option");
158167 exit(1);
@@ -197,25 +206,72 @@
197206
198207 device_ope const *ope = dev->ope;
199208 ope->ctrl(dev, SET_PORT_NAME, device_name);
200-
201- DCB dcb;
202- memset(&dcb, 0, sizeof(dcb)); // 100% buildしてくれないようだ
203- dcb.DCBlength = sizeof(dcb);
204- BOOL r = BuildCommDCBW(com_param, &dcb);
205- dcb.fRtsControl = arg_rts;
206- if (r == FALSE) {
207- DWORD e = GetLastError();
208- wchar_t b[128];
209- swprintf_s(b, _countof(b), L"BuildCommDCBW('%s')", com_param);
210- DispErrorStr(b, e);
211- goto finish;
212- }
213209 if (verbose) {
214210 printf("param='%ls'\n", com_param);
215- dumpDCB(&dcb);
216211 }
217- ope->ctrl(dev, SET_COM_DCB, &dcb);
218212
213+ {
214+ DCB dcb;
215+ memset(&dcb, 0, sizeof(dcb)); // 100% buildしてくれないようだ
216+ dcb.DCBlength = sizeof(dcb);
217+ BOOL r = BuildCommDCBW(com_param, &dcb);
218+ if (wcscmp(arg_rts, L"off") == 0) {
219+ dcb.fRtsControl = RTS_CONTROL_DISABLE;
220+ dcb.fOutxCtsFlow = FALSE;
221+ } else if (wcscmp(arg_rts, L"on") == 0) {
222+ dcb.fRtsControl = RTS_CONTROL_ENABLE;
223+ dcb.fOutxCtsFlow = FALSE;
224+ } else if (wcscmp(arg_rts, L"hs") == 0) {
225+ dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
226+ dcb.fOutxCtsFlow = TRUE;
227+ } else if (wcscmp(arg_rts, L"toggle") == 0) {
228+ dcb.fRtsControl = RTS_CONTROL_TOGGLE;
229+ //dcb.fOutxCtsFlow = TRUE; //??
230+ }
231+ if (r == FALSE) {
232+ DWORD e = GetLastError();
233+ wchar_t b[128];
234+ swprintf_s(b, _countof(b), L"BuildCommDCBW('%s')", com_param);
235+ DispErrorStr(b, e);
236+ goto finish;
237+ }
238+ ope->ctrl(dev, SET_COM_DCB, &dcb);
239+ }
240+
241+ {
242+ COMMTIMEOUTS timeouts;
243+ memset(&timeouts, 0, sizeof(timeouts));
244+#if 0
245+ // Tera Term が設定しているパラメータ
246+ timeouts.ReadIntervalTimeout = MAXDWORD;
247+ timeouts.WriteTotalTimeoutConstant = 500;
248+#endif
249+#if 0
250+ // CODE PROJECT の値
251+ // https://www.codeproject.com/articles/3061/creating-a-serial-communication-on-win
252+ timeouts.ReadIntervalTimeout = 3;
253+ timeouts.ReadTotalTimeoutMultiplier = 3;
254+ timeouts.ReadTotalTimeoutConstant = 2;
255+ timeouts.WriteTotalTimeoutMultiplier = 3;
256+ timeouts.WriteTotalTimeoutConstant = 2;
257+#endif
258+#if 0
259+ // PuTTYの値
260+ timeouts.ReadIntervalTimeout = 1;
261+ timeouts.ReadTotalTimeoutMultiplier = 0;
262+ timeouts.ReadTotalTimeoutConstant = 0;
263+ timeouts.WriteTotalTimeoutMultiplier = 0;
264+ timeouts.WriteTotalTimeoutConstant = 0;
265+#endif
266+ // 今回提案する値
267+ timeouts.ReadIntervalTimeout = 1;
268+ timeouts.ReadTotalTimeoutMultiplier = 0;
269+ timeouts.ReadTotalTimeoutConstant = 0;
270+ timeouts.WriteTotalTimeoutMultiplier = 0;
271+ timeouts.WriteTotalTimeoutConstant = 1;
272+ ope->ctrl(dev, SET_COM_TIMEOUTS, &timeouts);
273+ }
274+
219275 printf(
220276 "':' switch mode\n"
221277 "' '(space) key usage\n"
@@ -251,6 +307,14 @@
251307 else {
252308 DispErrorStr(L"open()", e);
253309 }
310+ if (verbose) {
311+ DCB dcb;
312+ ope->ctrl(dev, GET_COM_DCB, &dcb);
313+ dumpDCB(&dcb);
314+ COMMTIMEOUTS timeouts;
315+ ope->ctrl(dev, GET_COM_TIMEOUTS, &timeouts);
316+ dumpCOMMTIMEOUTS(&timeouts);
317+ }
254318 break;
255319 }
256320 case 'c': {
@@ -266,27 +330,25 @@
266330 for(size_t i = 0; i < send_len; i++) {
267331 send_data[i] = (unsigned char)i;
268332 }
269- size_t sended_len;
270- DWORD e = ope->write(dev, send_data, send_len, &sended_len);
333+ size_t sent_len;
334+ DWORD e = ope->write(dev, send_data, send_len, &sent_len);
271335 if (e == ERROR_SUCCESS) {
272- printf("sent\n");
336+ printf("sent %zu bytes\n", sent_len);
273337 }
274338 else if (e == ERROR_IO_PENDING) {
275- size_t sended_len_total = sended_len;
339+ size_t sent_len_total = sent_len;
276340 while(1) {
277- r = ope->wait_write(dev, &sended_len);
278-#if 0
279- if (r == ERROR_SUCCESS) {
280- printf("sent\n");
341+ DWORD r = ope->wait_write(dev, &sent_len);
342+ if (r != ERROR_SUCCESS) {
343+ printf("send error\n");
281344 }
282-#endif
283- sended_len_total += sended_len;
284- printf("send size %zu(%zu)/%zu\n", sended_len_total, sended_len, send_len);
345+ sent_len_total += sent_len;
346+ printf("send size %zu(%zu)/%zu\n", sent_len_total, sent_len, send_len);
285347 Sleep(100);
286348 }
287349 }
288350 else {
289- DispErrorStr(L"open()", e);
351+ DispErrorStr(L"write()", e);
290352 }
291353 free(send_data);
292354 break;
@@ -392,8 +454,18 @@
392454 }
393455 case 'D': {
394456 ope->ctrl(dev, OPEN_CONFIG_DIALOG);
457+ if (verbose) {
458+ DCB dcb;
459+ ope->ctrl(dev, GET_COM_DCB, &dcb);
460+ dumpDCB(&dcb);
461+ }
395462 break;
396463 }
464+ case 'v': {
465+ verbose = verbose ? false : true;
466+ printf("verbose %s\n", verbose?"on":"off");
467+ break;
468+ }
397469 case ':': {
398470 printf("\nsend mode\n");
399471 command_mode = false;
@@ -413,11 +485,11 @@
413485 else {
414486 if (state == STATE_OPEN) {
415487 char send_text[2];
416- size_t sended_len;
488+ size_t sent_len;
417489 send_text[0] = (char)c;
418- DWORD e = ope->write(dev, send_text, 1, &sended_len);
490+ DWORD e = ope->write(dev, send_text, 1, &sent_len);
419491 if (e == ERROR_SUCCESS) {
420- printf("send %02x, %zu byte\n", c, sended_len);
492+ printf("send %02x, %zu byte\n", c, sent_len);
421493 }
422494 else {
423495 DispErrorStr(L"write() error", e);
旧リポジトリブラウザで表示