1

Pythonでシリアル通信を使用してデータを受信しようとしていますが、コードを改善する必要があります。

Arduinoから「&4,25 /n」の形式の「パケット」を送信しています。重要な要素は「4」と「25」の位置の値です。このパケットには、スタートバイトとして「&」があり、ターミネータとして改行フィード「/n」があります。これは、新しいパケットがいつ送信され、終了したかを知るためです。

このパケット「&4,24 / n」を受信して​​、「4,24」の場所にある値を抽出するにはどうすればよいですか?値が変化することにも注意する価値があるかもしれません、それらはArduinoから送信されたセンサー値に変化します。

これが私が今持っているコードで、startbyteなしで単一の値を受け取るために使用し、新しい改行を使用してパケットを終了します。

import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
from PythonCard import model
class MainWindow(model.Background):
    def on_SetSpdBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
    def on_FwdBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('F')
        ser.write(chr(spd))
    def on_LftBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('L')
        ser.write(chr(spd))
    def on_RitBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('R')
        ser.write(chr(spd))
    def on_RvsBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('B')
        ser.write(chr(spd))
    def on_StpBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('S')
        ser.write(chr(spd))
    def on_GetPing_mouseClick(self, event):
        ser.write('~')
        ser.write('P1')
        ser.write('p2')
        retval = ser.readline() 
        ping_data = retval.strip() # strip out the newline
        self.components.PngDis.text = str(ping_data)

app = model.Application(MainWindow)
app.MainLoop()

これは、リソースファイルとともに、VNCを介してロボットをリモートで制御するためのGUIを提供します。このコードは、ソナーから1つのping値を受け取り、それをGUIに報告して表示します。2つの異なるセンサーを表示するには、2つの異なるping値が必要です。


アップデート

<以下のコメント投稿者による回答>これが機能する正しいコードです。

import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
from PythonCard import model
class MainWindow(model.Background):
    def on_SetSpdBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
    def on_FwdBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('F')
        ser.write(chr(spd))
    def on_LftBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('L')
        ser.write(chr(spd))
    def on_RitBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('R')
        ser.write(chr(spd))
    def on_RvsBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('B')
        ser.write(chr(spd))
    def on_StpBtn_mouseClick(self, event):
        spd = self.components.SpdSpn.value
        ser.write('@')
        ser.write('S')
        ser.write(chr(spd))

    def on_GetPing_mouseClick(self, event):
        ser.write('~')
        ser.write('P1')
        ser.write('p2')
        retval = ser.readline()
        ping_data = retval.strip() # strip out the newline, if you read an entire line
        split_data = ping_data.split(',')
        L_Ping = split_data[0]
        R_Ping = split_data[1]
        self.components.PingLeft.text = str(L_Ping)
        self.components.PingRight.text = str(R_Ping)

app = model.Application(MainWindow)
app.MainLoop()

素晴らしくて簡単な答えをありがとう!

4

1 に答える 1