2017-08-31 272 views
0

我通過uart發送一些數據。我把單個文件分成5120byte的部分(塊)。在發送這個塊之間有中斷(可能基於波特率值),我需要捕獲這個中斷並從發送數據切換到接收數據。這是可能的嗎?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

所以你可以做的是從你發送發送數據然後等待收到發送確認。這樣semd就會知道它的數據已經成功接收,然後它可以發送新的數據。如果不是,它可以重新傳輸它,或者如果它接收到中斷消息,它可以停止。 在發送端,您可以收到併發送確認。該確認可以是可以在發送側驗證的消息的長度。

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

重新檢查我的答案,看看它是否有幫助。 –

+0

問題是我有時只會收到消息(只有當它在保存塊時發生錯誤或者沒有收到整個部分時,我纔會收到來自其他方的回覆),我需要爲它定時。儘管如此,我仍然需要在發送單個塊之後監聽接收到的數據,但我仍然不知道 – KyluAce

1

好的,我發現了一些改變看這個問題的東西。 BaudRate只告訴我單塊發送的時間。但無論如何,在每個塊後都會出現中斷,但是對於波特率而言,設置值較大(值超過1000000)可能會在通過uart傳輸文件時提供間隙。如果我稍微增加波特率,這種差距並不是常規,但如果我們達到4000000(並且在傳輸文件期間我們執行其他操作),則在每個塊之後會出現間隙。