0

我正在通过 uart 发送一些数据。我将单个文件拆分为 5120 字节的部分(块)。在发送此块之间存在中断(可能基于波特率值)我需要捕获此中断并从发送数据切换到接收数据。这可能吗?

发送数据的示例代码:

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
4

2 回答 2

1

好的,我发现了一些改变这个问题的东西。BaudRate 只告诉我单个块发送多长时间。但是无论如何,每个块之后都会出现中断,但是会导致波特率的设定值(值超过 1000000)会在通过 uart 传输文件期间提供间隙。如果我稍微增加波特率,这个间隙是不规则的,但是如果我们达到 4000000(并且我们在传输文件期间执行其他操作),每个块之后都会出现间隙。

于 2017-09-04T08:23:33.907 回答
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
于 2017-08-31T07:16:35.350 回答