2011-11-27 23 views
9

मैंने एक ऐसा एप्लिकेशन विकसित किया जो धारावाहिक बंदरगाह द्वारा एक Arduino के लिए डेटा भेजता है, लेकिन मुझे समझ में नहीं आता कि मैं इसे Arduino पर कैसे प्राप्त कर सकता हूं। मैं Arduino के लिए सीरियल पोर्ट द्वारा एक स्ट्रिंग भेजता हूं और Arduino इसे प्राप्त करता है, लेकिन यह मेरे कोड में काम नहीं करता है (Arduino पर, मुझे एक समय में एक बाइट प्राप्त होता है)।मैं पीसी से एक Arduino में डेटा कैसे प्राप्त कर सकता हूं?

अद्यतन: यह काम कर रहा;)

सी # में कोड है कि भेजता डेटा:

using System; 
using System.Windows.Forms; 

using System.Threading; 
using System.IO; 
using System.IO.Ports; 

pulic class senddata() { 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     //Define a serial port. 
     serialPort1.PortName = textBox2.Text; 
     serialPort1.BaudRate = 9600; 
     serialPort1.Open(); 
    } 

    private void button1_Click(object sender, System.EventArgs e) 
    { 
     serialPort1.Write("10"); //This is a string. The 1 is a command. 0 is interpeter. 
    } 
} 

Arduino कोड:

मैं अद्यतन कोड

#include <Servo.h> 

Servo servo; 
String incomingString; 
int pos; 

void setup() 
{ 
    servo.attach(9); 
    Serial.begin(9600); 
    incomingString = ""; 
} 

void loop() 
{ 
    if(Serial.available()) 
    { 
     // Read a byte from the serial buffer. 
     char incomingByte = (char)Serial.read(); 
     incomingString += incomingByte; 

     // Checks for null termination of the string. 
     if (incomingByte == '0') { //When 0 execute the code, the last byte is 0. 
      if (incomingString == "10") { //The string is 1 and the last byte 0... because incomingString += incomingByte. 
       servo.write(90); 
      } 
      incomingString = ""; 
     } 
    } 
} 
है
+0

शायद एक बेहतर जगह पूछने के लिए: http: //electronics.stackexchange।कॉम/ – vikingosegundo

उत्तर

3

कुछ बातें जो मेरे भौंह उठाने बनाने:

serialPort1.Write("1"); 

यह बिल्कुल एक बाइट, 1, लेकिन कोई नई पंक्ति और कोई अनुगामी NUL-बाइट लिखेंगे। लेकिन यहाँ आप एक अतिरिक्त NUL बाइट के लिए इंतजार कर रहे हैं:

if (incomingByte == '\0') { 

आप Write के बजाय WriteLine का उपयोग करना चाहिए, और \n बजाय \0 के लिए प्रतीक्षा करें।

यह दो साइड इफेक्ट:

पहले: वहाँ है तो कुछ बफरिंग कॉन्फ़िगर किया गया है, तो एक निश्चित मौका, एक नई लाइन Arduino के लिए बफ़र डेटा धक्का होगा की तुलना में है। यह सुनिश्चित करने के लिए आपको एमएसडीएन में दस्तावेज़ों के माध्यम से खोदना होगा।

दूसरा: यह आपके प्रोटोकॉल को केवल ASCII बनाता है। आसान डीबगिंग के लिए यह महत्वपूर्ण है। इसके बाद आप Hyperterm या HTerm (संपादित) या यहां तक ​​कि सीरियल मॉनिटर Arduino आईडीई अपने आप में (संपादित) की तरह एक सादे टर्मिनल प्रोग्राम का उपयोग अपने सी # कोड में कीड़े के बारे में चिंता किए बिना अपने Arduino-कोड डिबग करने के लिए कर सकते हैं। और जब Arduino कोड काम करता है तो आप सी # भाग पर ध्यान केंद्रित कर सकते हैं। विभाजित और impera।

संपादित करें: एक और बात मैं अपने खुद के Arduino बाहर खुदाई के बाद देखा:

incomingString += incomingByte; 
.... 
if (incomingByte == '\n') { // modified this 
    if(incomingString == "1"){ 

निश्चित रूप से हो जाएगा ताकि अपेक्षा के अनुरूप काम नहीं है, क्योंकि स्ट्रिंग में शामिल होंगे "1 \ n" इस बिंदु पर। या तो आप if के बाद "1 \ n" की तुलना करें या += लाइन को स्थानांतरित करें।

+0

काम न करें! :( – FredVaz

+0

क्या आपने Arduino डीबग करने के लिए टर्मिनल प्रोग्राम का प्रयास किया था? –

+0

सीरियल मॉनिटर? हाँ, मैं कोशिश करता हूं। – FredVaz

1

आप वैकल्पिक रूप से Firmata library का उपयोग कर की कोशिश कर सकते हैं - यह Arduino पर मानक फर्मवेयर होने और से

.net

मेरा मानना ​​है कि यह प्रबंधन के लिए एक बहुत अच्छा तरीका है, Firmata 2.0+ I2C और इमदादी नियंत्रण के लिए समर्थन हासिल है।

http://firmata.org/

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^