2017-08-31 4 views
0

私はuart経由でデータを送信しています。私は1つのファイルを取り出し、それを5120バイトの部分(チャンク)に分割します。このチャンクを送信する間に中断(おそらくボーレート値に基づく)があります。私はこの中断を捕らえ、データを送信することからデータを受信することに切り替える必要があります。これはこの方法ですか?データを送信するためにPython:uart経由のチャンクの送信中断

コード例:

ser = serial.Serial(
    port='/dev/ttyS0', 
    baudrate=115200) 

def send(): 
    with open("path_to_my_file_to_send", "rb") as fh: 
     while True: 
      chunk = fh.read(5120) 
      if not chunk: break 
      ser.write(chunk) 

def reveice(): 
global receivedData 
receivedData = "" 
time.sleep(0.001) 
while ser.inWaiting() > 0: 
    receivedData= ser.read(1) 
while True: 
    if len(receivedData) == 1: 
     print ("received data") 
     break 
    else: 
     print("no received data") 
     break 

答えて

0

それでは、あなたにできることは確認応答を送信するためにレシーブのを待ち、その後、あなたのsendからデータを送信します。このようにsemdは、そのデータが正常に受信され、新しいデータを送信できることを知ります。それを送信することができない場合、またはそれが割り込みmsgを受信した場合、それは停止することができます。 送信側では、受信して確認応答を送信できます。この肯定応答は、送信側で確認できるメッセージの長さであってもよい。

ser = serial.Serial(
port='/dev/ttyS0', 
baudrate=115200) 

def send(): 
with open("path_to_my_file_to_send", "rb") as fh: 
    while True: 
    chunk = fh.read(5120) 
    if not chunk: break 
    ser.write(chunk) 
    #for interupt just send# 
    ser.write(b'interupt') 

def reveice(): 
global receivedData 
receivedData = "" 
time.sleep(0.001) 
while ser.inWaiting() > 0: 
    receivedData= ser.read(1) 
    if b'interupt' in receivedData: 
    #go to recv mode 

while True: 
    if len(receivedData) == 1: 
    print ("received data") 
    break 
else: 
    print("no received data") 
    break 
+0

主な問題はwhileループでこの割り込みを検出することです:)受信データにコードを追加します。 – KyluAce

+0

私のansを再確認し、それが役立つかどうか確認してください。 –

+0

問題は、時々だけメッセージを受け取ることです(チャンクを保存するとエラーが発生した場合、または全体の一部を受け取らない場合にのみ、相手側から応答が得られます)。それでも私は受信したデータを1つのチャンクを送信した後にリスンする必要がありますが、それでも私は方法と時間が分かりません。 – KyluAce

1

[OK]をクリックします。 BaudRateはシングルチャンクの送信時間を通知します。しかし、とにかく各チャンクの後に中断がありましたが、ボーレート(1000000以上の値)の大きな設定値が原因で、uartを介してファイルを転送する際にギャップが生じます。このギャップは私がボーレートを少し増やすと普通ではなかったが、4000000に行くと(ファイル転送中に他の操作をする)、各チャンクの後にギャップが現れる。

関連する問題