Никакие данные не передаются через последовательный порт в Linux С++
TL;DR – я пытаюсь установить последовательную связь с Arduino с помощью кода, который я нашел здесь и ничего не отправляется (Arduino запрограммирован на ответ, и я проверил, что он делает с помощью последовательного монитора)
Привет, Я искал способ отправить информацию на устройство Arduino Mega (2560) через последовательный порт Linux с помощью C++.
Я нашел следующее решение: Решение Я использую код этого парня для записи (я могу читать данные из Arduino) и использую те же параметры (они работают, поскольку я могу получать данные из Arduino). Я запрограммировал свой Arduino так, чтобы он отправлял «Привет» по последовательному порту всякий раз, когда он видит хотя бы 1 бит информации, и проверил его работу с помощью последовательного монитора Arduino IDE.
Однако при запуске кода C++ Arduino не отвечает. Кто-нибудь может знать, почему?
Полное раскрытие: я вставил код @Lunatic999 в класс, чтобы создать его экземпляр для своих нужд.
fd = open(portNameC, O_RDWR | O_NOCTTY | O_SYNC); //open port ("opens file")
Последовательные параметры:
struct termios tty;
struct termios tty_old;
memset (&tty, 0, sizeof tty);
/* Error Handling */
if ( tcgetattr ( fd, &tty ) != 0 ) {
std::cout << "Error " << errno << " from tcgetattr: " << strerror(errno) << std::endl;
}
/* Save old tty parameters */
tty_old = tty;
/* Set Baud Rate */
cfsetospeed (&tty, (speed_t)B9600);
cfsetispeed (&tty, (speed_t)B9600);
/* Setting other Port Stuff */
tty.c_cflag &= ~PARENB; // Делаем 8n1
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS; // нет управления потоком
tty.c_cc[VMIN] = 1; // чтение не блокируется
tty.c_cc[VTIME] = 5; // таймаут чтения 0,5 секунды
tty.c_cflag |= CREAD | CLOCAL; // включаем ЧТЕНИЕ & игнорировать строки Ctrl
/* Make raw */
cfmakeraw(&tty);
/* Flush Port, then applies attributes */
tcflush( fd, TCIFLUSH );
if ( tcsetattr ( fd, TCSANOW, &tty ) != 0) {
std::cout << "Error " << errno << " from tcsetattr" << std::endl;
}
Написать (этот код я помещаю в вызываемую функцию)
unsigned char cmd[] = "INIT \r";
int n_written = 0,
spot = 0;
do {
n_written = write( fd, &cmd[spot], 1 );
spot += n_written;
} while (cmd[spot-1] != '\r' && n_written > 0);
Код Arduino:
bool dataRecieved = false;
int ledpin = 13;
void setup() {
pinMode(ledpin, OUTPUT);
digitalWrite(ledpin, HIGH);
Serial.begin(19200);
}
void loop() {
while(!dataRecieved)
{
digitalWrite(ledpin,HIGH);
if (Serial.available() > 0)
{
dataRecieved = true;
}
}
digitalWrite(ledpin,LOW);
delay(1000);
digitalWrite(ledpin,HIGH);
delay(1000);
Serial.println("hi");
}
@Jordan, 👍0
Обсуждение1 ответ
Лучший ответ:
Arduino сбрасывается в тот момент, когда вы открываете последовательный порт. После сброса запускается загрузчик, который потребляет (и отбрасывает, поскольку он недействителен) любые последовательные данные в течение секунды или около того, прежде чем запустится ваш скетч.
Из-за этого все, что вы отправляете сразу после открытия последовательного порта, игнорируется.
Для этой проблемы есть два общепринятых «исправления»:
- Задержка на заранее определенный период после открытия последовательного порта и
- Пусть Arduino отправит сигнал «ГОТОВ», прежде чем делать что-либо еще, чего ваша программа ожидает перед отправкой.
- C: Нет связи с подключенным последовательным портом?
- Как разделить входящую строку?
- Как использовать SPI на Arduino?
- Arduino Преобразование std:string в String
- Какова максимальная длина провода для последовательной связи между двумя Arduino?
- Подключение HX711 к трехпроводному датчику нагрузки
- Последовательная связь между двумя Arduino (запрос и получение)
- Правильное использование * и & при передаче объектов в методах.
@Юрай, извини, не опубликовал правильную версию с правильной скоростью передачи данных. теперь это исправлено. Спасибо!, @Jordan
убрать мигание и только выключить светодиод, @Juraj
@Юрай, ничего не изменилось, @Jordan
тогда проблема на стороне Linux и не по теме, @Juraj
Ну, я пытаюсь подключиться к Arduino, так что, возможно, это не так уж и не по теме (также полезно для будущих ссылок для тех, кому это тоже может понадобиться). В любом случае, я все равно буду рад дождаться большего понимания этой проблемы., @Jordan
Вы знаете, что Arduino перезагружается в тот момент, когда вы открываете последовательный порт, и проводит секунду или около того в загрузчике? В течение этого времени все, что вы отправляете, будет полностью игнорироваться., @Majenko
@Маженко Мой спаситель! Я знал о том, что при открытии серийного номера ардуино перезагружается. Я пренебрег временем, которое потребовалось загрузчику для завершения работы (и после инициализации последовательного интерфейса у ПК не было команды usleep). Если вы напишете это в качестве ответа, я буду более чем рад принять это., @Jordan