質問: ### 前提・実現したいこと pythonを使って、Arduinoとシリアル通信がしたい ### 発生している問題・エラーメッセージ シリアル通信のタイムアウト時間を1秒未満に設定すると上手く通信できない。 serial.readline()で返ってくるデータが空のみ。 ### 該当のソースコード ``` import serial def serial_get(comm,check,Next): #serial_get(送信するコマンド、返ってくるコマンド、次のフェイズ番号) global fase #フェイズ番号 global err #エラーカウント ser.write(bytes(comm)) #コマンド送信 read=ser.readline() #コマンド受信 while read: print('read=',read,end='') #受信データ表示 """ 受信データ比較 """ if((check in read)==True): #受信成功 err=0 #エラーカウントリセット fase=Next #フェイズ進行 return True #受信成功 elif (('err' in read)==True): #エラーが返ってきたら err=0 fase=2 return 'error' else: #受信失敗 err+=1 #エラーカウント増加 if fase==0 and err>=100 : #エラーカウント既定値到達 err=0 #エラーカウントリセット fase=2 #フェイズを飛ばす return False #受信失敗 read=ser.readline() #コマンド受信 with serial.Serial('COM3',9600,timeout=1) as ser: #シリアル通信設定。ポートCOM3、通信速度9600、タイムアウト最大1秒 while fase==0: #開始信号待ち serial_fase=serial_get('start/','ok',1) #arduino待ち if(serial_fase==True): #arduinoから応答があった print('ok start...\n') break; elif(serial_fase==False): #arduinoから応答がなかった print('\n 1st error\n') break; (以下略) ``` Arduino側のソースコードは以下のコードです。 ``` char data[128]; int count=0; float a[4]; char*tp; int flag=0; int i; void reset_arr(); void setup() { // put your setup code here, to run once: Serial.begin(9600); memset(data,'\0',128); } void loop() { // put your main code here, to run repeatedly: while (Serial.available() > 0){ data[count]=Serial.read(); if(data[count]=='/' || data[count]=='\0'){ data[count]='\0'; count=0; break; } else if(count>=127){ count=0; break; } else { count++; } delayMicroseconds(1025); //1.025[ms] } if( (strstr(data,"start")) != NULL){ Serial.println("ok go"); flag=1; reset_arr(); } else if( (strstr(data,",")) != NULL){ for(i=0;i<4;i++){ if(i==0){ a[i]=atof( strtok(data,",") ); } else { a[i]=atof( strtok(NULL,",") ); } Serial.println(a[i]); } Serial.println("end"); flag=0; reset_arr(); } else if(data[0]!='\0'){ Serial.println("error"); reset_arr(); } } void reset_arr(){ for(i=0;i
回答: すみません。 pythonのserialモジュールでの正しい通信方法(blocking)について以前調査したのですが 結局正解が見つかりませんでした。 「こうすればいけるかも」という程度で参考にしてください。 ``` # 方法1 : 私が使っているコード data = ser.read(1) n = ser.inWaiting() if n: data = data + ser.read(n) # 方法2 : 公式サンプル miniterm での例 # https://github.com/pyserial/pyserial/blob/master/serial/tools/miniterm.py data = ser.read(ser.in_waiting or 1) # 方法3 : 末尾"\r\n"あるので、単純に以下でよいかも data = ser.readline() ``` 識者の回答を待ちたいと思います。