C#與Arduino通過串口通信來控制LED燈的狀態


一、引言

      最近擺弄了一段時間的Arduino,發現Arduino做一些電子類項目、監控、機器人、電子玩具比較容易,並且Arduino與.NET程序集成也不難。接下來介紹一個簡單的小程序,C#做的一個Windows Form程序,通過.NET串口編程與Arduino通信,來控制LED燈的狀態,以此演示C#與Arduino串口通信的方法。

二、功能演示

    這個小程序功能極其簡單,運行Windows Form程序,點擊“開燈”單選框則點亮與Arduino相連的LED燈,點擊“關燈”單選框則熄滅LED燈,圖下2圖所示:

  

三、實現機制

  1. C#程序向Arduino使用的串口COM4(可通過操作系統的控制面板查看Arduino使用的串口號)輸出命令字符:1—表示點亮,0—表示熄滅;
  2. Arduino讀取串口接收到的命令字符,如果讀到的字符為1則向LED所在針腳pin 13輸出高電平點亮LED燈,如果讀到的字符為0則輸出低電平熄滅LED燈。 

四、開發環境

  1. Arduino 1.0.5 IDE
  2. Visual studio 2010

五、所需元件

  1. Arduino UNO板1塊(必需)
  2. Arduino UNO板與電腦相連的USB線1根(必需)
  3. LED燈1個(可選)
  4. 面包板1塊(可選)
  5. 10K電阻1個(可選)
  6. 跳線2根(可選)

注:Arduino UNO板在pin 13自帶了1個LED燈,可以用此燈代替單獨的LED燈,所以面包板、LED燈等為可選元件。

六、元件連接

    元件連接很簡單:LED燈的正極與Arduino的數字針腳pin 13相連,電阻與LED串聯,然后接回Arduino的GND,最后用USB線把Arduino板與電腦相連,如上圖所示。

七、C#實現代碼

    創建一個Windows Form,拖放2個單選框,編寫Windows Form后台代碼,利用.NET的SerialPort類進行串口操作: 

 1 public partial class Form1 : Form
 2     {
 3         SerialPort port;
 4 
 5         public Form1()
 6         {
 7             InitializeComponent();
 8 
 9             this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
10 
11             if (port == null)
12             {
13                 //COM4為Arduino使用的串口號,需根據實際情況調整
14                 port = new SerialPort("COM4", 9600);
15                 port.Open();
16             }
17         }
18 
19         void Form1_FormClosed(object sender, FormClosedEventArgs e)
20         {
21             if (port != null && port.IsOpen)
22             {
23                 port.Close();
24             }
25         }        
26 
27         //點亮
28         private void rbOpen_CheckedChanged(object sender, EventArgs e)
29         {
30             if (this.rbOpen.Checked)
31             {
32                 PortWrite("1");
33             }
34         }
35 
36         //熄滅
37         private void rbClose_CheckedChanged(object sender, EventArgs e)
38         {
39             if (this.rbClose.Checked)
40             {
41                 PortWrite("0");
42             }
43         }
44 
45         //向串口輸出命令字符
46         private void PortWrite(string message)
47         {
48             if (port != null && port.IsOpen)
49             {
50                 port.Write(message);
51                 //port.WriteLine(message);
52             }
53         }
54     }

 八、Arduino Sketch代碼

    讀取串口接收到的字符,並根據字符向pin 13輸出高電平或低電平,對LED燈進行點亮或熄滅控制:

const int LedPin = 13;
int ledState = 0;

void setup()
{ 
  pinMode(LedPin, OUTPUT);
  
  Serial.begin(9600);  
}

void loop()
{ 
    char receiveVal;   
   
    if(Serial.available() > 0)
    {        
        receiveVal = Serial.read();
        
       if(receiveVal == '1')    
          ledState = 1;   
       else
          ledState = 0;     
    }   
      
    digitalWrite(LedPin, ledState); 
      
    delay(50);    
} 

 九、總結

    本文通過一個簡單的例子,演示了C#與Arduino通過串口通信來控制LED燈狀態的機制,總共幾十行代碼就搞定,體現了Arduino開發簡單的宗旨。當然本例子只實現了C#程序向Arduino發數據的單向通信,真實的系統還可根據需要實現Arduino向C#發送數據的雙向通信。

    Arduino與.NET兩者集成可以發揮兩個平台的長處:Arduino擅長控制硬件設備與各類傳感器;而.NET則擁有強大的數據處理能力、通信功能、以及美觀的程序界面。當然,通過USB線實現Arduino與PC之間的串口通信,由於需要與PC連線且USB線的長度往往有限,所以這些因素制約了其應用。但是,Arduino與PC之間還有其他的通信方式,比如以太網線、Wifi、藍牙等,極大的提高了Arduino的應用范圍。

    寫文章真的比較耗時間,所以一直就不怎么喜歡寫文章。今天就寫到這,后面有時間的話會陸陸續續寫一些關於Arduino應用與開發等各個方面的文章。

十、參考資料

  1. Arduino官網
  2. Arduino Cookbook
  3. Arduino in Action
  4. Beginning Arduino
  5. Arduino Internals
  6. Arduino Workshop: A Hands-On Introduction with 65 Projects
  7. Exploring Arduino: Tools and Techniques for Engineering Wizardry
  8. Pro Arduino
  9. Arduino Robotics
  10. Building Wireless Sensor Networks: with ZigBee, XBee, Arduino, and Processing
  11. Arduino and Kinect Projects: Design, Build, Blow Their Minds
  12. Arduino Wearables

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM