C#控制Arduino操作舵机
本文通过 USB控制AnduinoC#代码
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");
}
}
}
喜闻乐见 普大喜奔 大神 这个语句是干嘛的什么用处?
private void CallThread()
{
Thread thread = new Thread(new ThreadStart(ReadFun));
thread.IsBackground = true;
thread.Start();
} 我发现你的ARDUINO程序的setup只是拿来设置波特率。是因为上位机的串口程序没办法实现arduino ide中的setup 吧。有什么办法可以改进呢? 罹凝寒冰 发表于 2013-8-8 15:36 static/image/common/back.gif
大神 这个语句是干嘛的什么用处?
private void CallThread()
{
这个用C#的线程去接收Arduino发达来的信息,为了防止介面被卡死。 Mr.Dante 发表于 2013-8-8 16:39 static/image/common/back.gif
我发现你的ARDUINO程序的setup只是拿来设置波特率。是因为上位机的串口程序没办法实现arduino ide中的setup ...
上位机为什么要实现arduino ide中的setup 要通信Arduino必需要事先在第一次启动后设置波持率。
你的意思是要改进啥。。我只是个单片机初学者。。。 wyd1520 发表于 2013-8-8 16:44 static/image/common/back.gif
这个用C#的线程去接收Arduino发达来的信息,为了防止介面被卡死。
哦哦 我的这个是arduino只接收不发送。可以不用考虑界面卡死的 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里面的函数不执行,正在想办法解决。 好东西啊,找了好久了! 这个程序可不可以用来控制电调啊
页:
[1]