Подключение программы Arduino и Serial-порта - PullRequest
0 голосов
/ 01 февраля 2020

Я использую Ubuntu 16 (хотя у меня такая же проблема в Debian) Arduino Mega 2560, 2 версии Arduino IDE: 2:1.0.5+dfsg2-4.1 и 1.8.9.

Я работаю над соединение программы C с Arduino через COM-порт.

Например, у меня есть следующий код; программа P C отправляет некоторый текст в Arduino, а Arduino получает и печатает его.

p c. c:

#include <stdio.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>

int openPort(char port_name[], speed_t speed)
{
   int F_ID = open(port_name, O_RDWR | O_NOCTTY);
   fcntl(F_ID, F_SETFL, 0);
    //printf("%s\n", port_name);
    if(F_ID == -1)
    {        
        return -1;
    }
    struct termios options; 
    tcgetattr(F_ID, &options); 

    cfsetispeed(&options, speed);
    cfsetospeed(&options, speed); 

    options.c_cc[VTIME]    = 20;
    options.c_cc[VMIN]     = 0;     

    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE; 
    options.c_cflag |= CS8;  

    options.c_lflag = 0;
    options.c_oflag &= ~OPOST;

    tcsetattr(F_ID, TCSANOW, &options); 

    return F_ID;
}

void closePort(int id)
{
    close(id);
    return;
}

int sendData(int id, unsigned char* buf, int len)
{
    int n = write(id, buf, len);
    if(n == -1)
    {
        char *errmsg = strerror(errno);
        printf("%s\n",errmsg);        
    }
    return n;
}


int main(int argc, char * argv[])
{
    int port=openPort("/dev/ttyUSB0", B9600);

    if ( (port) == -1){
        //char *errmsg = strerror(errno);
        printf("Cannot open port: %s\n",strerror(errno));
        return -1;      
    }

    sendData(port, "Hello, Arduino!*", 16);

    closePort(port);
    return 0;
}

ard.ino:

int stage = 0;
String recv;
char* line;

char* get_line(void)
{ // '*' is a terminal character
  if (Serial.available() > 0)
  {
    char c = Serial.read();
    if (c=='*')
    {
      char* res = (char*)malloc((recv.length()+1)*sizeof(char));
      recv.toCharArray(res, recv.length()+1);
      stage=1;
      recv="";
      return res;
    }
    else { recv += c; }
  } // if (Serial.available() > 0)
}      

void setup()
{
  Serial.begin(9600); 
}

void loop()
{
  if (stage==0)  
  {
    line = get_line();
  }
  else
  {
    Serial.print("Got line: ");
    Serial.println(line);
    stage = 0;
  }
}

Чтобы проверить, нормально ли работает моя программа, я использую Port Monitor в IDE.

У меня следующая проблема:

Я предпочитаю использовать Arduino IDE 1.8.9, но когда я открываю Port Monitor и запускаю свою программу P C - ничего не работает, P C -prog не может получить доступ к порту и отправить информацию (она говорит Bad file descriptor);

, в то время как с Arduino 2:1.0.5+dfsg2-4.1 все работает нормально, и я вижу на Port Monitor:

Got line: Hello, Arduino!

Поэтому я спрашиваю, что я должен делать с параметрами Arduino IDE 1.8.9 или с /dev/ttyUSB*, чтобы он нормально работал с каждым другой

...