Open serial port with arduino using C ++ with Xcode on Mac

I have already asked a similar question. This is a simple C ++ program that sends an angle to arduino via a serial port, and arduino applies this angle to a servo.

This is C ++ code

#include <iostream> #include <unistd.h> #include <fstream> using namespace std; int main() { unsigned int angle; fstream arduino; cout<<"check-1"; arduino.open("/dev/tty.usbmodem3a21"); cout<<"check-2"; if(arduino) { do { cout<<"\n\ninsert a number between 0 and 179"; cin>>angle; arduino<<angle; }while(angle <= 179); arduino.close(); } else { cout<<"\n\nERROR!!\n\n"; } } 

and this is arduino's:

 #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); } } } 

the problem is that it stops at arduino.open(...) , and I don’t know why, it doesn’t even write “check-1”, and I’m also sure that this is the port selected in the arduino application in tools> serial port.

It may also be useful to know that if I write arduino.open("/dev/tty.usbmodem3a21",iOS::binary) or I write the wrong serial port name, it writes "check-1", "check-2" and "ERROR !!", so the error works.

+5
source share
1 answer

Arduino appears as a serial device. You should look at the open() and close() functions. I did it on Linux, but I'm sure it works the same on Mac. This is an example code snippet. The first fragment opens and sets the file descriptor.

 int fd; // File descriptor // Open port fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY | O_NDELAY); if (fd == -1){ printf("Device cannot be opened.\n"); exit(-1); // If the device is not open, return -1 } struct termios options; fcntl(fd, F_SETFL, FNDELAY); // Open the device in nonblocking mode // Set parameters tcgetattr(fd, &options); // Get the current options of the port bzero(&options, sizeof(options)); // Clear all the options speed_t Speed; switch (baudRate) // Set the speed (baudRate) { case 110 : Speed=B110; break; case 300 : Speed=B300; break; case 600 : Speed=B600; break; case 1200 : Speed=B1200; break; case 2400 : Speed=B2400; break; case 4800 : Speed=B4800; break; case 9600 : Speed=B9600; break; case 19200 : Speed=B19200; break; case 38400 : Speed=B38400; break; case 57600 : Speed=B57600; break; case 115200 : Speed=B115200; break; default : exit(-4); } cfsetispeed(&options, Speed); // Set the baud rate at 115200 bauds cfsetospeed(&options, Speed); options.c_cflag |= ( CLOCAL | CREAD | CS8); // Configure the device : 8 bits, no parity, no control options.c_iflag |= ( IGNPAR | IGNBRK ); options.c_cc[VTIME]=0; // Timer unused options.c_cc[VMIN]=0; // At least on character before satisfy reading tcsetattr(fd, TCSANOW, &options); // Activate the settings 

It just closes it:

 close(fd); 

To read from the actual file descriptor:

 ioctl(fd, FIONREAD, &t1); if(t1 > 0) { // If the number of bytes read is equal to the number of bytes retrieved if(read(fd,pByte, t1) == t1) { for(int i =0; i < t1; i++) { if(pByte[i] != '\r'){ // Just makes sure you're not scanning new lines // TODO: Do what you want with this character } } } } 
0
source

Source: https://habr.com/ru/post/1209736/


All Articles