Arduino EthernetServer получает неожиданные значения от клиента Python - PullRequest
1 голос
/ 29 января 2012

Я пытаюсь говорить Arduino с сетевым экраном от клиента Python.Я получаю (что, кажется,) ненужные значения на стороне сервера Arduino, как только клиент Python пытается подключиться.Я получаю эти значения еще до того, как пытаюсь отправить какие-либо данные на стороне Python.

Я сделал минимальный пример, основанный на примере EthernetServer из документации Arduino.Единственное, что я изменил (кроме спецификаций сети), - я заставил сервер передавать данные, которые он получает, через последовательное соединение, а не обратно клиенту.

Код сервера Arduino:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0xCD, 0x38};  
byte ip[] = {10, 1, 30, 210};
byte gateway[] = { 10, 1, 30, 0 };
byte subnet[] = { 255, 255, 0, 0 };

EthernetServer server = EthernetServer(50000);

void setup()
{
  // initialize the ethernet device
  Ethernet.begin(mac, ip, gateway, subnet);

  // start listening for clients
  server.begin();

  Serial.begin(9600);
}

void loop()
{
  // if an incoming client connects, there will be bytes available to read:
  EthernetClient client = server.available();
  if (client == true) {
    // read bytes from the incoming client and write them back
    // to any clients connected to the server:
    Serial.write(client.read());
  }
}

Клиентский код Python, который я запускаю после того, как Arduino было дано время для запуска:

import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('10.1.30.210', 50000))
client_socket.close()

Я ничего не получаю в последовательном потоке до запуска кода Python.Как только он запустится, я получаю (казалось бы) бесконечный поток байтов по последовательному каналу.Вот пример:

j!ðé¸Xta¼#ò´çÈÂlÊC`»­\S513ÙCJèÙÒ Í([Ôø#Q_$(Ìs.)RlO&BÏ$6êçÁFøå¨ÝõVé]üEº_Tà*4V[¡¬íÆVÓñÿpQDÒÐþoñ«.çbþÐS-8&ÓÒøHüZ¡ª£¸öÙ ÂÛÖ¨{R{&<(]$¿*PXøMÃ>i]Û¿Ãké2E)¢4WuKÕÎ%CsÉ9ïÓàä-fZàH5N6ºÞ¹A¬}CaY,Ä]Dîj!ðé¸Xta¼#ò´çÈÂlÊC`»­\S513ÙCJèÙÒ Í([Ôø#Q_

Кто-нибудь знает, что может вызвать это?Откуда Arduino читает эти значения?Как я могу заставить это прекратить делать это и начать читать то, что я посылаю с client_socket.send() вместо этого?

Ответы [ 2 ]

1 голос
/ 30 января 2012

Вы пробовали отправлять последовательные пакеты вместо использования Ethernet?

Также проверьте скорость передачи.

##set to your serial port
ser = serial.Serial('/dev/ttyUSB0', 19200)

## check serial port
def checkokay():
  ser.flushInput()
  time.sleep(3)
  line = ser.readline()
  time.sleep(3)

ser.write('1')

Также посмотрите этот пост:

Как использовать Raw Socket в Python?

0 голосов
/ 31 января 2012

Оказалось, что это проблема с версией среды разработки Arduino в менеджере пакетов Fedora.Я пытался обновиться до последней версии из исходного кода, но был остановлен некоторыми ошибками Java-части процесса сборки.В конце я загрузил тот же самый код, который использовал в Arduino после компиляции в виртуальной машине Windows;это сработало идеально.

Не лучшее решение, но оно выполнило свою работу.

...