Последовательный порт не читает буфер с целочисленными символами больше 43
Я пытаюсь написать сценарий для перемещения объекта, связанного с линейной осью, с помощью шагового двигателя
. Пользователь должен отправить такую информацию, как длина
для перемещения, скорость
движения, направление
движения или даже если он захочет внесите миллиметровые корректировки с помощью serial
. Однако Я не могу прочитать длины от 43 мм
, когда я отправляю
целое число 43 по последовательному порту
. Я протестировал несколько методов, которые нашел в Интернете. Ниже приведен текущий код и некоторые альтернативы раздела последовательного чтения, в котором произошел сбой.
void(* resetFunc) (void) = 0;
//Последовательное чтение
const int bufferSize = 30; // Максимальное таманьо для свободного буфера
char buffer[bufferSize]; // Буфер для передачи данных через последовательный порт
//Шаговой двигатель
const int stepPin = 3;
const int senPin = 2;
const int enPin = 8;
int sen, sp, len, ad; //sen = вперед или назад, sp = скорость, len = длина, ad = включить шаги регулировки
int REV;//обороты двигателя
int time_motor; // интервал импульса (вкл/выкл)
void setup()
{
pinMode(stepPin,OUTPUT);
pinMode(senPin,OUTPUT);
pinMode(enPin,OUTPUT);
digitalWrite(enPin,LOW);
Serial.begin(9600);
while (!Serial.available()) {
delay(10);
}
int bytesRead = Serial.readBytesUntil('\n', buffer, bufferSize);
buffer[bytesRead] = '\0';
sscanf(buffer, "%d,%d,%d,%d", &ad, &sen, &len, &sp);
Serial.print("ad: ");
Serial.println(ad);
Serial.print("sen: ");
Serial.println(sen);
Serial.print("len: ");
Serial.println(len);
Serial.print("sp: ");
Serial.println(sp);
time_motor = 100;
REV = int(768 * len);
if(ad == 0){
if (sen == 1){
backward(REV, time_motor);
}
else {
forward(REV, time_motor);
}
resetFunc();
}
else{
if(sen == 1){backward(768, time_motor);resetFunc();}
else{forward(768, time_motor);resetFunc();}
}
}
void forward(int len_fact, int time_c) {
digitalWrite(enPin, LOW);
digitalWrite(senPin, HIGH);
for (int x = 0; x < len_fact; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(time_c);
digitalWrite(stepPin, LOW);
delayMicroseconds(time_c);
}
}
void backward(int len_fact, int time_c) {
digitalWrite(enPin, LOW);
digitalWrite(senPin, LOW);
for (int x = 0; x < len_fact; x++) {
digitalWrite(stepPin, HIGH);
delayMicroseconds(time_c);
digitalWrite(stepPin, LOW);
delayMicroseconds(time_c);
}
}
void loop()
{
}
Альтернатива ниже:
while (!Serial.available()) {
// Подождем, пока данные не станут доступны на последовательном порту
}
delay(100); // Небольшая задержка, чтобы убедиться, что все данные доставлены
int bytesRead = 0;
while (Serial.available() && bytesRead < bufferSize - 1) {
char c = Serial.read();
if (c == '\n') {
break; // Завершаем чтение, когда обнаружен разрыв строки
}
buffer[bytesRead] = c;
bytesRead++;
}
// Добавляем нулевой символ, обозначающий конец строки
buffer[bytesRead] = '\0';
// Используйте функцию sscanf для извлечения чисел из буфера
sscanf(buffer, "%d,%d,%d,%d", &ad, &dir, &len, &sp);
// Распечатываем прочитанные значения, чтобы их проверить
Serial.print("ad: ");
Serial.println(ad);
Serial.print("dir: ");
Serial.println(dir);
Serial.print("len: ");
Serial.println(len);
Serial.print("sp: ");
Serial.println(sp);
И остальные:
while (!Serial.available()) {
// Подождем, пока данные не станут доступны на последовательном порту
}
// Считывает данные из последовательного порта и сохраняет их в буфере, пока они не достигнут максимального размера
int bytesRead = 0;
while (bytesRead < bufferSize - 1) {
if (Serial.available()) {
char c = Serial.read();
if (c == '\n') {
break; // Завершаем чтение, когда обнаружен разрыв строки
}
buffer[bytesRead] = c;
bytesRead++;
}
}
// Добавляем нулевой символ, обозначающий конец строки
buffer[bytesRead] = '\0';
// Используем функцию сканирования для извлечения чисел из буфера
sscanf(buffer, "%d,%d,%d,%d", &ad, &dir, &len, &sp);
// Вывести значения значений для проверки
Serial.print("ad: ");
Serial.println(ad);
Serial.print("dir: ");
Serial.println(dir);
Serial.print("len: ");
Serial.println(len);
Serial.print("sp: ");
Serial.println(sp);
Последовательный интерфейс ничего не возвращает или возвращает «?». Как мне действовать, чтобы решить эту проблему? Я использую оригинальную Arduino Uno и пишу в Arduino IDE. Версия 1.8.19.
@Yan Araújo, 👍-1
Обсуждение1 ответ
Ну, вы предоставили не так много информации, но я взял часть вашего кода (ниже) и на последовательном мониторе могу прочитать все цифры:
const int bufferSize = 30; // Максимальное таманьо для свободного буфера
char buffer[bufferSize]; // Буфер для передачи данных через последовательный порт
//Шаговой двигатель
const int stepPin = 3;
const int senPin = 2;
const int enPin = 8;
int dir, sp, len, ad; //sen = вперед или назад, sp = скорость, len = длина, ad = включить шаги регулировки
int REV;//обороты двигателя
int time_motor; // интервал импульса (вкл/выкл)
void setup() {
// поместите сюда свой код установки для однократного запуска:
Serial.begin(9600);
}
void loop() {
// поместите сюда свой основной код для многократного запуска:
while (!Serial.available()) {
// Подождем, пока данные не станут доступны на последовательном порту
}
delay(100); // Небольшая задержка, чтобы убедиться, что все данные доставлены
int bytesRead = 0;
while (Serial.available() && bytesRead < bufferSize - 1) {
char c = Serial.read();
if (c == '\n') {
break; // Завершаем чтение, когда обнаружен разрыв строки
}
buffer[bytesRead] = c;
bytesRead++;
}
Serial.println(buffer);
// Добавляем нулевой символ, обозначающий конец строки
buffer[bytesRead] = '\0';
// Используйте функцию sscanf для извлечения чисел из буфера
sscanf(buffer, "%d,%d,%d,%d", &ad, &dir, &len, &sp);
// Распечатываем прочитанные значения, чтобы их проверить
Serial.print("ad: ");
Serial.println(ad);
Serial.print("dir: ");
Serial.println(dir);
Serial.print("len: ");
Serial.println(len);
Serial.print("sp: ");
Serial.println(sp);
}
- Как получить ненулевой выход из HX711 и ячейки загрузки?
- Как остановить серводвигатель в текущем положении при использовании последовательного порта? Я хочу, чтобы он оставался в одном положении при получении «0».
- Метод перебора битов в байте, отправленном по последовательному каналу.
- Arduino Uno по-прежнему загружается и работает, но нет последовательной связи через USB
- Отправка строки с Arduino на ESP8266 работает на UNO, но не на Pro Mini
- Повреждение данных SoftwareSerial - поиск предложений
- Как программировать микрочипы напрямую через USB
- Какой лучший способ объявить Serial при создании библиотеки Arduino?
возможно, вы установили неправильную скорость передачи данных в последовательной консоли, @jsotola
сократите свою программу. к минимальному коду, который все еще демонстрирует проблему, @jsotola
Вы отправляете 4 номера по серийному номеру, верно? Пожалуйста, скопируйте и вставьте точные цифры, которые вы отправляете., @Nick Gammon
Перед
sscanf
я бы распечатал то, что находится в этом буфере., @Nick Gammon