質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

1回答

1027閲覧

ArduinoとPC間のシリアル通信で、1度目は成功するが、連続でやると失敗する。

mokon

総合スコア16

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2022/09/19 09:06

編集2022/09/19 11:44

ArduinoとPCでシリアル通信を行っています。
目的は、「Arduinoにてdegitalreadした値を適切にPC側に送信する」です。
結論から書くと、一度目のデバッグではちゃんと通信ができますが、一旦停止し、初めからデバックをやり直すと「invalid literal for int() with base 10: ''」というエラーが返ってきます。問題がありそうな関数に関して以下に掲載いたします。

【Arduino側】

Arduino

1//心電計測関数 2void HRV_check(){ 3 int checkflag = 0; 4 char inputData; 5 6 while(1){ 7 //二分計測したら'0'が送られてくる 8 if(Serial.available() > 0){ 9 inputData = Serial.read(); 10 //データ受信 11 //ループ停止信号 12 if(inputData == '0'){ 13 break; 14 } 15 else if(inputData == '1'){ 16 checkflag = 1; 17 } 18 } 19 20 if(checkflag == 1){ 21 //心電読み込み 22 //データなし 23 if((digitalRead(10) == 1)||(digitalRead(11) == 1)){ 24 Serial.println('!'); 25 } 26 else{ 27 //心電情報送信 28 Serial.println(analogRead(A5)); 29 } 30 //1ms待機 31 delay(1); 32 } 33 } 34} 35 36void loop(){ 37 //シリアル信号受信 38 HRV_check(); 39 40 exit(0); 41}

【PC側】

python

1import serial 2from serial.tools import list_ports 3import time 4import numpy as np 5import matplotlib.pyplot as plt 6from biosppy.signals import ecg 7import pandas as pd 8import scipy 9 10#サンプリング周波数 11Fs = 512 12 13#心電計測時間(s) 14HR_calculate_time = 150 15 16if __name__ == "__main__": 17 main() 18 19#2分間心電を計測する関数 20#引数:Arduinoシリアルポート 21def HRV_check(ser): 22 #時間計測用 23 sum_time = 0 24 temp_time = 0 25 #心電計測用 26 hrv_data = [] 27 28 #PCからArduinoへ送る場合 29 ser.write(b'1') 30 #ser.write(moji.encode('utf-8')) 31 print("心電計測中") 32 33 while True: 34 temp_time = time.perf_counter() 35 ##################計測開始################## 36 #信号読み込み 37 val_arduino = ser.readline()#シリアル通信(PC⇔Arduino) 38 print(type(val_arduino)) 39 # val_decoded = float(repr(val_arduino.decode())[1:-5]) 40 val_decoded = val_arduino.strip().decode('UTF-8') 41 #心電情報表示 42 print(val_decoded) 43 44 #取得ミス時 45 if val_decoded == '!': 46 print(";;\n") 47 #配列がカラなら 0 48 if not hrv_data: 49 hrv_data.append(0) 50 #カラでないなら ひとつ前のデータを 51 else: 52 hrv_data.append(hrv_data[-1]) 53 #正常に取得できていれば配列に追加 54 else: 55 print("正常よ") 56 hrv_data.append(int(val_decoded)) 57 58 #################計測終了################### 59 #時間を加算していく 60 sum_time += (time.perf_counter() - temp_time) 61 #2分経過していたらループを抜ける 62 if sum_time > HR_calculate_time: 63 ser.write(b'0') 64 break 65 66def main(): 67 ser = select_port(baudrate = 9600) 68 print("Arduino読み込み") 69 #PC→Arduino 70 #e:終了 71 #s:HRV計測スタート 72 73 ####心電計測フェイズ#### 74 while(1): 75 #心電計測 76 input1 = input("まず初めに、2分間心電を計測します。\nokと入力すると、10秒後に計測が開始されます。") 77 78 if input1 == "ok": 79 "心電計測開始" 80 HRV_check(ser) 81 break; 82 else: print("入力が適切でありません。") 83 #################### 84 ser.close() 85

試したこと
単純にArduinoからdegitalreadした信号をprintlnにて送信する → 動作する。
Selial.available() > 0 から Selial.read()で’1’(計測スタートフラグ)がPC側から送信されたならばー
というコードをかませた際に前述のエラーコードが発生する。
(Arduino側のPCからの信号確認がない場合、ある程度正常に動作する。(たまに文字化けあり))

PC側で''が送られてきた際にスルーするコードを書いても、すべて''であり、そもそもdegitalread()された数値が送られてこなかったので、根本的な解決にならなかった。

Arduinoのシリアルモニタでは適切なdegitalreadの値が出力されていた。

完全に手詰まりです、どなたかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2022/09/19 09:22

それと、特に理由がないのならコードの省略等行わないでください(問題を解決できていない方に適切な省略はできないものと思います)。 実際に走らせているコードと違うところがあるなら明記してください。
thkana

2022/09/19 09:36

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12268279212 以下のルールに対応してください。 https://teratail.com/help#posted-otherservice 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。 また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」
thkana

2022/09/19 09:39

なお、ここは「質問への追記・修正の依頼」の欄です。質問内容の変更は、質問自体を修正・追記してください。
y_waiwai

2022/09/19 10:49

このままではコードが読みづらいので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください また、エラーが出たなら、エラーメッセージを提示しましょう エラーメッセージは、よけいな省略翻訳しないで出たそのママをコピペで提示してください
guest

回答1

0

自己解決

初質問でいろいろ指摘してくださった方ありがとうございます。

serial.open()の後にtime.sleep(1.5)をかまして再起動

これを行った後からエラーをはかなくなりました。

投稿2022/09/19 12:34

mokon

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2022/09/21 21:53

質問のコードに`serial.open()`が見当たりませんが?
mokon

2022/09/22 04:35

ポートを選択する関数を別で用意しておりまして、そこにopen()がございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問