2013-10-16 72 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

相關問題