2013-07-11 4 views
2

фонPython: Получение данных через сокеты - [Errno 11] Ресурс временно недоступен

мне нужно общаться с Tektronix MSO 4104 из питона. Связь осуществляется по локальной сети с использованием протокола ethernet vxi11 и библиотеки сокетов python.

Ситуация

Сейчас это работает довольно хорошо; Я могу подключиться к области, и я могу отправить ей любую команду, которую я хочу (например: <socket object>.send('*IDN?')). Однако всякий раз, когда команда должна отправлять ответ (например, * IDN?), Я пытаюсь использовать <socket object>.recv(1024), но я ВСЕГДА получаю сообщение об ошибке «Ресурс [Errno 11] временно недоступен».

Я знаю, что связь хороша, так как я могу получить информацию о том же «IDN»? через встроенный HTTP-интерфейс.

код

Ниже приведен фрагмент из scope.py который создает сокет дэ интерфейс с размахом.

import socket 
import sys 
import time 

class Tek_scope(object): 
    ''' 
    Open up socket connection for a Tektronix scope given an IP address 
    ''' 
    def __init__(self, IPaddress, PortNumber = 4000): 
     self.s = socket.socket(socket.AF_INET , socket.SOCK_STREAM) 
     self.s.connect((IPaddress, PortNumber)) 
     self.s.setblocking(False) 
     print "Scope opened Successfully" 

Теперь, чтобы получить ошибку, я бегу следующее:

import scope # Imports the above (and other utility functions) 

scope1 = scope.Tek_scope("10.1.10.15") #Connects to the scope 

scope1.s.send('*IDN?') #Sends the *IDN? command to the scope. 

# I have verified these signals are always recieved as I can 
# see them reading out on the display 

scope1.s.recv(1024) 

# This should receive the response... but it always gives the error 

системы

  • Fedora 16
  • Python 2.7
  • Tektronix MSO4104

Вопрос

Так почему же я не recieveing ​​никаких данных в ответ на мое приглашение? Я забыл какую-то готовку? Собираются ли данные куда-то, я просто не проверяю? Я неправильно использовал модули? Любая помощь будет принята с благодарностью!

ответ

3

Это работает для меня, используя тот же объем.

Установите setblocking (True) и добавьте \ n к * IDN? команда.

import socket 
import sys 
import time 

class Tek_scope(object): 

    def __init__(self, IPaddress, PortNumber = 4000): 
     self.s = socket.socket(socket.AF_INET , socket.SOCK_STREAM) 
     self.s.connect((IPaddress, PortNumber)) 
     self.s.setblocking(True) 
     print "Scope opened Successfully" 

scope1 = Tek_scope("10.1.10.15") #Connects to the scope 

scope1.s.send('*IDN?\n') #Sends the *IDN? command to the scope. 

print scope1.s.recv(1024) 
+0

Эй, спасибо, что сделал работа !! К сожалению для меня я закончил просто сломать все и написать его в C. Но спасибо за исправление! – Bacaa14