Serial — отправляет данные в Arduino, пока Arduino отправляет данные
Arduino отправляет данные на ПК при каждой итерации. Когда я пытаюсь отправить данные в Arduino, получая от него данные, это занимает слишком много времени. Serial.available()
возвращает false, даже если я отправил данные с ПК. Но если я добавлю задержку, например, 20-30 мс, проблема устранена. Могу ли я одновременно использовать последовательный порт?
PS: это мега Arduino, и я использую http://www.teuniz.net/RS-232/ библиотека для последовательной связи.
Пример кода:
void loop(){
if(Serial.available())
Serial.write("goodbye", 7);
Serial.write("hello", 5);
}
В этой ситуации требуется много времени, чтобы написать «до свидания» после того, как я отправил данные в Arduino.
@bca, 👍2
Обсуждение2 ответа
В продолжение того, что говорит Ник Гэммон, не пытайтесь использовать последовательный вывод для отладки последовательного порта. Возможно, вместо этого попробуйте использовать встроенный светодиод; вы можете использовать осциллограф, чтобы узнать, сколько времени он тратит на чтение символов.
Вот как я читал строку за раз, используя неблокирующие операции:
const int SERIAL_BUFFER_LENGTH = 100;
// +1 гарантирует, что у нас всегда будет место для нулевого завершения
char g_serial_buffer[SERIAL_BUFFER_LENGTH+1];
int g_char_count; // индекс в последовательный буфер
void setup() {
Serial.begin(9600); // или 115200, если ваш хост это поддерживает
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
g_char_count = 0;
}
void loop() {
while(Serial.available() > 0) {
digitalWrite(LED_BUILTIN, HIGH);
char c = Serial.read(); // не будет блокироваться, потому что Serial.available() > 0
if (c == '\n') {
g_serial_buffer[g_char_count] = '\0'; // нулевое завершение
process_buffer(g_serial_buffer);
g_char_count = 0;
} else if (g_char_count < SERIAL_BUFFER_LENGTH) {
g_serial_buffer[g_char_count++] = c;
}
}
digitalWrite(LED_BUILTIN, LOW);
Serial.print(".");
}
// process_buffer: делайте все, что вы намеревались сделать с
// строка полученного текста...
void process_buffer(char *buffer) {
}
Попробуйте это:
if(Serial.available())
while(Serial.read());
Serial.write("goodbye", 7);
Serial.write("hello", 5);
}
Я думаю, вы должны прочитать, что вы получаете в последовательном порту.
- Как разделить входящую строку?
- Какова максимальная длина провода для последовательной связи между двумя Arduino?
- Последовательная связь между двумя Arduino (запрос и получение)
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Модуль SIM808: команда определения местоположения GSM (AT+CIPGSMLOC=1,1) дает неверное значение после выполнения команды отправки сообщения (AT+CMGS=+91xxxxxxxx)
- Как правильно получить MIDI с Arduino, с 6n138?
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
Пожалуйста, отредактируйте свой вопрос и опубликуйте свой код. Отформатируйте код, используя уценку форматирования кода (четыре начальных пробела). Для получения справки см. [Справка Markdown](http://meta.stackexchange.com/editing-help). Вы сможете сделать это, выбрав код и нажав
Ctrl+K
, чтобы ваш браузер сделал это за вас., @Nick Gammon@Ник Гэммон, готово., @bca
Это не **весь** ваш код, не так ли? Какую скорость передачи вы используете? В любом случае, поскольку вы отправляете «привет» каждый раз в цикле, выходной буфер будет заполнен «привет» до того, как вы получите возможность вставить «до свидания». Ваше решение с «задержкой», вероятно, дает буферу вывода время для очистки., @Nick Gammon
@Ник Гэммон 9600., @bca
И я закрываю светодиод, когда получаю сообщение. Я забываю это написать. Я добавлю полный код, когда буду открывать ПК. У меня пока нет полного кода., @bca