отправить данные с серийника на клиент

Я использую Arduino Yun для отправки данных с последовательного порта на клиент, и это частично работает, потому что я получаю только короткие данные, в то время как длинные данные (например, более 100 байт) теряют большую часть из них.

с другой стороны, когда я использую пример softwareSerial в IDE для отправки с последовательного на последовательный, он работает без потери данных. Я пытаюсь сделать как в примере, насколько это возможно, с последовательным кодом клиента, используя client.write(mySerial.read()), но не работает должным образом!

Что я упускаю? Я предполагаю, что client.write не содержит длинных данных или слишком медленный для передачи. Как я могу решить этот или даже другой способ достижения своей цели?

Я отправляю данные (в виде содержимого файла за один раз, а не последовательно - это обязательно) с ПК с помощью терминальной программы sscom32e. Я получаю данные как клиент, используя netcat на том же компьютере (Yun и ПК подключены через RS232-USB и находятся в одной сети).

#include <SoftwareSerial.h>
#include <Bridge.h>
#include <BridgeClient.h>

#define PORT 9000
// Заставляем клиента подключиться к нужному серверу и порту
IPAddress addr(192, 168, 0, 100);

// не все контакты на yun могут быть назначены как rx/tx
SoftwareSerial mySerial(10, 11); // прием, передача

// Определяем наш клиентский объект
BridgeClient client;

int led = 4;
bool Connected;
void setup() {
 pinMode(led, OUTPUT);

 // устанавливаем скорость передачи данных для порта SoftwareSerial
 mySerial.begin(9600);
 mySerial.println("Hello, world?");
 mySerial.setTimeout(20000);

 // Запустить мост
 Bridge.begin();
 // задержка (1000);

 // Запускаем консольную связь и ждем открытия порта:
 //Консоль.начать();
 // задержка (1000);

 //Console.println("Клиент подключается через порт 9000");
 Connected = false;

 // задержка (1000);
 //подключиться к клиенту();
 connectToClient();
}

void loop() // запускаем снова и снова
{
 while (mySerial.available()) {

 client.write(mySerial.read());

 //mySerial.read();
 }

}

void connectToClient() {

 // соединение в данный момент активно?
 if (!Connected)
 {
 // сейчас не подключен, попробуем установить соединение
 client.connect(addr, PORT);
 delay(1000);

 if (client.connected())
 {
 // отправляем что-то клиенту
 client.println("hello server!");
 digitalWrite(led, HIGH);
 }
 else
 {
 connectToClient();
 digitalWrite(led, LOW);

 }
 }
}

, 👍-1

Обсуждение

Почему бы не использовать аппаратный серийный номер?, @Sim Son

что вы подразумеваете под аппаратным серийным номером?, @Maghrabi Issam

Класс Serial среды arduino (обычно используемый для печати на последовательный монитор) использует последовательный аппаратный чип. В этом случае связь полностью обрабатывается аппаратным обеспечением, программный последовательный тип эмулирует серийный номер в программном обеспечении, которое более подвержено ошибкам. Поскольку вы, кажется, едва можете последовательно воспроизвести проблему, возможно, стоит попробовать., @Sim Son

потому что я использую RS232-Shield для получения данных, @Maghrabi Issam

Возможно, попробуйте сначала буферизовать полное сообщение, а затем отправить его как полное сообщение в одном запросе. В настоящее время вы отправляете много 1-байтовых запросов. Может быть, клиент netcat по какой-то причине не может получить столько запросов?, @chrisl

нет, это не netcat или вообще проблема с подключением (потому что я пытался отправить большие данные с SD, и у него не было проблем, но это решение также не было хорошим, потому что запись на SD из Serial имела ту же проблему). Я попытался буферизовать его в строке, используя ` Строковое содержимое символ = myserial.read(); контент.concat (символ); ` но это также не работало для отправки с последовательного на клиент, хотя работало для последовательного на серийный. Я пытался буферизовать его в массиве символов, но массивы символов имеют длину около 250 байт!, @Maghrabi Issam


1 ответ


0

Теперь я считаю, что serial.read и client.write не могут эффективно работать вместе. когда client.write запускается, serial.read останавливается, и поэтому данные теряются. Теперь я сохраняю serial.read в 3 массивах по 255 байт каждый, когда они заполнены или я получаю маркер конца, я вызываю client.write, чтобы отправить их, и Serial все равно останавливается. Это работает, но для макс. 765 байт данных. Я не могу сделать больше массивов для сохранения последовательных данных из-за ограниченной памяти модуля, а значит, это не лучшее решение на данный момент. Я опубликую код для этого позже, когда я его оптимизирую. другая идея, приходящая мне на ум, состоит в том, чтобы отправлять заказы серийному номеру, чтобы дождаться завершения client.write, а затем продолжить прием и так далее. Это возможно? Является ли Serial настолько гибким? Как я мог связаться с Serial, чтобы подождать и продолжить?

,