2016-06-10 48 views
0

我試圖從Arduino Uno sendo數據到RaspberryPi 3B。一旦Raspberry請求他們,我需要從Arduino發送14個int(最大值:6000)。這14個數字中的每一個都來自ad ADC(SPI通信)。Arduino和Raspberry之間的串行通信錯誤的數據傳輸

ARDUINO SIDE

#include "SPI.h" 
byte incomingByte = 0; // for incoming serial data 

const int N_SENSORI=14; 
const int DATAOUT = 11; 
const int DATAIN = 12; 
const int SPICLOCK = 13; 
const int SLAVESELECT = 10; 

//===============SPI COMMUNICATION================ 
short write_read_spi16(short what) { 
    digitalWrite(SS, LOW); 
    short res = SPI.transfer16(what); 
    digitalWrite(SS, HIGH); 
    return res; 
} 

//===============CONVERT INT IN BYTE AND SEND IT================ 
void longInt2Byte(int x){ 
    unsigned char buf[sizeof(int)]; 
    memcpy(buf,&x,sizeof(int)); 
Serial.write(buf,sizeof(buf)); 

} 
//======================================= 

void setup() { 

    Serial.begin(115200);  
    SPI.begin(); 
    pinMode(DATAOUT, OUTPUT); 
    pinMode(DATAIN, INPUT); 
    pinMode(SPICLOCK,OUTPUT); 
    pinMode(SLAVESELECT,OUTPUT); 
} 
void loop() { 


if (Serial.available() > 0) {   
    incomingByte= Serial.read(); 

    if (incomingByte=='E') { 

    write_read_spi16(0b1000001101110000); //THIS IS FOR THE ADC COMMUNICATION 

    for (int i = 1; i<N_SENSORI+1; i++) { //DONE 14 TIMES. 
     short s = write_read_spi16(0b1000001101110000 | (i<<10)); 
     int Data = s&0xFFF; 
     longInt2Byte(Data); 
     }  
     } 
}} 

// C++ SIDE

void stimulationController::SetupDario(){ 

    cout<<"Dentro al setupDario"<<endl<<flush; 
    buffer=new char [1000]; 
    const char* _portNameSensorsDario="/dev/ttyACM1"; 
    //SERIAL PORT FOR HAND SENSORS 
    struct termios options; 
    SerialHandleSensors=open(_portNameSensorsDario, O_RDWR | O_NOCTTY | O_NDELAY); //SerialHandleSensors=open(_portNameSensors, O_RDWR | O_NOCTTY | O_NDELAY); non blocking 
    if (SerialHandleSensors == -1) 
    { 
     cout<<endl<<"......ERROR: Unable to open: "<<_portNameSensorsDario<<endl; 
     return; 
    } 
    else 
    { 
     fcntl(SerialHandleSensors, F_SETFL,0); 
     cout<<"......OPENED PORT: Succesfully opened: "<<_portNameSensorsDario<<endl; 
    } 

    //GET THE OPTIONS, MODIFY AND SET 
    tcgetattr(SerialHandleSensors,&options); 
    cfsetispeed(&options,B115200); //BAUD RATE IN 
    cfsetospeed(&options,B115200); //BAUD RATE OUT 
    // options.c_lflag |= (ICANON | ECHO | ECHOE); 
    options.c_cflag |= (CLOCAL | CREAD); 
    options.c_cflag &= ~PARENB; 
    options.c_cflag |= CSTOPB; 
    options.c_cflag &= ~CSIZE; 
    options.c_cflag |= CS8; 
    tcsetattr(SerialHandleSensors,TCSANOW,&options); 

    usleep(3000000); 
cout<<"Fine Setup"<<endl<<flush; 
} 



