###前提・実現したいこと
pythonを使って、Arduinoとシリアル通信がしたい
###発生している問題・エラーメッセージ
シリアル通信のタイムアウト時間を1秒未満に設定すると上手く通信できない。
serial.readline()で返ってくるデータが空のみ。
###該当のソースコード
python
1import serial 2 3def serial_get(comm,check,Next): #serial_get(送信するコマンド、返ってくるコマンド、次のフェイズ番号) 4 global fase #フェイズ番号 5 global err #エラーカウント 6 7 ser.write(bytes(comm)) #コマンド送信 8 9 read=ser.readline() #コマンド受信 10 while read: 11 print('read=',read,end='') #受信データ表示 12 13 """ 受信データ比較 """ 14 if((check in read)==True): #受信成功 15 err=0 #エラーカウントリセット 16 fase=Next #フェイズ進行 17 return True #受信成功 18 19 elif (('err' in read)==True): #エラーが返ってきたら 20 err=0 21 fase=2 22 return 'error' 23 24 else: #受信失敗 25 err+=1 #エラーカウント増加 26 if fase==0 and err>=100 : #エラーカウント既定値到達 27 err=0 #エラーカウントリセット 28 fase=2 #フェイズを飛ばす 29 return False #受信失敗 30 31 read=ser.readline() #コマンド受信 32 33with serial.Serial('COM3',9600,timeout=1) as ser: #シリアル通信設定。ポートCOM3、通信速度9600、タイムアウト最大1秒 34 while fase==0: #開始信号待ち 35 serial_fase=serial_get('start/','ok',1) #arduino待ち 36 if(serial_fase==True): #arduinoから応答があった 37 print('ok start...\n') 38 break; 39 elif(serial_fase==False): #arduinoから応答がなかった 40 print('\n 1st error\n') 41 break; 42 43 (以下略)
Arduino側のソースコードは以下のコードです。
Arduino
1char data[128]; 2int count=0; 3float a[4]; 4char*tp; 5int flag=0; 6int i; 7 8void reset_arr(); 9 10void setup() { 11 // put your setup code here, to run once: 12 Serial.begin(9600); 13 memset(data,'\0',128); 14} 15 16void loop() { 17 // put your main code here, to run repeatedly: 18 while (Serial.available() > 0){ 19 data[count]=Serial.read(); 20 if(data[count]=='/' || data[count]=='\0'){ 21 data[count]='\0'; 22 count=0; 23 break; 24 } 25 else if(count>=127){ 26 count=0; 27 break; 28 } 29 else { 30 count++; 31 } 32 delayMicroseconds(1025); //1.025[ms] 33 } 34 35 if( (strstr(data,"start")) != NULL){ 36 Serial.println("ok go"); 37 flag=1; 38 reset_arr(); 39 } 40 41 else if( (strstr(data,",")) != NULL){ 42 for(i=0;i<4;i++){ 43 if(i==0){ 44 a[i]=atof( strtok(data,",") ); 45 } 46 else { 47 a[i]=atof( strtok(NULL,",") ); 48 } 49 Serial.println(a[i]); 50 } 51 52 Serial.println("end"); 53 flag=0; 54 reset_arr(); 55 } 56 57 else if(data[0]!='\0'){ 58 Serial.println("error"); 59 reset_arr(); 60 } 61} 62 63void reset_arr(){ 64 for(i=0;i<sizeof(data);i++){ 65 data[i]='\0'; 66 } 67}
###試したこと
baudrateの値を変えてみたり、parityなどのオプション(?)も設定したりしたが変わらなかった。
baudrateの値はArduino と揃えてある。
タイムアウトの時間を減らしていったところ、0.9秒まではちゃんと動作することが確認できた。
###補足情報(言語/FW/ツール等のバージョンなど)
win10 64bitでAnaconda2を使用。
parityなどの設定で参考にしたのは以下のページです。
https://yoheikoga.github.io/2016/08/14/serial-communication-by-python/

回答1件
あなたの回答
tips
プレビュー