2016-04-15 185 views
0

我一直在試圖用遊戲「Assetto Corsa」中的汽車速度驅動Arduino舵機。我設法使用共享內存從遊戲中提取實時數據,並試圖通過串行端口將它發送到Arduino。從字符串中提取信息

我還沒有設法表示汽車在伺服上的實際速度,我想知道爲什麼。我很確定問題來自於Arduino Code,我可以提取汽車的速度,但我不確定如何正確使用它。也許你可以幫忙?

這是Arduino的代碼片段:

char inData[8];  
char inChar; // Where to store the character read 
byte index = 0; // Index into array; where to store the character 
int angle = 0; 
int newAngle = 0; 
int MaxChars = sizeof(inData); 
char ch; 


     while (Serial.available()) 
     { 
     char ch = Serial.read(); 
     Serial.write(ch); 
     if (index < MaxChars && isDigit(ch)) 
     { 
      inData[index++] = ch; 
     } 
     else 
     { 
      inData[index] = 0; 
      newAngle = atoi(inData); 
      Serial.write(newAngle); 
      if (newAngle > 0 && newAngle < 180) 
      { 
      if (newAngle < angle) 
       for (; angle > newAngle; angle -= 1) 
       { 
       myServo.write(angle); 
       } 
      else 
       for (; angle < newAngle; angle += 1) 
       { 
       myServo.write(angle); 
       } 
      } 
      index = 0; 
      angle = newAngle; 
      delay(1000); 
     } 
     } 

這是我使用從遊戲中提取信息,並將其發送到Arduino代碼:

while (true) 
{ 

    snprintf(Data, sizeof(Data)-1, "%3.3f", pf->speedKmh); 

    SP->WriteData(Data, sizeof(Data));    

    std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 

    int readResult = SP->ReadData(inData, sizeof(inData)); 

     printf("\t Bytes read: %i\n",readResult); 

     for (int i = 0; i < sizeof(inData); i++) 
     { 
      printf("%i", inData[i]); 
      inData[i] = 0; 
     } 
} 

Output screenshot1

這是來自

的回顯截圖
Serial.write(NewAngle); 

我用黃色概述了汽車的速度。我的問題是:如何從我收到的數據中提取此速度以便與Arduino伺服器一起使用?

非常感謝!

---------- ---------- UPDATE

它的工作原理!非常感謝,這是我改變的:

snprintf(Data, sizeof(Data)-1, "%3.3f", (int)(pf->speedKmh)*1.0); 

將速度鑄造成一個int並乘以1.0。這似乎已經成功了! 「不知道爲什麼它不起作用,改變一些東西,不知道它爲什麼起作用!」

+0

'inData'的內容是什麼? newAngle'的類型和價值是什麼?預期輸出是什麼(可以將實際輸出複製粘貼爲文本而不是圖像)? –

+0

@JoachimPileborg 'inData'收到什麼 'WriteData' 發送給它。用於此目的的庫可在[here]找到(http://playground.arduino.cc/Interfacing/CPPWindows)。 我已編輯帖子以包含Arduino代碼的變量聲明。 我不確定如何獲得文本輸出,這就是爲什麼我截圖:/ – Frazic

+0

我用來提取數據的共享內存庫可以在這裏找到(http://www.assettocorsa.net/forum /index.php?threads/shared-memory-reference-31-03-2016.3352/) – Frazic

回答

2

主要問題是這些短消息(只是一個數字)沒有任何框架。延遲或睡眠不算作成幀,因爲兩個系統的時間不同步。

我會建議在數字之間加一個換行符,這樣你就可以知道一個數字在哪裏結束,下一個在哪裏開始。注意兩個系統上'\ n'的區別......你可以明確地發送一個(char)10(char)13並觀察接收器中的相同字節。如果一個字符被丟棄,框架將允許您重新同步到消息邊界。這也可以讓你消除Arduino方面的delay,這是一件非常好的事情。

一個潛在的問題是在這裏:

if (index < MaxChars&& isDigit(ch)) 
{ 
    inData[index++] = ch; 
} 
else 
{ 
    inData[index] = 0; 

測試應該是index < MaxChars-1因爲你添加一個字符爲NUL終止。

在xbox上打印接收到的字節時,應該在數組元素之間加上分隔符:printf("%i,",inData[i])您正在查看的數字可能是2和3或23或238。

我微小的變化我建議:你發送一個浮點值,但是你接收的字符串(在停止在非數字後)轉換爲一個整數與atoi。下一次循環時,你會得到你還沒看過的任何字符。您也可以將值作爲整數發送:(int)(speed*100.0)。這也避免了另外兩個問題:當速度爲< 100.0時,%f3.3會填充空格(Arduino不查找這些);速度的小數部分會被截斷。

+0

index

+0

關於構圖,你是對的。我會更進一步,將數字放在'<' and '>'字符之間,並忽略任何不是這樣的框架。 –

+0

嗨!感謝你的回答!雖然我不明白,但它確實有點幫助^^。你有沒有關於如何在字符串到達​​Arduino後「打破」字符串的提示,以便只保留表示速度的數字? – Frazic