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

質問編集履歴

3

追記

2019/08/28 15:15

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -25,6 +25,10 @@
25
25
  Arduino側で  **if (i > 10 || input[i] == '.') {**   に引っかからない、
26
26
  またはPython側で   **if (line[-1] == '.') : break**   に引っかからないのがネックなようです。
27
27
 
28
+
29
+
30
+ これでもダメなら何か他の方法を使ってみようと思います。
31
+
28
32
  ```Python3
29
33
  import serial
30
34
  import time

2

文を減らした

2019/08/28 15:15

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -1,161 +1,81 @@
1
1
  ### やりたいこと
2
2
  Python>Arduino>Pythonの相互に文字列のやり取りがしたいです。
3
- 試しにPythonで作ったランダムな数字をArduinoで2分の1して、結果をPythonに返すプログラムを書いていますがうまくいきません。
3
+ 試しにPythonで作ったランダムな数字をArduinoで~~2分の1~~して、結果をPythonに返すプログラムを書いていますがうまくいきません。
4
4
 
5
- 送信する文字列は、
5
+ ~~送信する文字列は、
6
6
  Python:"Pyランダム数字" > Arduino:"Ardランダム数字/2" > Python
7
- です。
7
+ です。~~
8
- ※このあと複雑なやり取りに応用したいので、どうしても"Py *** "、 "Ard *** "の文字列で送受信したいです。
8
+ ※このあと複雑なやり取りに応用したいので、どうしても"Py ** "、 "Ard ** "の文字列で送受信したいです。
9
9
 
10
- 訳あってtkinterに結果を出力しています。
10
+ ~~訳あってtkinterに結果を出力しています。~~
11
11
  宜しくお願いします。
12
12
 
13
- ### プログラム
13
+ ### 追記
14
14
 
15
- ```Python3
15
+ **追記:かなり編集したので最初にupしてたプログラムを削除しました。**
16
16
 
17
+ 簡易的なものを作ってみましたがうまくいきませんでした。
18
+ Python>Arduino>Pythonで文字列をシリアル通信でオウム返しするプログラムです。
17
19
 
18
- import tkinter as tk
19
- import serial
20
- import random
21
- import time
22
20
 
21
+ 受信側では1文字ずつ受け取るように変更し、
22
+ 終端文字を改行コードにしたり、 **.** にしたりいろいろ試しました。
23
23
 
24
- class Frame(tk.Frame):
25
- def __init__(self, master=None) :
26
- tk.Frame.__init__(self, master)
24
+ 実行はできますが、ずっとループしているようで先に進めません。
27
- self.master.title( "serial_test" )
25
+ Arduino側で  **if (i > 10 || input[i] == '.') {**   に引っかからない、
26
+ またはPython側で   **if (line[-1] == '.') : break**   に引っかからないのがネックなようです。
28
27
 
29
- self.mainframe = tk.Frame(self, bg='gray')
28
+ ```Python3
30
- self.mainframe.pack()
29
+ import serial
30
+ import time
31
31
 
32
- self.text_frame_Py_send = tk.Frame(self.mainframe, bg='gray')
33
- self.text_frame_Py_send.grid(column=0, row=0, columnspan=1,rowspan=1)
34
- self.text_frame_Py_recieve = tk.Frame(self.mainframe, bg='gray')
35
- self.text_frame_Py_recieve.grid(column=1, row=0, columnspan=1,rowspan=1)
36
- self.button_frame = tk.Frame(self.mainframe, bg='red')
37
- self.button_frame.grid(column=0, row=1, columnspan=2,rowspan=1)
32
+ i = 1
38
33
 
34
+ ser = serial.Serial('COMポート',9600,timeout=None)
39
35
 
36
+ while True:
37
+ #送信
40
- ########################start_button#############################
38
+ data = str(i) + '.'
41
- self.start_button = tk.Button(self.button_frame,
39
+ flag=bytes(data,'utf-8')
42
- text="START",command = self.start)
43
- self.start_button.pack()
40
+ ser.write(flag) #シリアル通信:送信
44
41
 
45
- ######################text_frame_Py_send###########################
46
- self.label = tk.Label(self.text_frame_Py_send,text = 'Py_send')
47
- self.label.pack(side=tk.TOP)
42
+ time.sleep(0.3) #必要か?
48
- # スクロールバー
49
- self.scrollbar = tk.Scrollbar(self.text_frame_Py_send)
50
- self.scrollbar.pack(side=tk.RIGHT, fill="y")
51
- # テキストボックス
52
- self.textField_Py_send = tk.Text(self.text_frame_Py_send,
43
+ line = 'null' #whileとifで判定するための初期化
53
- width=40, height=40, bd=5, relief="groove",font=('consolas',9))
54
- self.textField_Py_send.pack(side=tk.LEFT, padx=(10, 0), pady=(10, 10))
55
- self.textField_Py_send["yscrollcommand"] = self.scrollbar.set
56
44
 
57
- ######################text_frame_Py_recieve###########################
58
- self.label = tk.Label(self.text_frame_Py_recieve,text = 'Py_recieve')
59
- self.label.pack(side=tk.TOP)
60
- # スクロールバー
61
- self.scrollbar = tk.Scrollbar(self.text_frame_Py_recieve)
62
- self.scrollbar.pack(side=tk.RIGHT, fill="y")
63
- # テキストボックス
64
- self.textField_Py_recieve = tk.Text(self.text_frame_Py_recieve,
65
- width=40, height=40, bd=5, relief="groove",font=('consolas',9))
66
- self.textField_Py_recieve.pack(side=tk.LEFT, padx=(10, 0), pady=(10, 10))
67
- self.textField_Py_recieve["yscrollcommand"] = self.scrollbar.set
68
-
69
-
70
-
71
- def start(self) :
72
-
73
- self.ser = serial.Serial('COMポート',9600,timeout=3) #シリアル通信開始
74
-
75
- i = 0
76
- #5回やり取りする
77
- while i<5 :
78
- #送信
79
- num = str(random.randint(100,1000))
80
- Py_send_str = 'Py' + num
81
- flag = bytes(Py_send_str,'utf-8')
82
- self.ser.write(flag) #生成した数字を送信
83
- time.sleep(1)
84
- print('1') #確認用
85
- #textフレームへ出力
86
- self.textField_Py_send.insert(tk.END, Py_send_str)
87
- self.textField_Py_recieve.insert(tk.END, '\r\n')
88
-
89
- #受信
45
+ #受信
90
- while True:
46
+ while line is 'null' :
47
+ if (line[-1] == '.') : break
91
- line = self.ser.readline()
48
+ line += ser.read()
49
+ print(line)
50
+ line = line.decode('utf-8')
51
+ line = line.replace('null', '')
92
- line = line.decode('utf-8').replace('\r\n','')
52
+ line = line.replace('\r\n', '')
93
- print('2') #確認用
94
- if line[:3] == "Ard" :
95
- print('3') #確認用
96
-            #textフレームへ出力
53
+ print(line)
97
- self.textField_Py_recieve.insert(tk.END, line.replace("Ard",""))
98
- self.textField_Py_recieve.insert(tk.END, '\r\n')
99
- break
100
- else : time.sleep(1)
101
- time.sleep(1) #sec
102
- i += 1
54
+ i += 1
103
-
104
- self.ser.close() #シリアル通信終了
105
- return
106
-
107
-
108
- if __name__ == '__main__':
109
- frame = Frame()
110
- frame.pack()
111
- frame.mainloop()
55
+ ser.close()
112
-
113
56
  ```
114
57
 
115
58
  ```Arduino
59
+ #include <stdio.h>
116
60
 
61
+ char input[10]; // 文字列格納用
117
- #include <stdio.h>
62
+ int i = 0; // 文字数のカウンタ
118
63
 
119
- char data[30];
120
-
121
- float serialRead(){
122
- int i = 0;
123
- // データ受信したとき
124
- while (true){
125
- if (Serial.available() > 2) {
126
- // 1文字ずつ読み込み
127
- do {
128
- while (true){
129
- data[i] = Serial.read();
130
- // 文字数が30以上 or 終端なら終了
131
- if (i > 30 || data[i] == '\0') { break; }
132
- else { i++; }
133
- }
134
- }while( ( (data[0] == "P") && (data[1] == "y") ) == false); //文字列の先頭がPyなら終了
135
- }
136
- }
137
- String s = data;
138
- s.replace("Py", "");
139
-
140
- float num = s.toFloat()/2;
141
-
142
- return num;
143
- }
144
-
145
64
  void setup() {
146
65
  Serial.begin(9600);
147
66
  }
148
-
67
+
149
- void loop() {
68
+ void loop() {
150
- //受信
69
+ // データ受信したとき
70
+ if (Serial.available()) {
151
- float senddata = serialRead();
71
+ input[i] = Serial.read();
72
+ // 文字数が10以上 or 末尾文字'.'
73
+ if (i > 10 || input[i] == '.') {
74
+ // 末尾に終端文字の挿入
75
+ input[i] = '\0';
76
+ Serial.write(input); // 受信文字列を送信
152
- //送信
77
+ // カウンタの初期化
153
- Serial.println("Ard" + String(senddata));
78
+ i = 0;
154
- delay(1000);
79
+ } else { i++; }
155
- }
80
+ }
156
-
157
- ```
81
+ ```
158
-
159
- ### エラー
160
- エラーはないですがずっとPythonプログラムの #受信 while True: の部分を繰り返しているようです。
161
- 他にも単純に文字列をオウム返しするプログラムなども書いてみましたが、うまくいかず、Arduinoから一文字も帰ってこなかったりしました。

1

タイトル

2019/08/28 15:12

投稿

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