2014-12-27 24 views
1

在一个基于unix的软件上,它必须发送一个介于0到179之间的数字给arduino,并且arduino会将该数字作为一个角度应用于伺服电机,但我不知道参数是什么必须在terminos结构中更改以允许串行通信。struct termios设置与arduino的串行通信

这是C++代码:

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

using namespace std; 

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

    //cout<<"test-1"; 

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

    //cout<<"test-2"; 

    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 
     { 

      //there goes the terminal options setting for the output; 

      ttable.c_cflag = -hupcl //to prevent the reset of arduino 

      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的公司:

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

所以就请你告诉我我有什么改变 “的TTable”?

回答

0

一些东西一样,对termios的是最好的选择

options.c_cflag &= ~CRTSCTS;  
options.c_cflag |= (CLOCAL | CREAD);     
options.c_iflag |= (IGNPAR | IGNCR);     
options.c_iflag &= ~(IXON | IXOFF | IXANY);   
options.c_oflag &= ~OPOST; 

options.c_cflag &= ~CSIZE;    
options.c_cflag |= CS8;    
options.c_cflag &= ~PARENB;   
options.c_iflag &= ~INPCK;   
options.c_iflag &= ~(ICRNL|IGNCR); 
options.c_cflag &= ~CSTOPB;  
options.c_iflag |= INPCK;  
options.c_cc[VTIME] = 0.001; // 1s=10 0.1s=1 * 
options.c_cc[VMIN] = 0;