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

回答編集履歴

2

追記

2019/08/29 15:33

投稿

退会済みユーザー
answer CHANGED
@@ -1,91 +1,85 @@
1
1
  皆さんの意見を参考にしながら細かいところまでいじくってたらできました。
2
2
  Python側でシリアルポートを開いた後、**time.sleep(3)**するのもミソだったようです。
3
3
 
4
- しかし空の文字列が帰ってきているのか、受信漏れがあり、さらに改善していこうと思います。
4
+ しかし空の文字列が帰ってきているのか、~~受信漏れがあり~~、さらに改善していこうと思います。
5
5
  ありがとうございました!
6
6
 
7
- 以下プログラムと実行結果
7
+ ~~以下プログラムと実行結果~~
8
+
9
+ **追記**
10
+ <改良版(受信漏れなし)>
11
+ (Python) "Py(数字)" > (Arduino) "Ard(数字)" > (Python) 表示
12
+
8
- ```Python3
13
+ ```Python
9
- #Arduinoから文字列を受信
10
14
  import serial
11
15
  import time
12
16
 
13
17
  i = 1 #送信する文字
14
- ser = serial.Serial('COM5',9600,timeout=None)
18
+ ser = serial.Serial('COMポート',9600,timeout=None)
15
- time.sleep(3) #これが無いと上手くいかない
19
+ time.sleep(3)
16
-
17
20
  while True:
18
21
  #送信
19
- time.sleep(1)
20
- data = str(i) + '.' #終端文字
22
+ data = 'Py' + str(i) + '.' #終端文字
21
23
  flag=bytes(data,'utf-8')
22
24
  ser.write(flag)
23
25
  print(data , flag) #確認用
24
26
 
25
27
  time.sleep(1) #必要か?
26
- line = 'null' #whileとifで判定するための初期化
28
+ line = 'null'
27
-
29
+
28
30
  #受信
29
- while line is 'null':
30
- if (line[-2:] == '.\n') : break
31
+ while not ('.\n' in line):
31
- temp = ser.read()
32
+ temp = ser.readline()
32
- temp = temp.decode('utf-8') #lineに格納する前にdecode
33
+ temp = temp.decode('utf-8')
33
- line += temp
34
+ line = line + temp
34
- print(line) #確認用
35
35
  line = line.replace('null', '')
36
- line = line.splitlines() #余分な改行は取り除く
36
+ line = line.rstrip('\n') #余分な改行は取り除く
37
37
  print(line) #確認用
38
38
 
39
39
  i += 1
40
40
 
41
41
  ser.close()
42
+ ```
42
43
 
43
- ```
44
44
  ```Arduino
45
- //void loopより下
45
+ #include <stdio.h>
46
+
47
+ char input[30]; // 受信文字列格納
48
+ char sendata[30]; // 送信文字列格納
49
+ int i = 0; // 文字数のカウンタ
50
+
51
+ void setup() {
52
+ Serial.begin(9600);
53
+ }
54
+
46
55
  void loop() {
47
- // データ受信したとき
48
56
  if (Serial.available()) {
49
57
  input[i] = Serial.read();
50
58
  // 文字数が10以上 or 末尾文字'.'
51
- if (i > 10 || input[i] == '.') {
59
+ if (i > 30 || input[i] == '.') {
52
60
  // 末尾に終端文字の挿入
53
61
  input[i+1] = '\0';
62
+ String tmp = input; //replaceするために1度str型に
63
+ tmp.replace("Py" , "Ard");
54
- Serial.write(input);
64
+ tmp.toCharArray( sendata , tmp.length() ) ;
55
- Serial.write("\n");
65
+ Serial.write(sendata); //送信
66
+ Serial.write(".\n"); //何故か受信した.が消える謎
56
67
  // カウンタの初期化
57
68
  i = 0;
58
- bytenum++;
59
69
  } else { i++; }
60
70
  // 受信文字列を送信
61
71
  }
62
72
  }
63
-
64
73
  ```
65
74
  ```jikkoukekka
66
- 1. b'1.'
75
+ Py1. b'Py1.'
67
- null1
76
+ Ard1.
68
- ['1']
69
- 2. b'2.'
77
+ Py2. b'Py2.'
70
- null.
78
+ Ard2.
71
- ['.']
72
- 3. b'3.'
79
+ Py3. b'Py3.'
73
- null
80
+ Ard3.
74
-
75
- ['']
76
- 4. b'4.'
81
+ Py4. b'Py4.'
77
- null2
82
+ Ard4.
78
- ['2']
79
- 5. b'5.'
83
+ Py5. b'Py5.'
80
- null.
84
+ Ard5.
81
- ['.']
82
- 6. b'6.'
83
- null
84
-
85
- ['']
86
- 7. b'7.'
87
- null3
88
- ['3']
89
- 8. b'8.'
90
-
91
85
  ```

1

修正

2019/08/29 15:33

投稿

退会済みユーザー
answer CHANGED
@@ -45,7 +45,7 @@
45
45
  //void loopより下
46
46
  void loop() {
47
47
  // データ受信したとき
48
- if (Serial.available() > bytenum) {
48
+ if (Serial.available()) {
49
49
  input[i] = Serial.read();
50
50
  // 文字数が10以上 or 末尾文字'.'
51
51
  if (i > 10 || input[i] == '.') {