Python: прерывание между отправкой фрагментов через uart

Я отправляю некоторые данные через 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

person KyluAce    schedule 31.08.2017    source источник


Ответы (2)


Хорошо, я нашел кое-что, что меняет взгляд на эту проблему. BaudRate только сообщает мне, как долго отправляется один фрагмент. Но в любом случае после каждого чанка было прерывание, но из-за большого заданного значения скорости передачи (значения более 1000000) могут возникать пропуски при передаче файлов через uart. Эти пробелы, если я немного увеличиваю скорость передачи, не были регулярными, но если мы доходим до 4000000 (и мы делаем другие операции во время передачи файла), пробелы появляются после каждого фрагмента.

person KyluAce    schedule 04.09.2017

Итак, что вы можете сделать, это отправить данные из отправки, а затем дождаться получения, чтобы отправить подтверждение. Таким образом, 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
person Shivam Chawla    schedule 31.08.2017
comment
Основная проблема заключается в том, чтобы обнаружить это прерывание в цикле while :) Я добавляю код к полученным данным. - person KyluAce; 31.08.2017
comment
Перепроверьте мои ответы и посмотрите, поможет ли это. - person Shivam Chawla; 31.08.2017
comment
Проблема в том, что я получаю сообщение только иногда (я получаю ответ с другой стороны только тогда, когда он получает ошибку с сохранением фрагмента или не получает всю часть), что означает, что мне нужно иметь фиксированное время для этого. Тем не менее мне нужно слушать полученные данные после отправки одного фрагмента, но я все еще не знаю, как и как долго - person KyluAce; 31.08.2017
comment
поэтому идея состоит в том, что всякий раз, когда ваша отправка хочет вызвать прерывание, вы отправляете определенное ключевое слово, которое означает прерывание (здесь это байтовая форма строкового прерывания). Чтобы поймать это в цикле ehile, вы можете проверять при каждом вызове recv, является ли ваше конкретное ключевое слово их значением, если произошло прерывание. я надеюсь, что смог помочь - person Shivam Chawla; 31.08.2017