2016-06-10 72 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); 

使用这些设置即使可能存在某些速度问题,我仍可以与蓝牙进行通信。