Есть некая железка на микроконтроллере , работающая по TCP/IP , на ней используется LWIP.
Принцип ее работы прост - получает команду (256 байт ) - отдает ответ (256 байт)
В этом режиме все хорошо, и никаких проблем и вопросов.
Но есть часть команд, по которым железка отдает текущие данные , то есть сначала выстреливает заголовок (256 байт) , потом миллисекундная пауза и она начинает отдавать текущие данные по мере поступления, предопределенной ранее в команде длины, весь процесс может занимать до нескольких минут. Пока железка в режиме отдачи текущих данных - на другие команды не реагирует. В Дельфях и C# никаких проблем , получаю событие WSocket1DataAvailable в нем делаю Len := WSocket1.Receive(…) имею текущий буфер и его длину, могу по мере поступления данных их отображать.
В Питоне же могу получить только первый recv() - получаю всегда заголовок, вне зависимости от того что в параметрах recv() 256 байт, все последующие recv или recv_into вылетают с socket.timeout.
conn = socket.socket()
conn.settimeout( 2.0)
conn.connect( (IP, PORT) )
# до этого места могу сколько угодно раз сделать
#conn.send(buffer_out)
#s1=conn.recv(256)
#c командами на ответ по 256 байт - все работает
# в buffer_out команда
conn.send(buffer_out)
s1=conn.recv(256) # заголовок принимается , даже если s1=conn.recv(1024) получаю 256 байт
buffer_in = bytearray(TotalByte)
view = memoryview(buffer_in)
while TotalByte:
try:
nbytes = conn.recv_into(view, TotalByte)
except socket.timeout:
print ('Socket timeout')
continue
except:
traceback.print_exc()
print ('Socket err,)
break
view = view[nbytes:]
TotalByte -= nbytes
просто s2=recv(1024) пробовал . То же самое.
Понятно что просто Питона не знаю. Как написать правильно?