[英]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;
}
}
輸出屏幕截圖 :
這是來自的回聲的屏幕截圖
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.