0

開始,這可能不是arduino代碼或arduino的問題,但我想我會在這裏發佈,因爲我真的不知道什麼是錯的。計算機通過串行更改值Arduino兆豐

我正在從事這個項目只是爲了好玩,從鍵盤發送按鍵,通過計算機,並通過USB到我的arduino巨型。這裏沒有額外的硬件,只有電腦,arduino和USB電纜。

我正在使用Microsoft Visual Studio Express 2012編寫代碼來接收按鍵筆劃並將它們發送到USB。這是我正在使用的代碼:

#include "stdafx.h" 
#include "conio.h" 

using namespace System; 
using namespace System::IO::Ports; 

int main(array<System::String ^> ^args) 
{ 
    String^ portName; 
    String^ key; 
    int baudRate=9600; 
    Console::WriteLine("type in a port name and hit ENTER"); 
    portName=Console::ReadLine(); 
    //arduino settings 
    SerialPort^ arduino; 
    arduino = gcnew SerialPort(portName, baudRate); 
    //open port 
    try 
    { 
     arduino->Open(); 

    while(1) 
    { 
     int k = getch(); 
     key = k.ToString(); 
     Console::WriteLine(key); 
     arduino->Write(key); 
     if (k == 32) 
      return 0; 
    } 

} 
catch (IO::IOException^ e) 
{ 
     Console::WriteLine(e->GetType()->Name+": Port is not ready"); 
    } 
} 

此代碼工作正常,並將命令發送到arduino。我也可以問這個問題,但是在35次擊鍵後,它只是停止發送擊鍵,我不確定爲什麼,但這不是一個arduino問題(我不認爲)。

所以當密鑰的確定值被髮送到arduino時,它會改變。例如,分配給用於按數字1和2的變量鍵的值分別爲49和50。但是,當他們被髮送到arduino時,值如何不同。 1現在是57歲,2歲現在是48歲。我不確定爲什麼會發生這種情況。我試圖4和5以及它們都具有它們的值向下移位2像鑰匙2。這是我對Arduino的代碼:

int ledPin = 13; 
int key=0; 
int c; 
void setup() 
{ 
    pinMode(ledPin, OUTPUT); // pin will be used to for output 
    Serial.begin(9600); // same as in your c++ script 
} 

void loop() 
{ 
    if (Serial.available() > 0) 
    { 
    key = Serial.read(); // used to read incoming data 
    if (key == 57) 
    { 
     digitalWrite(ledPin, HIGH); 
    } 
    else if (key == 48) 
    { 
     digitalWrite(ledPin, LOW); 
    } 
    } 
    c = key; 
    Serial.println(c); 
} 

截至目前它僅僅是切換光開和關。我希望能夠涉及更多的按鍵,並保證值的一致性會非常方便。無論如何,如果任何人都可以幫助我,爲什麼價值是不同的,這將是真棒。我對編程並不是全新的,但我當然不是專家,也沒有太多進入先進的東西。

謝謝任何​​幫助或建議。

回答

0

這與您通過visual studio發送的內容有關。您正在將按鍵轉換爲其ASCII值,然後將該ASCII值轉換爲字符串,然後通過串行發送該字符串。 arduino期待一個數字,而不是一個字符串。例如,如果按下1鍵,你的視覺工作室代碼將其轉換爲49號ASCII碼,然後轉換爲Arduino收到的字符串「49」 - 但由於您發送的是「49」,因此,這是一個「4」和「9」,Arduino讀數爲9,相當於57,正如你所見。

類似地,按2會將其轉換爲「50」,而Arduino會讀取與您獲得的值48相對應的「0」。

要解決此問題,請直接發送號碼,不要將其轉換爲字符串。

+0

好的,這是有道理的,但是,當我把它作爲一個整數,但我不能將它發送到arduino。有些東西不能將int轉換爲字符串。如何使用IO :: Ports:WriteLine發送一個int值?我一直在尋找,但我找不到任何例子。 – Ben

+0

你可以這樣發送一個字符串:當你按1時,getch()返回一個數字,但是把這個數字轉換成字符串「1」並且發送「1」給Arduino。應該有一些功能將ASCII值映射回按下的實際按鍵。或者如果k == 49 myString =「1」 – user2461391