отправить данные с серийника на клиент
Я использую 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);
}
}
}
@Maghrabi Issam, 👍-1
Обсуждение1 ответ
Теперь я считаю, что serial.read и client.write не могут эффективно работать вместе. когда client.write запускается, serial.read останавливается, и поэтому данные теряются. Теперь я сохраняю serial.read в 3 массивах по 255 байт каждый, когда они заполнены или я получаю маркер конца, я вызываю client.write, чтобы отправить их, и Serial все равно останавливается. Это работает, но для макс. 765 байт данных. Я не могу сделать больше массивов для сохранения последовательных данных из-за ограниченной памяти модуля, а значит, это не лучшее решение на данный момент. Я опубликую код для этого позже, когда я его оптимизирую. другая идея, приходящая мне на ум, состоит в том, чтобы отправлять заказы серийному номеру, чтобы дождаться завершения client.write, а затем продолжить прием и так далее. Это возможно? Является ли Serial настолько гибким? Как я мог связаться с Serial, чтобы подождать и продолжить?
- Как получить HTTPS на Arduino?
- Как получить уникальный идентификатор для всех плат Arduino?
- Как поступить с файлом fzz
- Как сделать повторитель Wi-Fi на Arduino?
- Программа arduino выдаёт ошибку expected //primary-expression before ')' token error: //expected ';' before '}' token E
- Как заставить инфракрасный термодатчик MEMS - D6T-44-L06 работать с Arduino?
- Ошибка easy_install pip на Arduino Yun
- Как отправить почтовый запрос Arduino Yun на локальный хост?
Почему бы не использовать аппаратный серийный номер?, @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