2015-12-07 157 views
0

我有一个运行在Arduino板上的套接字服务器,并试图通过Python脚本来控制它。使用基本的例子插座的文档,我有这样的:当我注释掉线,用来接收服务器的响应Python套接字recv()问题

import socket 
import sys 

TCP_IP = '192.168.254.100' 
TCP_PORT = 5012 
BUFFER_SIZE = 1024 
MESSAGE = "Status" 
# Create a TCP/IP socket 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect((TCP_IP, TCP_PORT)) 
s.send(MESSAGE) 
# data = s.recv(BUFFER_SIZE) 
# print (data) 
s.close() 
sys.exit() 

我的脚本工作正常。但是,如果我尝试读取响应,则我的服务器和python脚本会挂起。

在服务器端,这里是一个什么样的代码看起来像一个片段:

void loop() { 
    // listen for incoming clients 
client = server.available(); 
    if (client){ 
    Serial.println("Client connected"); 
    while (client.connected()){ 
     // Read the incoming TCP command 
     String command = ReadTCPCommand(&client); 
     // Debugging echo command to serial 
     command.trim(); 
     Serial.println(command); 
     // Debugging echo command back to client 
     client.println(command); 
     // Phrase the command 
     PhraseTCPCommand(&client, &command); 
    } 
    // Stop the client 
    client.stop(); 
    Serial.println("Client disconnected"); 
    } 

} 

我利用服务器的库是Arduino WiFi库。 函数PhraseTCPCommand接收命令并触发板上GPIO引脚的外部事件。当recv()被注释掉时,这个动作被Python脚本正确执行。从服务器发送的响应字符串以换行符和回车结束。这可能会导致问题吗?

此外,我能够使用telnet,netcat或PuTTY从服务器连接和接收响应,这使得我相信这是与我的Python脚本尝试读取来自服务器。

+1

您介意向我们展示您的Arduino代码吗? – MikeCAT

回答

0

这里的问题可能是您的邮件尚未完全发送,并且反映了对套接字编程的常见误解。低层次呼叫如send不承诺发送完整消息。相反,调用者必须检查实际发送的字节数(来自返回值)并继续迭代调用该函数,直到发送完整的消息。

通常,没有这种迭代的纯粹的send调用是一个错误。

Python确实提供了一个更高级别的函数socket.sendall但是它会为您执行这项工作。

+0

感谢您的指针,但我不确定这是否是我的问题的原因。当我监视服务器时,我发现该消息是从Python脚本接收的,并且服务器按预期运行。 – Ash

0

从服务器发送的响应字符串以换行符 和回车符结束。这可能会导致问题吗?

没有,是什么原因造成的问题可能是该命令MESSAGE使用换行符和功能ReadTCPCommand()期待一个终止。更改为:

MESSAGE = "Status\n"