回答編集履歴

1

回答の追記

2020/01/20 10:45

投稿

t_obara
t_obara

スコア5488

test CHANGED
@@ -13,3 +13,111 @@
13
13
 
14
14
 
15
15
  ```
16
+
17
+
18
+
19
+ ----
20
+
21
+ 追記 -->
22
+
23
+
24
+
25
+ コメント内容から、こちらの想定と違ったのかと思ったのですが、その後にベストアンサーとなったので、一応補足しておきます。
26
+
27
+
28
+
29
+ 当初のコードでは、stopメソッドを呼び出すと、すぐにserをクローズしています。その後にスレッドの終了待ちを行なっているため、serクローズ直後に読み出したデータが不正データになるのではないかと思いました。
30
+
31
+ これを、きちんとデータを読み終え、スレッドが終了するのを待ってから、serをクローズ、rootをdestroyすればと思った次第です。
32
+
33
+ ただ、serクローズ状態でデータを読もうとすると、例外が発生するかもしれず、今回のような状況になるのかはわからなかったので、まずは試していただいた方がと考えました。
34
+
35
+ なんとなく複合的な要因のようにも思いますが、本問題だけでなく、スレッド処理の際には、タイミングについても気をつけた方が良いという点を認識して貰えたらと思い、追記しました。
36
+
37
+
38
+
39
+ ```python
40
+
41
+ # original code
42
+
43
+ def stop():
44
+
45
+ global stop_flag
46
+
47
+ global thread
48
+
49
+
50
+
51
+ ser.close()
52
+
53
+ root.destroy()
54
+
55
+
56
+
57
+ # スレッドがある場合停止してjoin()する
58
+
59
+ if thread:
60
+
61
+ stop_flag = True
62
+
63
+ thread.join()
64
+
65
+ thread = None
66
+
67
+ ```
68
+
69
+
70
+
71
+ ```python
72
+
73
+ # modified code
74
+
75
+ def stop():
76
+
77
+ global stop_flag
78
+
79
+ global thread
80
+
81
+
82
+
83
+ # スレッドがある場合停止してjoin()する
84
+
85
+ if thread:
86
+
87
+ stop_flag = True
88
+
89
+ thread.join()
90
+
91
+ thread = None
92
+
93
+
94
+
95
+ ser.close()
96
+
97
+ root.destroy()
98
+
99
+ ```
100
+
101
+
102
+
103
+ また、シリアルからのデータ読み込みの際に、以下のようにバイト列を文字列にしていますが、
104
+
105
+ ```python
106
+
107
+ line = ser.readline().rstrip()
108
+
109
+ s_line = str(line) #文字列化
110
+
111
+ w_line = s_line.strip("b'") #受信文字から"b、'"を削除
112
+
113
+ ```
114
+
115
+ python3の場合は、以下のようにした方がよろしいかと思います。
116
+
117
+ ```python3
118
+
119
+ line = ser.readline().rstrip()
120
+
121
+ w_line = line.decode() # あるいは w_line = line.decode('utf-8')
122
+
123
+ ```