Данные не отправляются через последовательный порт в Linux C ++ - PullRequest
0 голосов
/ 09 октября 2018

TL; DR - я пытаюсь установить последовательную связь с Arduino с кодом, который я нашел здесь и ничего не передается (Arduino запрограммирован на ответ, и я проверил, что это происходит с его последовательным монитором)

Привет, я искал способ отправить информацию на модуль Arduino Mega (2560) через последовательный порт linux через C ++.

Я наткнулся на следующее решение: Решение Я использую код этого парня для записи (я могу читать данные из arduino) и использую те же параметры (они работают, так как я могу получать данные от Ardunio).Я запрограммировал свой Arduino на передачу «Привет» по последовательному каналу всякий раз, когда он видит хотя бы 1 бит информации, и проверил, работает ли он через последовательный монитор IDE Arduino.

Тем не менее, при запуске кода 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)B19200);
cfsetispeed (&tty, (speed_t)B19200);

/* Setting other Port Stuff */
tty.c_cflag     &=  ~PARENB;            // Make 8n1
tty.c_cflag     &=  ~CSTOPB;
tty.c_cflag     &=  ~CSIZE;
tty.c_cflag     |=  CS8;

tty.c_cflag     &=  ~CRTSCTS;           // no flow control
tty.c_cc[VMIN]   =  1;                  // read doesn't block
tty.c_cc[VTIME]  =  5;                  // 0.5 seconds read timeout
tty.c_cflag     |=  CREAD | CLOCAL;     // turn on READ & ignore ctrl lines

/* 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");
}

1 Ответ

0 голосов
/ 11 октября 2018

Оказывается, это была проблема с Arduino все время.Мне нужно было немного уснуть, чтобы позволить загрузке arduino

...