int stimulationController::Dario() 
{ 

    { 
    cout<<" NUOVA FUNZIONE"<<endl; 


unsigned char bytes[4]; 
    bytes[0]=0x45; // 'E' 

    int tempWrite=write(SerialHandleSensors,bytes,1); 
    if(tempWrite==-1) 
    { 
     cout<<"......ERROR: PROBLEM WRITING TO ROBOTIC HAND"<<endl; 
     failure=true; 
     return 0; 

    } 

    int value=0; 


    int tempRead=read(SerialHandleSensors,buffer,28); 
    if(tempRead==-1) 
    { 
     cout<<"......ERROR: PROBLEM READING FROM ROBOTIC HAND"<<endl; 
     failure=true; 
     return 0; 
    } 


int j=0; 
for(int i=0; i<28; i=i+2){ 
    value= buffer[i] | ((int)buffer[i+1]<<8); 
    //ensorDataFoot.push_back(value); //Aggiunge un elemento 
    j=j+1; 
     cout<<"Dato "<<j <<"vale: "<<value<<endl<<flush; 
    } 

    return value; 

} 
} 

的問題是,或覆盆子側一段時間將打印權值,一些時間(大部分的時間,實際上)它沒有。數據似乎重複或(例如2000年2500例)。

我無法弄清楚問題所在。請問發送數據的請求和閱讀的時間有關嗎?如果是這樣,有辦法擺脫它?

我爲了增加使用do while循環,以確保所有的28個字節讀

int TotByte=28; 
int ByteRead=0; 
int TempRead=0; 

do{ TempRead= read(SerialHandleSensors, buffer, (TotByte-ReadByte)); 
ReadByte= ReadByte+TempRead; 
cout<<"ReadByte is: "<<ReadByte<<endl<<flush; 
}while(ByteRead<TotByte); 

輸出:

ReadByte is: 5 
ReadByte is: 15 
ReadByte is: 25 

,然後留樣,沒有做任何事情

+0

感謝您編輯社區wiki答案。如果你想自己發佈它(所以你可以自由編輯它並獲得潛在的聲望點),然後張貼它的另一個副本,讓我知道,所以我可以刪除當前的。 – halfer

回答

0

(代表OP的發佈回答):

我明白了;問題是串口的設置。爲了將來的參考,這裏是工作版本。

bufferTemp=new char [1000]; 
    bufferDEF = new char[1000]; 
    const char* _portNameSensorsBT="/dev/rfcomm0"; 

    struct termios options; 
    SerialHandleSensorsFoot=open(_portNameSensorsBT, O_RDWR); //SerialHandleSensors=open(_portNameSensors, O_RDWR | O_NOCTTY | O_NDELAY); non blocking 
    if (SerialHandleSensorsFoot == -1) 
    { 
     cout<<endl<<"......ERROR: Unable to open: "<<_portNameSensorsBT<<endl; 
     return 0; 
    } 
    else 
    { 
     fcntl(SerialHandleSensorsFoot, F_SETFL,0); 
     cout<<"......OPENED PORT: Succesfully opened: "<<_portNameSensorsBT<<endl; 
    } 

    //GET THE OPTIONS, MODIFY AND SET 
    tcgetattr(SerialHandleSensorsFoot,&options); 
    cfsetispeed(&options,B115200); //BAUD RATE IN 
    cfsetospeed(&options,B115200); //BAUD RATE OUT 
    // options.c_lflag |= (ICANON | ECHO | ECHOE); 

    options.c_iflag = IGNBRK | IGNPAR; 
    options.c_oflag = 0; 
    options.c_lflag = 0; 

    options.c_cflag |= (CLOCAL | CREAD); 
    options.c_cflag &= ~PARENB; 
    options.c_cflag |= CSTOPB; 
    options.c_cflag &= ~CSIZE; 
    options.c_cflag |= CS8; 
    tcsetattr(SerialHandleSensorsFoot,TCSAFLUSH,&options); 

    usleep(5000000); 

使用這些設置即使可能存在某些速度問題,我仍可以與藍牙進行通信。