При смене пк перестал работать код
Есть код в pyhton который передаёт 2 числа в ардуину по COM порту, а та в свою очередь исполняет свой код в зависимости от чисел. Делал на домашнем пк и всё прекрасно работало, но при переходе за рабочий пк питон и ардуино перестали дружить. Я проверил код ардуино введя числа в ручную и всё хорошо, написал небольшой тестовый код на питоне который должен передавать числа и он исполяется и светодиоды на адуино сигнализируют о получении чисел но действий на основе чисел не происходит. Код ардуино:
int step_pin = 5;
int dir_pin = 8;
int ena_pin = 12;
void setup() {
Serial.begin(9600);
Serial.setTimeout(10);
pinMode(step_pin, OUTPUT);
pinMode(dir_pin, OUTPUT);
pinMode(ena_pin, OUTPUT);
}
void loop() {
digitalWrite(ena_pin, LOW);
while (Serial.available() == 0) {
// ничего для ожидания ввода
}
String steps = Serial.readString();
while (Serial.available() == 0) {
// ничего для ожидания ввода
}
String dir = Serial.readString();
if (dir.toInt() == 0) {
digitalWrite(dir_pin, HIGH);
}
if (dir.toInt() == 1) {
digitalWrite(dir_pin, LOW);
}
int stop = 1500; // начальный интервал
int mult = 50; // начальный множитель интервала
int mult_step = 1; // шаг между множителем
int steps_count = 24; // количество шагов разгона и тормоза
for (int i = 0; i <= steps.toInt(); i++) {
int flag = 0;
digitalWrite(step_pin, HIGH);
digitalWrite(step_pin, LOW);
// тормоз
if (i > steps.toInt() - steps_count and flag == 0) {
delayMicroseconds(stop);
// Serial.println(stop);
stop = stop + mult;
// mult = mult - mult_step;
flag = 1;
}
// разгон
if (i < steps_count and flag == 0) {
delayMicroseconds(stop);
// Serial.println(stop);
stop = stop - mult;
// mult = mult + mult_step;
flag = 1;
// макс.скорость
}
if (steps_count < i < steps.toInt() - steps_count and flag == 0) {
delayMicroseconds(stop);
// Serial.println(stop);
flag = 1;
}
}
Serial.print(1);
}
Тестоый код Python:
import serial
import time
ser = serial.Serial('COM4', 9600, parity=serial.PARITY_EVEN, rtscts=1)
steps = bytearray(str(int(400)).encode('utf-8')) # не обращайте внимания не преобразование числа в число
dir = bytearray(str(int(1)).encode('utf-8'))
ser.write(steps)
time.sleep(0.001)
ser.write(dir)
PySerial я обновил
Ответы (1 шт):
Текстовый терминал работает построчно. Когда вы отправляете данные в Arduino, они не отправляются сразу, а записываются в буфер, пока вы не отправите символ "конец строки" '\n'.
Чтобы передать данные принудительно, обычно нужно сделать вызов функции flush().
Это первый момент.
Второй момент - в вашем скетче получение данных проверяется на основе получения цифрового значения. Но вы же работаете с последовательным портом, который не гарантирует вам целостность передачи данных.
Если например у вас не совпадает бодрейт или протокол передачи, то приёмник может быть уверен, что он получил корректные данные, хотя на самом деле это вполне может быть мусор случайного вида.
Есть ли в мусора единица или ноль? Да вполне может быть.
Первое, что должен сделать ваш скетч на питоне - это обменяться данными с Ардуино, чтобы убедиться, что связь установлена и данные передаются корректно.
Обычно для этого терминал при подключении (сбросе) посылает хосту сообщение. "Я скетч для Ардуино. Версия такая-то. Все вопросы к Васе Пупкину." И всё это - в несколько строк, чтобы убедиться, что данные корректно передаются построчно.
Далее хост может отправлять Ардуине команды. Тоже построчно. Чтобы Ардуино знала, что на том конце получили его сообщение и данные посылает именно скетч на питоне или пользователь в терминальной программе, а не какой-нибудь случайный софт, который тоже хочет общаться с Ардуино, но с другой Ардуино, с другим скетчем.
Поэтому скетч на питоне тоже должен представиться. "Я скетч на питоне. Версия такая-то." А скетч Ардуино может ему ответить "ОК" или "Ошибка. Версия слишком ранняя. Используйте скетч версии такой-то или новее".
Примерно так это всё происходит в профессиональных системах.