wyd1520 发表于 2013-8-8 14:06:41

C#控制Arduino操作舵机

本文通过 USB控制Anduino


C#代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Threading;

namespace ArduinoApp
{
    public partial class MainForm : Form
    {
      byte[] buffer = new byte;
      SerialPort serialPort;
      public MainForm()
      {
            InitializeComponent();
      }

      private void Send(byte[] buffer, int count)
      {
            if (serialPort.IsOpen)
            {
                serialPort.Write(buffer, 0, count);
            }
      }
      
      private void btnSend_Click(object sender, EventArgs e)
      {
            int i=int.Parse(txtSend.Text);
         
            if (serialPort.IsOpen)
            {
                serialPort.Write(buffer, 0, 1);
            }
      }

      private void CallThread()
      {
            Thread thread = new Thread(new ThreadStart(ReadFun));
            thread.IsBackground = true;
            thread.Start();
      }

      private void ReadFun()
      {
            while (serialPort.IsOpen)
            {
                string result = serialPort.ReadLine();
                this.Invoke(new MethodInvoker(() => {
                  txtRecive.Text += result + "\r\n";
                }));
            }
      }

      private void MainForm_Load(object sender, EventArgs e)
      {
            serialPort = new SerialPort("COM5", 9600);
            serialPort.Open();
            if (!serialPort.IsOpen)
            {
                txtRecive.Text = "无法连接";
                return;
            }
            CallThread();

      }

      private void btn1_Click(object sender, EventArgs e)
      {
            buffer = 0x01; //2度
            Send(buffer, 1);
      }

      private void btn2_Click(object sender, EventArgs e)
      {
            buffer = 0x02; //90度
            Send(buffer, 1);
      }

      private void btn3_Click(object sender, EventArgs e)
      {
            buffer = 0x03; //179度
            Send(buffer, 1);
      }
    }
}


C# DEMO



Anduino代码

#include <Servo.h>
Servo myservox;//创建一个水平舵机控制对象
int posx=0;
byte b;
void setup()
{
   Serial.begin(9600);
   myservox.attach(9); //   shuiping 9jiao 0-179
}
void loop()
{
if(Serial.available()>0)
{
    b=Serial.read();
    Serial.println(b);
    int r=myservox.read();
   
    if(b==0x01 && r!=2)//判断发送指令0x01 最小2度防止打齿
    {
      myservox.write(2);
      Serial.println("0 Du");
    }
    else if(b==0x02 && r!=90)
    {
       myservox.write(90);
       Serial.println("90 Du");
    }else if(b==0x03 && r!=179)//判断发送指令0x03 最大179度防止打齿
    {
       myservox.write(179);
       Serial.println("179 DU");
    }
}
}

Mr.Dante 发表于 2013-8-8 15:34:51

喜闻乐见 普大喜奔

罹凝寒冰 发表于 2013-8-8 15:36:45

大神 这个语句是干嘛的什么用处?
private void CallThread()
      {
            Thread thread = new Thread(new ThreadStart(ReadFun));
            thread.IsBackground = true;
            thread.Start();
      }

Mr.Dante 发表于 2013-8-8 16:39:45

我发现你的ARDUINO程序的setup只是拿来设置波特率。是因为上位机的串口程序没办法实现arduino ide中的setup 吧。有什么办法可以改进呢?

wyd1520 发表于 2013-8-8 16:44:48

罹凝寒冰 发表于 2013-8-8 15:36 static/image/common/back.gif
大神 这个语句是干嘛的什么用处?
private void CallThread()
      {


这个用C#的线程去接收Arduino发达来的信息,为了防止介面被卡死。

wyd1520 发表于 2013-8-8 16:48:41

Mr.Dante 发表于 2013-8-8 16:39 static/image/common/back.gif
我发现你的ARDUINO程序的setup只是拿来设置波特率。是因为上位机的串口程序没办法实现arduino ide中的setup ...

上位机为什么要实现arduino ide中的setup 要通信Arduino必需要事先在第一次启动后设置波持率。
你的意思是要改进啥。。我只是个单片机初学者。。。

罹凝寒冰 发表于 2013-8-8 17:56:21

wyd1520 发表于 2013-8-8 16:44 static/image/common/back.gif
这个用C#的线程去接收Arduino发达来的信息,为了防止介面被卡死。

哦哦 我的这个是arduino只接收不发送。可以不用考虑界面卡死的

Mr.Dante 发表于 2013-8-9 08:33:04

wyd1520 发表于 2013-8-8 16:48 static/image/common/back.gif
上位机为什么要实现arduino ide中的setup 要通信Arduino必需要事先在第一次启动后设置波持率。
你的意思 ...

内容转自http://tieba.baidu.com/p/2470799464
看文件 \Arduino-1.0.5\hardware\arduino\cores\arduino\main.cpp

这才是真正的主程序起始点。

#include <Arduino.h>
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;)

loop();
if (serialEventRun)
serialEventRun();
}
return 0;
}
楼主你做舵机控制所以没留意到。而我的颜色检测项目是在setup中是加了白平衡函数的,因为只需要做一次白平衡定标即可。但到了上位机通信时,setup里面的函数不执行,正在想办法解决。

吖---明 发表于 2015-8-19 15:05:23

好东西啊,找了好久了!

1339282502 发表于 2016-5-30 21:54:57

这个程序可不可以用来控制电调啊
页: [1]
查看完整版本: C#控制Arduino操作舵机