簡體   English   中英

從字符串中提取信息

[英]Extracting info from a string

我一直在嘗試通過“ Assetto Corsa”游戲中的汽車速度來啟動Arduino Servo。 我設法使用共享內存從游戲中提取了實時數據,並試圖通過串行端口將其發送到Arduino。

我還無法在Servo上表示汽車的實際速度,我想知道為什么。 我敢肯定問題出在Arduino代碼上,我可以提取汽車的速度,但不確定如何正確使用它。 也許你可以幫忙嗎?

這是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;
       }
}

輸出屏幕截圖 1個

這是來自的回聲的屏幕截圖

Serial.write(NewAngle);

我用黃色勾勒出了汽車的速度。 我的問題是: 如何從收到的數據中提取這種速度,以與Arduino Servo一起使用?

非常感謝你!

----------更新----------

有用! 非常感謝,這就是我所做的更改:

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

將速度轉換為int並乘以1.0。 看來已經成功了! 這是另一種情況:“不知道為什么它不起作用,更改某些東西,不知道它為什么起作用!”

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

我建議在數字之間插入換行符,以便您知道一個數字在哪里結束而下一個數字在哪里開始。 並注意兩個系統上'\\ n'的區別...您可以顯式發送(char)10(char)13並在接收器中監視相同的字節。 如果某個字符被丟棄,則框架將使您可以重新同步到消息邊界。 這也讓您消除了Arduino方面的delay ,這是一件非常了不起的事情。

一個潛在的問題在這里:

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

該測試的index < MaxChars-1應為index < MaxChars-1因為您為NUL終止添加了另外一個字符。

在xbox上打印接收到的字節時,應在數組元素之間放置定界符: printf("%i,",inData[i])您要查看的數字可以是2和3,或23,或238。

我建議稍作更改:您正在發送一個浮點值,但是隨后您使用atoi將接收到的字符串(在非數字位置停止后)轉換為整數。 在下一次循環中,您將得到尚未閱讀的任何字符。 您也可以將值作為整數發送: (int)(speed*100.0) 這也避免了另外兩個問題:當速度<100.0時,%f3.3將填充空格(Arduino不會尋找這些空格); 速度的小數部分會被截斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM