回答編集履歴

2 追記

NNS333

NNS333 score 23

2019/08/30 00:33  投稿

皆さんの意見を参考にしながら細かいところまでいじくってたらできました。
Python側でシリアルポートを開いた後、**time.sleep(3)**するのもミソだったようです。
しかし空の文字列が帰ってきているのか、受信漏れがあり、さらに改善していこうと思います。
しかし空の文字列が帰ってきているのか、~~受信漏れがあり~~、さらに改善していこうと思います。
ありがとうございました!
以下プログラムと実行結果
```Python3
#Arduinoから文字列を受信
~~以下プログラムと実行結果~~
**追記**
<改良版(受信漏れなし)>
(Python) "Py(数字)" > (Arduino) "Ard(数字)" > (Python) 表示
```Python
import serial
import time
i = 1 #送信する文字
ser = serial.Serial('COM5',9600,timeout=None)
time.sleep(3)    #これが無いと上手くいかない
ser = serial.Serial('COMポート',9600,timeout=None)
time.sleep(3)
while True:
   #送信
   time.sleep(1)
   data = str(i) + '.'    #終端文字
   data = 'Py' + str(i) + '.'    #終端文字
   flag=bytes(data,'utf-8')
   ser.write(flag)
   print(data , flag) #確認用
   time.sleep(1) #必要か?
   line = 'null' #whileとifで判定するための初期化
   line = 'null'
   
   #受信
   while line is 'null':
       if (line[-2:] == '.\n') : break
       temp = ser.read()
       temp = temp.decode('utf-8') #lineに格納する前にdecode
       line += temp
   print(line)  #確認用
   while not ('.\n' in line):
       temp = ser.readline()
       temp = temp.decode('utf-8')
       line = line + temp
   line = line.replace('null', '')
   line = line.splitlines()    #余分な改行は取り除く
   line = line.rstrip('\n')   #余分な改行は取り除く
   print(line)  #確認用
   i += 1
ser.close()
```  
```  
```Arduino
//void loopより下
#include <stdio.h>
char input[30];    // 受信文字列格納
char sendata[30];  // 送信文字列格納
int i = 0;         // 文字数のカウンタ
void setup() {
 Serial.begin(9600);
}
void loop() {
 // データ受信したとき  
 if (Serial.available()) {
   input[i] = Serial.read();
    // 文字数が10以上 or 末尾文字'.'
   if (i > 10 || input[i] == '.') {
   if (i > 30 || input[i] == '.') {
     // 末尾に終端文字の挿入
     input[i+1] = '\0';
     Serial.write(input);
     Serial.write("\n");
     String tmp = input;        //replaceするために1度str型に
     tmp.replace("Py" , "Ard");
     tmp.toCharArray( sendata , tmp.length() ) ; 
     Serial.write(sendata);   //送信
     Serial.write(".\n");     //何故か受信した.が消える謎
     // カウンタの初期化
     i = 0;
     bytenum++;  
   } else { i++; }
   // 受信文字列を送信
 }
}
 
```
```jikkoukekka
1. b'1.'
null1
['1']
2. b'2.'
null.
['.']
3. b'3.'
null
['']
4. b'4.'
null2
['2']
5. b'5.'
null.
['.']
6. b'6.'
null
['']
7. b'7.'
null3
['3']
8. b'8.'
Py1. b'Py1.'
Ard1.
Py2. b'Py2.'
Ard2.
Py3. b'Py3.'
Ard3.
Py4. b'Py4.'
Ard4.
Py5. b'Py5.'
Ard5.
```
1 修正

NNS333

NNS333 score 23

2019/08/29 22:11  投稿

皆さんの意見を参考にしながら細かいところまでいじくってたらできました。
Python側でシリアルポートを開いた後、**time.sleep(3)**するのもミソだったようです。
しかし空の文字列が帰ってきているのか、受信漏れがあり、さらに改善していこうと思います。
ありがとうございました!
以下プログラムと実行結果
```Python3
#Arduinoから文字列を受信
import serial
import time
i = 1 #送信する文字
ser = serial.Serial('COM5',9600,timeout=None)
time.sleep(3)    #これが無いと上手くいかない
while True:
   #送信
   time.sleep(1)
   data = str(i) + '.'    #終端文字
   flag=bytes(data,'utf-8')
   ser.write(flag)
   print(data , flag) #確認用
   time.sleep(1) #必要か?
   line = 'null' #whileとifで判定するための初期化
   #受信
   while line is 'null':
       if (line[-2:] == '.\n') : break
       temp = ser.read()
       temp = temp.decode('utf-8') #lineに格納する前にdecode
       line += temp
   print(line)  #確認用
   line = line.replace('null', '')
   line = line.splitlines()    #余分な改行は取り除く
   print(line)  #確認用
   i += 1
ser.close()
```
```Arduino
//void loopより下
void loop() {
 // データ受信したとき
 if (Serial.available() > bytenum) {
 if (Serial.available()) {
   input[i] = Serial.read();
    // 文字数が10以上 or 末尾文字'.'
   if (i > 10 || input[i] == '.') {
     // 末尾に終端文字の挿入
     input[i+1] = '\0';
     Serial.write(input);
     Serial.write("\n");
     // カウンタの初期化
     i = 0;
     bytenum++;
   } else { i++; }
   // 受信文字列を送信
 }
}
```
```jikkoukekka
1. b'1.'
null1
['1']
2. b'2.'
null.
['.']
3. b'3.'
null
['']
4. b'4.'
null2
['2']
5. b'5.'
null.
['.']
6. b'6.'
null
['']
7. b'7.'
null3
['3']
8. b'8.'
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る