#python #package #udp #drop
#питон #пакет #udp #капля
Вопрос:
Я пытаюсь прочитать данные платы Fpga радарного датчика по UDP. Не удалось изменить датчик и сетевой протокол. Сеть состоит только из моего компьютера и платы Fpga. Дата отправляется в кадрах. Время между каждым кадром составляет 120 мс, и каждый кадр разделен примерно на 1456 байтовых пакетов. Чтобы прочитать дату каждого кадра, я изменил скрипт Python 3.9, который считывает все 1456 байтовых пакетов и возвращает массив NumPy полного кадра. Когда я запускаю эту программу на своем ноутбуке с Windows 11, она работает идеально и не сбрасывает никаких пакетов udp. Когда я запускаю свой скрипт на ПК с Windows 10, программа теряет пакеты udp. Я попробовал это на 2 разных нотбуках и 1 настольном ПК. На каждом из этих компьютеров обнаруживается одна и та же проблема-потеря пакетов udp. Как я могу оптимизировать свою программу таким образом, чтобы она работала под управлением Windows 10?
Код на Python:
enter code here def __init__(self, static_ip='192.168.33.30', adc_ip='192.168.33.180', data_port=4098, config_port=4096): # Save network data # self.static_ip = static_ip # self.adc_ip = adc_ip # self.data_port = data_port # self.config_port = config_port # Create configuration and data destinations self.cfg_dest = (adc_ip, config_port) self.cfg_recv = (static_ip, config_port) self.data_recv = (static_ip, data_port) # Create sockets self.config_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) self.data_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) # Bind data socket to fpga self.data_socket.bind(self.data_recv) # Bind config socket to fpga self.config_socket.bind(self.cfg_recv) self.data = [] self.packet_count = [] self.byte_count = [] self.frame_buff = [] self.curr_buff = None self.last_frame = None self.lost_packets = None def read(self, timeout=1): # Configure self.data_socket.settimeout(timeout) # Frame buffer ret_frame = np.zeros(UINT16_IN_FRAME, dtype=np.uint16) # Wait for start of next frame while True: packet_num, byte_count, packet_data = self._read_data_packet() if byte_count % BYTES_IN_FRAME_CLIPPED == 0: packets_read = 1 ret_frame[0:UINT16_IN_PACKET] = packet_data break # Read in the rest of the frame while True: packet_num, byte_count, packet_data = self._read_data_packet() packets_read = 1 if byte_count % BYTES_IN_FRAME_CLIPPED == 0: self.lost_packets = PACKETS_IN_FRAME_CLIPPED - packets_read return ret_frame curr_idx = ((packet_num - 1) % PACKETS_IN_FRAME_CLIPPED) try: ret_frame[curr_idx * UINT16_IN_PACKET:(curr_idx 1) * UINT16_IN_PACKET] = packet_data except: pass if packets_read gt; PACKETS_IN_FRAME_CLIPPED: packets_read = 0 def _read_data_packet(self): """Helper function to read in a single ADC packet via UDP Returns: int: Current packet number, byte count of data that has already been read, raw ADC data in current packet """ data, addr = self.data_socket.recvfrom(MAX_PACKET_SIZE) packet_num = struct.unpack('lt;1l', data[:4])[0] byte_count = struct.unpack('gt;Q', b'x00x00' data[4:10][::-1])[0] packet_data = np.frombuffer(data[10:], dtype=np.uint16) return packet_num, byte_count, packet_data