@@ -805,6 +805,23 @@ def _recv(self, max_size):
805805 return None
806806 return r_buffer
807807
808+ def _recv_all (self , size ):
809+ """Receive data over current socket, loop until all bytes is receive (avoid TCP frag)
810+
811+ :param size: number of bytes to receive
812+ :type size: int
813+ :returns: receive data or None if error
814+ :rtype: str (Python2) or class bytes (Python3) or None
815+ """
816+ r_buffer = bytearray ()
817+ while len (r_buffer ) < size :
818+ print ('recv_all loop here' )
819+ r_packet = self ._recv (size - len (r_buffer ))
820+ if not r_packet :
821+ return None
822+ r_buffer += r_packet
823+ return r_buffer
824+
808825 def _send_mbus (self , frame ):
809826 """Send modbus frame
810827
@@ -835,7 +852,7 @@ def _recv_mbus(self):
835852 # modbus TCP receive
836853 if self .__mode == const .MODBUS_TCP :
837854 # 7 bytes header (mbap)
838- rx_buffer = self ._recv (7 )
855+ rx_buffer = self ._recv_all (7 )
839856 # check recv
840857 if not (rx_buffer and len (rx_buffer ) == 7 ):
841858 self .__last_error = const .MB_RECV_ERR
@@ -854,12 +871,12 @@ def _recv_mbus(self):
854871 self .__last_error = const .MB_RECV_ERR
855872 self .__debug_msg ('MBAP format error' )
856873 if self .__debug :
857- rx_frame += self ._recv (rx_hd_length - 1 )
874+ rx_frame += self ._recv_all (rx_hd_length - 1 )
858875 self ._pretty_dump ('Rx' , rx_frame )
859876 self .close ()
860877 return None
861878 # end of frame
862- rx_buffer = self ._recv (rx_hd_length - 1 )
879+ rx_buffer = self ._recv_all (rx_hd_length - 1 )
863880 if not (rx_buffer and
864881 (len (rx_buffer ) == rx_hd_length - 1 ) and
865882 (len (rx_buffer ) >= 2 )):
0 commit comments