回答編集履歴

2

追記

2019/08/29 15:33

投稿

退会済みユーザー
test CHANGED
@@ -4,17 +4,25 @@
4
4
 
5
5
 
6
6
 
7
- しかし空の文字列が帰ってきているのか、受信漏れがあり、さらに改善していこうと思います。
7
+ しかし空の文字列が帰ってきているのか、~~受信漏れがあり~~、さらに改善していこうと思います。
8
8
 
9
9
  ありがとうございました!
10
10
 
11
11
 
12
12
 
13
- 以下プログラムと実行結果
13
+ ~~以下プログラムと実行結果~~
14
14
 
15
- ```Python3
16
15
 
16
+
17
+ **追記**
18
+
17
- #Arduinoから文字列を受信
19
+ <改良版(受信漏れなし)>
20
+
21
+ (Python) "Py(数字)" > (Arduino) "Ard(数字)" > (Python) 表示
22
+
23
+
24
+
25
+ ```Python
18
26
 
19
27
  import serial
20
28
 
@@ -24,19 +32,15 @@
24
32
 
25
33
  i = 1 #送信する文字
26
34
 
27
- ser = serial.Serial('COM5',9600,timeout=None)
35
+ ser = serial.Serial('COMポート',9600,timeout=None)
28
36
 
29
- time.sleep(3) #これが無いと上手くいかない
37
+ time.sleep(3)
30
-
31
-
32
38
 
33
39
  while True:
34
40
 
35
41
  #送信
36
42
 
37
- time.sleep(1)
38
-
39
- data = str(i) + '.' #終端文字
43
+ data = 'Py' + str(i) + '.' #終端文字
40
44
 
41
45
  flag=bytes(data,'utf-8')
42
46
 
@@ -48,27 +52,23 @@
48
52
 
49
53
  time.sleep(1) #必要か?
50
54
 
51
- line = 'null' #whileとifで判定するための初期化
55
+ line = 'null'
52
56
 
53
-
57
+
54
58
 
55
59
  #受信
56
60
 
57
- while line is 'null':
61
+ while not ('.\n' in line):
58
62
 
59
- if (line[-2:] == '.\n') : break
63
+ temp = ser.readline()
60
64
 
61
- temp = ser.read()
65
+ temp = temp.decode('utf-8')
62
66
 
63
- temp = temp.decode('utf-8') #lineに格納する前にdecode
64
-
65
- line += temp
67
+ line = line + temp
66
-
67
- print(line) #確認用
68
68
 
69
69
  line = line.replace('null', '')
70
70
 
71
- line = line.splitlines() #余分な改行は取り除く
71
+ line = line.rstrip('\n') #余分な改行は取り除く
72
72
 
73
73
  print(line) #確認用
74
74
 
@@ -80,17 +80,33 @@
80
80
 
81
81
  ser.close()
82
82
 
83
+ ```
83
84
 
84
85
 
85
- ```
86
86
 
87
87
  ```Arduino
88
88
 
89
- //void loopより下
89
+ #include <stdio.h>
90
+
91
+
92
+
93
+ char input[30]; // 受信文字列格納
94
+
95
+ char sendata[30]; // 送信文字列格納
96
+
97
+ int i = 0; // 文字数のカウンタ
98
+
99
+
100
+
101
+ void setup() {
102
+
103
+ Serial.begin(9600);
104
+
105
+ }
106
+
107
+
90
108
 
91
109
  void loop() {
92
-
93
- // データ受信したとき
94
110
 
95
111
  if (Serial.available()) {
96
112
 
@@ -98,21 +114,25 @@
98
114
 
99
115
  // 文字数が10以上 or 末尾文字'.'
100
116
 
101
- if (i > 10 || input[i] == '.') {
117
+ if (i > 30 || input[i] == '.') {
102
118
 
103
119
  // 末尾に終端文字の挿入
104
120
 
105
121
  input[i+1] = '\0';
106
122
 
107
- Serial.write(input);
123
+ String tmp = input; //replaceするために1度str型に
108
124
 
125
+ tmp.replace("Py" , "Ard");
126
+
127
+ tmp.toCharArray( sendata , tmp.length() ) ;
128
+
109
- Serial.write("\n");
129
+ Serial.write(sendata); //送信
130
+
131
+ Serial.write(".\n"); //何故か受信した.が消える謎
110
132
 
111
133
  // カウンタの初期化
112
134
 
113
135
  i = 0;
114
-
115
- bytenum++;
116
136
 
117
137
  } else { i++; }
118
138
 
@@ -122,60 +142,28 @@
122
142
 
123
143
  }
124
144
 
125
-
126
-
127
145
  ```
128
146
 
129
147
  ```jikkoukekka
130
148
 
131
- 1. b'1.'
149
+ Py1. b'Py1.'
132
150
 
133
- null1
151
+ Ard1.
134
152
 
135
- ['1']
153
+ Py2. b'Py2.'
136
154
 
137
- 2. b'2.'
155
+ Ard2.
138
156
 
139
- null.
157
+ Py3. b'Py3.'
140
158
 
141
- ['.']
159
+ Ard3.
142
160
 
143
- 3. b'3.'
161
+ Py4. b'Py4.'
144
162
 
145
- null
163
+ Ard4.
146
164
 
165
+ Py5. b'Py5.'
147
166
 
148
-
149
- ['']
150
-
151
- 4. b'4.'
152
-
153
- null2
154
-
155
- ['2']
156
-
157
- 5. b'5.'
158
-
159
- null.
167
+ Ard5.
160
-
161
- ['.']
162
-
163
- 6. b'6.'
164
-
165
- null
166
-
167
-
168
-
169
- ['']
170
-
171
- 7. b'7.'
172
-
173
- null3
174
-
175
- ['3']
176
-
177
- 8. b'8.'
178
-
179
-
180
168
 
181
169
  ```

1

修正

2019/08/29 15:33

投稿

退会済みユーザー
test CHANGED
@@ -92,7 +92,7 @@
92
92
 
93
93
  // データ受信したとき
94
94
 
95
- if (Serial.available() > bytenum) {
95
+ if (Serial.available()) {
96
96
 
97
97
  input[i] = Serial.read();
98
98