質問編集履歴

3

追記

2019/08/28 15:15

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -49,6 +49,14 @@
49
49
  Arduino側で  **if (i > 10 || input[i] == '.') {**   に引っかからない、
50
50
 
51
51
  またはPython側で   **if (line[-1] == '.') : break**   に引っかからないのがネックなようです。
52
+
53
+
54
+
55
+
56
+
57
+
58
+
59
+ これでもダメなら何か他の方法を使ってみようと思います。
52
60
 
53
61
 
54
62
 

2

文を減らした

2019/08/28 15:15

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -2,225 +2,111 @@
2
2
 
3
3
  Python>Arduino>Pythonの相互に文字列のやり取りがしたいです。
4
4
 
5
- 試しにPythonで作ったランダムな数字をArduinoで2分の1して、結果をPythonに返すプログラムを書いていますがうまくいきません。
5
+ 試しにPythonで作ったランダムな数字をArduinoで~~2分の1~~して、結果をPythonに返すプログラムを書いていますがうまくいきません。
6
6
 
7
7
 
8
8
 
9
- 送信する文字列は、
9
+ ~~送信する文字列は、
10
10
 
11
11
  Python:"Pyランダム数字" > Arduino:"Ardランダム数字/2" > Python
12
12
 
13
- です。
13
+ です。~~
14
14
 
15
- ※このあと複雑なやり取りに応用したいので、どうしても"Py *** "、 "Ard *** "の文字列で送受信したいです。
15
+ ※このあと複雑なやり取りに応用したいので、どうしても"Py ** "、 "Ard ** "の文字列で送受信したいです。
16
16
 
17
17
 
18
18
 
19
- 訳あってtkinterに結果を出力しています。
19
+ ~~訳あってtkinterに結果を出力しています。~~
20
20
 
21
21
  宜しくお願いします。
22
22
 
23
23
 
24
24
 
25
- ### プログラム
25
+ ### 追記
26
+
27
+
28
+
29
+ **追記:かなり編集したので最初にupしてたプログラムを削除しました。**
30
+
31
+
32
+
33
+ 簡易的なものを作ってみましたがうまくいきませんでした。
34
+
35
+ Python>Arduino>Pythonで文字列をシリアル通信でオウム返しするプログラムです。
36
+
37
+
38
+
39
+
40
+
41
+ 受信側では1文字ずつ受け取るように変更し、
42
+
43
+ 終端文字を改行コードにしたり、 **.** にしたりいろいろ試しました。
44
+
45
+
46
+
47
+ 実行はできますが、ずっとループしているようで先に進めません。
48
+
49
+ Arduino側で  **if (i > 10 || input[i] == '.') {**   に引っかからない、
50
+
51
+ またはPython側で   **if (line[-1] == '.') : break**   に引っかからないのがネックなようです。
26
52
 
27
53
 
28
54
 
29
55
  ```Python3
30
56
 
31
-
32
-
33
-
34
-
35
- import tkinter as tk
36
-
37
57
  import serial
38
-
39
- import random
40
58
 
41
59
  import time
42
60
 
43
61
 
44
62
 
45
-
46
-
47
- class Frame(tk.Frame):
48
-
49
- def __init__(self, master=None) :
63
+ i = 1
50
-
51
- tk.Frame.__init__(self, master)
52
-
53
- self.master.title( "serial_test" )
54
64
 
55
65
 
56
66
 
57
- self.mainframe = tk.Frame(self, bg='gray')
67
+ ser = serial.Serial('COMポート',9600,timeout=None)
58
-
59
- self.mainframe.pack()
60
68
 
61
69
 
62
70
 
63
- self.text_frame_Py_send = tk.Frame(self.mainframe, bg='gray')
71
+ while True:
64
72
 
65
- self.text_frame_Py_send.grid(column=0, row=0, columnspan=1,rowspan=1)
73
+ #送信
66
74
 
67
- self.text_frame_Py_recieve = tk.Frame(self.mainframe, bg='gray')
75
+ data = str(i) + '.'
68
76
 
69
- self.text_frame_Py_recieve.grid(column=1, row=0, columnspan=1,rowspan=1)
77
+ flag=bytes(data,'utf-8')
70
78
 
71
- self.button_frame = tk.Frame(self.mainframe, bg='red')
79
+ ser.write(flag) #シリアル通信:送信
72
-
73
- self.button_frame.grid(column=0, row=1, columnspan=2,rowspan=1)
74
80
 
75
81
 
76
82
 
83
+ time.sleep(0.3) #必要か?
77
84
 
78
-
79
- ########################start_button#############################
80
-
81
- self.start_button = tk.Button(self.button_frame,
82
-
83
- text="START",command = self.start)
85
+ line = 'null' #whileとifで判定するための初期化
84
-
85
- self.start_button.pack()
86
86
 
87
87
 
88
88
 
89
- ######################text_frame_Py_send###########################
89
+ #受信
90
90
 
91
- self.label = tk.Label(self.text_frame_Py_send,text = 'Py_send')
91
+ while line is 'null' :
92
92
 
93
- self.label.pack(side=tk.TOP)
93
+ if (line[-1] == '.') : break
94
94
 
95
- # スクロールバー
95
+ line += ser.read()
96
96
 
97
- self.scrollbar = tk.Scrollbar(self.text_frame_Py_send)
97
+ print(line)
98
98
 
99
- self.scrollbar.pack(side=tk.RIGHT, fill="y")
99
+ line = line.decode('utf-8')
100
100
 
101
- # テキストボックス
101
+ line = line.replace('null', '')
102
102
 
103
- self.textField_Py_send = tk.Text(self.text_frame_Py_send,
103
+ line = line.replace('\r\n', '')
104
104
 
105
- width=40, height=40, bd=5, relief="groove",font=('consolas',9))
105
+ print(line)
106
106
 
107
- self.textField_Py_send.pack(side=tk.LEFT, padx=(10, 0), pady=(10, 10))
107
+ i += 1
108
108
 
109
- self.textField_Py_send["yscrollcommand"] = self.scrollbar.set
110
-
111
-
112
-
113
- ######################text_frame_Py_recieve###########################
114
-
115
- self.label = tk.Label(self.text_frame_Py_recieve,text = 'Py_recieve')
116
-
117
- self.label.pack(side=tk.TOP)
118
-
119
- # スクロールバー
120
-
121
- self.scrollbar = tk.Scrollbar(self.text_frame_Py_recieve)
122
-
123
- self.scrollbar.pack(side=tk.RIGHT, fill="y")
124
-
125
- # テキストボックス
126
-
127
- self.textField_Py_recieve = tk.Text(self.text_frame_Py_recieve,
128
-
129
- width=40, height=40, bd=5, relief="groove",font=('consolas',9))
130
-
131
- self.textField_Py_recieve.pack(side=tk.LEFT, padx=(10, 0), pady=(10, 10))
132
-
133
- self.textField_Py_recieve["yscrollcommand"] = self.scrollbar.set
134
-
135
-
136
-
137
-
138
-
139
-
140
-
141
- def start(self) :
142
-
143
-
144
-
145
- self.ser = serial.Serial('COMポート',9600,timeout=3) #シリアル通信開始
146
-
147
-
148
-
149
- i = 0
150
-
151
- #5回やり取りする
152
-
153
- while i<5 :
154
-
155
- #送信
156
-
157
- num = str(random.randint(100,1000))
158
-
159
- Py_send_str = 'Py' + num
160
-
161
- flag = bytes(Py_send_str,'utf-8')
162
-
163
- self.ser.write(flag) #生成した数字を送信
164
-
165
- time.sleep(1)
109
+ ser.close()
166
-
167
- print('1') #確認用
168
-
169
- #textフレームへ出力
170
-
171
- self.textField_Py_send.insert(tk.END, Py_send_str)
172
-
173
- self.textField_Py_recieve.insert(tk.END, '\r\n')
174
-
175
-
176
-
177
- #受信
178
-
179
- while True:
180
-
181
- line = self.ser.readline()
182
-
183
- line = line.decode('utf-8').replace('\r\n','')
184
-
185
- print('2') #確認用
186
-
187
- if line[:3] == "Ard" :
188
-
189
- print('3') #確認用
190
-
191
-            #textフレームへ出力
192
-
193
- self.textField_Py_recieve.insert(tk.END, line.replace("Ard",""))
194
-
195
- self.textField_Py_recieve.insert(tk.END, '\r\n')
196
-
197
- break
198
-
199
- else : time.sleep(1)
200
-
201
- time.sleep(1) #sec
202
-
203
- i += 1
204
-
205
-
206
-
207
- self.ser.close() #シリアル通信終了
208
-
209
- return
210
-
211
-
212
-
213
-
214
-
215
- if __name__ == '__main__':
216
-
217
- frame = Frame()
218
-
219
- frame.pack()
220
-
221
- frame.mainloop()
222
-
223
-
224
110
 
225
111
  ```
226
112
 
@@ -228,61 +114,13 @@
228
114
 
229
115
  ```Arduino
230
116
 
231
-
232
-
233
- #include <stdio.h>
117
+ #include <stdio.h>
234
118
 
235
119
 
236
120
 
237
- char data[30];
121
+ char input[10]; // 文字列格納用
238
122
 
239
-
240
-
241
- float serialRead(){
242
-
243
- int i = 0;
244
-
245
- // データ受信したとき
246
-
247
- while (true){
248
-
249
- if (Serial.available() > 2) {
250
-
251
- // 1文字ずつ読み込み
123
+ int i = 0; // 文字数のカウンタ
252
-
253
- do {
254
-
255
- while (true){
256
-
257
- data[i] = Serial.read();
258
-
259
- // 文字数が30以上 or 終端なら終了
260
-
261
- if (i > 30 || data[i] == '\0') { break; }
262
-
263
- else { i++; }
264
-
265
- }
266
-
267
- }while( ( (data[0] == "P") && (data[1] == "y") ) == false); //文字列の先頭がPyなら終了
268
-
269
- }
270
-
271
- }
272
-
273
- String s = data;
274
-
275
- s.replace("Py", "");
276
-
277
-
278
-
279
- float num = s.toFloat()/2;
280
-
281
-
282
-
283
- return num;
284
-
285
- }
286
124
 
287
125
 
288
126
 
@@ -292,30 +130,32 @@
292
130
 
293
131
  }
294
132
 
133
+
295
134
 
135
+ void loop() {
296
136
 
297
- void loop() {
137
+ // データ受信したとき
298
138
 
299
- //受信
139
+ if (Serial.available()) {
300
140
 
301
- float senddata = serialRead();
141
+ input[i] = Serial.read();
302
142
 
303
- //送信
143
+ // 文字数が10以上 or 末尾文字'.'
304
144
 
305
- Serial.println("Ard" + String(senddata));
145
+ if (i > 10 || input[i] == '.') {
306
146
 
307
- delay(1000);
147
+ // 末尾に終端文字の挿入
308
148
 
309
- }
149
+ input[i] = '\0';
310
150
 
151
+ Serial.write(input); // 受信文字列を送信
311
152
 
153
+ // カウンタの初期化
154
+
155
+ i = 0;
156
+
157
+ } else { i++; }
158
+
159
+ }
312
160
 
313
161
  ```
314
-
315
-
316
-
317
- ### エラー
318
-
319
- エラーはないですがずっとPythonプログラムの #受信 while True: の部分を繰り返しているようです。
320
-
321
- 他にも単純に文字列をオウム返しするプログラムなども書いてみましたが、うまくいかず、Arduinoから一文字も帰ってこなかったりしました。

1

タイトル

2019/08/28 15:12

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- Python>Arduino>Python
1
+ Python>Arduino>Pythonの相互シリアル通信
test CHANGED
File without changes