2013-10-16 68 views
0

我正在使用Boost Librarys通过串口与Arduno进行通信。我已经在te PC和Arduino上进行了通信课程。目前,Arduino只是收到缓冲区并回显回显。将缓冲区发送给Arduino,损坏的数据

发送和收到的功能如下:

void CommunicationModuleSerial::SendBuffer(char* Buffer, int Size){ 

    Serial.write((uint8_t*)Buffer, Size); 
} 

void CommunicationModuleSerial::RecieveBuffer(char *Buffer, int Size){ 

    for(int i=0;i <sizeof(Size); i++){ 
     Buffer[i] = Serial.read(); 
}; 

而且函数被调用的Ardunio草图(CM是类的实例):

CommunicationModuleSerial CM; 
char Input[10]; 
char Output[10]; 


    while(1){ 

    if (Serial.available() == 10) { 

    CM.RecieveBuffer(Input, 10); 
    CM.SendBuffer(Output, 10); 
    }; 

    //delay(1000); 
    Serial.flush(); 
}; 

在PC端我使用提升,第一个问题是当我用a和b填充缓冲区时。第二个缓冲区保存a和b,但只能保存b。

char InputBuffer[10]; 
char OutputBuffer[10]; 

for(unsigned int i=0; i < sizeof(InputBuffer); i++){ 
    InputBuffer[i] = 'a'; 
} 

for(unsigned int i=0; i < sizeof(OutputBuffer); i++){ 
     OutputBuffer[i] = 'b'; 
} 

cout << "inhoud after filling InputBuffer: " << InputBuffer << endl; 
cout << "inhoud after filling OutputBuffer: " << OutputBuffer << endl;; 

输出内容如下:灌装后INPUTBUFFER inhoud:灌装后OutputBuffer中AAAAAAAAAA inhoud:bbbbbbbbbbaaaaaaaaaa

我的第一个问题是它如何能成为OutputBuffer中alsow包含的?

接下来是一个简单的while循环,它包含发送和接收函数。

while(1){ 

    // Send buffer 
    Serial.SendBuffer(InputBuffer, 10); 

    // Recieve buffer  
    Serial.RecieveBuffer(OutputBuffer, 10); 

    cout << "inhoud OutputBuffer: " << OutputBuffer << endl;; 

} 

的问题是,循环发送操作后几次之后,输出缓冲器还持有BBBBBBBB,里面应该有斌用的覆盖挂起。

在PC端发送和收到的操作如下:

int CommunicationModuleSerial::SendBuffer(char* Buffer, int Size){ 

Buffer[Size+1] = '\0'; 

write(*Port,buffer(Buffer, Size)); 


return COMMSUCCES; 
} 

int CommunicationModuleSerial::RecieveBuffer(char *Buffer, int Size){ 


read(*Port,buffer(Buffer, Size)); 

return COMMSUCCES; 
} 

谁能帮助我这些问题?提前谢谢了。

更新:

感谢Matthias247我已经sovled一些问题。许多感谢Matthias247。我仍然有数据损坏问题。在Ardunio方面,我将收到的缓冲区发回给我。但是当我这样做时,前两个字符具有正确的值(a),但其余的不是。当我在Adruino一侧使用一个不同的输出缓冲区时,我发送回来,我得到所有正确的值。

此外,循环似乎挂了几个发送和收到的PC端。我认为它阻止了接收功能。任何人都可以帮我解决这些问题吗?

提前感谢

回答

0

你的第一个问题是如何COUT的std ::试图打印出您的数据: 它excpecting 0结尾的字符串。但是,您的缓冲区InputBufferOutputBuffer不是以0结尾的。因此std :: cout进一步打印(直到找到任何其他0或由于分段错误导致的崩溃)。因此,你的b是在a之后打印的。

如果你真的想只打印缓冲区使用某物的内容,如他:

cout << "inhoud after filling InputBuffer: "; 
for (int i = 0 ; i < sizeof(InputBuffer) ; i++) cout << InputBuffer[i] << " "; 
cout << endl; 

你有确切的while循环同样的问题。

而且你CommunicationModuleSerial :: SendBuffer还包含一个严重的错误:

Buffer[Size+1] = '\0'; 

您试图assing的值是无效的索引(11) - >这通常也导致段错误/崩溃。在你幸运的情况下,这将写入一个0到OutputBuffer的第一个位置。你甚至不在这里赋值,写函数不关心0终止。

或者,您可以使用11个字符的数组作为两个缓冲区,使用0终止的最后一个字符并仅发送/接收前10个字节(与当前一样)。这种直接将缓冲区分配给cout的方式也可以工作。

Upate:一些进一步的错误是在这里的Arduino的一面:

void CommunicationModuleSerial::RecieveBuffer(char *Buffer, int Size) { 
for(int i=0;i <sizeof(Size); i++){ 
    Buffer[i] = Serial.read(); 
}; 

这里你想读的sizeof(int)的字节 - 所以你只是读取4个字节(或者甚至2上的Arduino)而不是10. i < Size将是正确的。

,另外在while循环:

if (Serial.available() == 10) { 
CM.RecieveBuffer(Input, 10); 
CM.SendBuffer(Output, 10); 
} 

如果PC机发送数据包一次,而是将永远阻止这将无法正常工作。你应该更好地使用if (Serial.available() >= 10) {

+0

感谢Matthias247的大量扩展,仍然有一些数据损坏的问题。我已经把这些置于更新后的姿势,你知道这个问题可能是什么吗? – Roy08

+0

我也更新了我的答案,以突出一些错误 – Matthias247

+0

感谢Matthias247!这解决了我的问题! – Roy08

相关问题