2014-12-28 4 views
1

Я написал код для подключения через последовательный порт mi компьютер к arduino.Последовательный порт в C++, Unix

Это код Arduino в:

#include <Servo.h> 

Servo servo; 
const int pinServo = 2; 
unsigned int angle; 

void setup() 
{ 
    Serial.begin(9600); 
    servo.attach(pinServo); 

    servo.write(0); 

} 

void loop() 
{ 
    if(Serial.available()>0) 
    { 
     angle = Serial.read(); 

     if(angle <= 179) 
     { 
     servo.write(angle); 
     } 
    } 
} 

И это с ++ s:

#include <iostream> 
#include <unistd.h> 
#include <fstream> 
#include <termios.h> 

using namespace std; 

int main() 
{ 
    unsigned int angle; 
    ofstream arduino; 
    struct termios ttable; 

    cout<<"\n\ntest1\n\n"; 

    arduino.open("/dev/tty.usbmodem3a21"); 

    cout<<"\n\ntest2\n\n"; 

    if(!arduino) 
    { 
     cout<<"\n\nERR: could not open port\n\n"; 
    } 
    else 
    { 
     if(tcgetattr(arduino,&ttable)<0) 
     { 
      cout<<"\n\nERR: could not get terminal options\n\n"; 
     } 
     else 
     { 
      ttable.c_cflag &= ~PARENB; 
      ttable.c_cflag &= ~CSTOPB; 
      ttable.c_cflag &= ~CSIZE; 
      ttable.c_cflag |= CS8; 
      ttable.c_cflag &= ~CRTSCTS; 
      ttable.c_cflag |= CREAD | CLOCAL; 
      ttable.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); 
      ttable.c_oflag &= ~OPOST; 
      ttable.c_cc[VMIN] = 0; 
      ttable.c_cc[VTIME] = 0; 

      cfsetospeed(&ttable,9600); 

      if(tcsetattr(arduino,TCSANOW,&ttable)<0) 
      { 
       cout<<"\n\nERR: could not set new terminal options\n\n"; 
      } 
      else 
      { 
       do 
       { 
        cout<<"\n\ninsert a number between 0 and 179"; 
        cin>>angle; 
        arduino<<angle; 
       }while(angle<=179); 

       arduino.close(); 
      } 
     } 
    } 

} 

Он должен быть подключен к Arduino, а затем задать мне число между 0 на 179 а отправить этот номер на Arduino которые включают это число как угол к сервомотору; Но он останавливается на arduino.open("/dev/tty.usbmodem3a21"). Что я могу сделать?

+0

Что вы имеете в виду _ «останавливается» _? Вы получаете исключение, или программа зависает? Можете ли вы подробно рассказать о фактическом поведении. –

+0

Sorry.it усложняет, никаких ошибок нет предупреждений, затем выполняется терминалом, и я вижу результат «test1», а затем программа останавливается, после «test1» нет выхода, нет текста, ничего. И я также точно знаю, что это не вопрос времени. –

+1

Когда вы говорите _ «оно останавливается» _ вы получаете подсказку оболочки назад? Также обратите внимание, что для окончаний строк следует использовать 'std :: endl' вместо' '\ n" '. Вы можете пропустить выходы, если они не покраснели (это то, что 'std :: endl' делает addtitionally vs output' '\ n" '). –

ответ

2

Я думаю, что ваши проблемы возникают в этих строках кода

if(tcgetattr(arduino,&ttable)<0) { 
    // ... 
} 
else { 
    // ... 

    if(tcsetattr(arduino,TCSANOW,&ttable)<0) { 
     // ... 
    } 
} 

Переменная arduino имеет тип ofstream, где tcgetattr() и tcsetattr() ожидают дескриптора файла, полученного с open() в этой точке.

ofstream обеспечивает автоматическое преобразование в bool и, следовательно, int неявно. Предполагало

arduino.open("/dev/tty.usbmodem3a21"); 

прошло нормально, вы эффективно передавая 1 к tcgetattr() и tcsetattr(), который является стандартным дескриптор входного файла.


решение не использовать ofstream для arduino, но обычный файловый дескриптор

int arduino = open("/dev/tty.usbmodem3a21",O_WRONLY); 
+0

Хорошо, спасибо, но еще одна вещь, это настройки флагов, которые подходят только для выхода в ардуины? –

+0

@DaddaBarba Я не знаю много о ардуине. Вам нужно знать о скорости передачи, четности и т. Д. Также я не уверен, что 'angle = Serial.read();' будет ожидать от последовательного порта. Мне кажется, что передача текстовых данных (как вы пытались с помощью 'arduino << angle;') неверна. –

+0

Хорошо, еще раз спасибо. Для серийного.read() arduino должен просто принимать значения te в файле последовательного порта и помещать его в угол, но я также думаю, что будут проблемы beacause angle is int, но я также могу использовать строку для конвертера int, поэтому это не так важно arduino's код, это сделано, чтобы иметь последовательные соединения простым способом –

Смежные вопросы