Последовательный порт в C ++, Unix

Я написал код для подключения через последовательный порт, мой компьютер к Arduino.

Это код 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);
}
}
}

И это с ++:

#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") .Что я могу сделать ?

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);
2

Другие решения


По вопросам рекламы [email protected]