极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 34431|回复: 24

C#界面控制arduino舵机。求教,

[复制链接]
发表于 2013-7-30 17:06:27 | 显示全部楼层 |阅读模式
arduino程序如下,我试过,用arduino的监视器可以收到C# 界面发送的L,D,R,U。但是舵机不动  什么原因?
#include <Servo.h>
Servo myservox;  //创建一个水平舵机控制对象
Servo myservoy;   //竖直舵机
int bc=1;
int posx=0;
int posy=0;  
char c;

void setup()
{
  myservox.attach(9); //   shuiping 9jiao
  myservoy.attach(10); // 该舵机由arduino第10脚控制
  Serial.begin(9600);
  myservox.write(0);
  myservoy.write(0);
}

void loop()

{
if(Serial.available())
   c= Serial.read();
  Serial.print(c);
  switch(c)
  {
      case "L":   //left
      while(posx>0&&posx<=180)
      {
      posx=posx-1;
      myservox.write(posx);  
      delay(posx);
      break ;
      }
     case 'R':   //right
     while(posx>=0&&posx<180)
     {
       posx=posx+1;
       myservoy.write(posx);
       delay(posx);
       break;
     }
    case 'U': //up
    while(posy>=0&&posy<90)
    {
       posy=posy+1;
       myservoy.write(posy);
       delay(posy);
       break;
    }
    case 'D':   //down
    while(posy>0&&posy<=90)
    {
       posy=posy-1;
       myservoy.write(posy);
       delay(posy);
       break;
    }
  }
  delay(100);
   
  
}

   
回复

使用道具 举报

发表于 2013-8-1 11:22:17 | 显示全部楼层
c= Serial.read();

有问题,Serial.read()读出来的是string,而c是char,switch没有执行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 15:04:13 | 显示全部楼层
qptimus 发表于 2013-8-1 11:22
c= Serial.read();

有问题,Serial.read()读出来的是string,而c是char,switch没有执行

可是我发的是字母 L  R D U  就发一个字母啊。我把  char c  改成  String C。编译都过不去。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 15:47:43 | 显示全部楼层
罹凝寒冰 发表于 2013-8-1 15:04
可是我发的是字母 L  R D U  就发一个字母啊。我把  char c  改成  String C。编译都过不去。

我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都没动静。。擦擦擦
回复 支持 反对

使用道具 举报

发表于 2013-8-1 16:33:37 | 显示全部楼层
罹凝寒冰 发表于 2013-8-1 15:47
我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都 ...

看看你串口发送端是不是自动加了回车或者换行符,建议用16进制形式仔细查卡自己发送和接受的内容
回复 支持 反对

使用道具 举报

发表于 2013-8-1 16:34:42 | 显示全部楼层
罹凝寒冰 发表于 2013-8-1 15:47
我把cha c改成 int c。把 LRDU 这四个字母改成了1234.用串口调试助手给板子发1234. 板子都 ...

string类型数据在末尾都会有\0结束符,所以即便是你只有一个字符,长度也是2
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 16:59:13 | 显示全部楼层
qptimus 发表于 2013-8-1 16:33
看看你串口发送端是不是自动加了回车或者换行符,建议用16进制形式仔细查卡自己发送和接受的内容

我用串口调试助手发的 应该不加回车或者换行的  十六进制的我也试过  发送十六进制的 arduino串口收到的也是一样的十六进制数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-1 17:03:01 | 显示全部楼层
qptimus 发表于 2013-8-1 16:34
string类型数据在末尾都会有\0结束符,所以即便是你只有一个字符,长度也是2

用char 应该读取的是第一个字符的  按理说我不管发送的是LRDU 还是int 才,1 2 3 4 。应该都可以读到的啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-5 16:57:15 | 显示全部楼层
qptimus 发表于 2013-8-1 16:34
string类型数据在末尾都会有\0结束符,所以即便是你只有一个字符,长度也是2

private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                 serialPort1.Write("U"); //up
                byte[] bytesToSend = new byte[1] ;
                 serialPort1.Write(bytesToSend, 0, 1);

       }   这个是我C# 界面发送字符U的语句 你看有错误吗?
回复 支持 反对

使用道具 举报

发表于 2013-8-5 18:18:25 | 显示全部楼层
罹凝寒冰 发表于 2013-8-5 16:57
private void button1_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsO ...

你发送的是字符串,不是字符
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 08:14:11 | 显示全部楼层
qptimus 发表于 2013-8-5 18:18
你发送的是字符串,不是字符

那我接收用int数组还是 char数组接收呢、?
回复 支持 反对

使用道具 举报

发表于 2013-8-7 15:11:14 | 显示全部楼层
罹凝寒冰 发表于 2013-8-6 08:14
那我接收用int数组还是 char数组接收呢、?

   serialPort1.Write("U"); //up
                 byte[] bytesToSend = new byte[1] ;
                  serialPort1.Write(bytesToSend, 0, 1);
这里写的有问题
你是应改成

   
                 byte[] bytesToSend = new byte[1] ;
                 bytesToSend [0]=(byte)'u';
                  serialPort1.Write(bytesToSend, 0, 1);
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 15:58:22 | 显示全部楼层
wyd1520 发表于 2013-8-7 15:11
serialPort1.Write("U"); //up
                 byte[] bytesToSend = new byte[1] ;
             ...

发送  L R D U 字母控制两个舵机 已经实现了  把所有的while 判断循环删掉就好了  现在要实现串口发送十六进制0x01.0x02.0x03.0x04来控制两个舵机 这个把我难住了。。
回复 支持 反对

使用道具 举报

发表于 2013-8-8 00:15:06 | 显示全部楼层
罹凝寒冰 发表于 2013-8-7 15:58
发送  L R D U 字母控制两个舵机 已经实现了  把所有的while 判断循环删掉就好了  现在要实现串口发送十 ...

Arduino接收是一个字符一个字符的接的。你发16进制与发byte是一样的,直接
bytesp[0]=0x01就是了,
然后在Arduion接收就是byte x=seri.Read()
if(x==1)
xxx
除非你要接收整串的,那要写协议比如0x00做为协议头 0xFF作为结束然后自己在Arduino去做判断就是了。
这个很容易的。如果方便把把你的C#的代码发上来,我也来调试,正好我也要作这方面的通迅
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 08:53:54 | 显示全部楼层
wyd1520 发表于 2013-8-8 00:15
Arduino接收是一个字符一个字符的接的。你发16进制与发byte是一样的,直接
bytesp[0]=0x01就是了,
然后 ...

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;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           
        }

        private void button5_Click(object sender, EventArgs e)
        {
            if(button5.Text == "打开串口")
            {
                button5.Text = "关闭串口";
                serialPort1.Open();
            }
            else
            {
                button5.Text = "打开串口";
                serialPort1.Close();
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            Byte[] BSendTemp = new Byte[1]; //建立临时字节数组对象
            BSendTemp[0] = 3; //由文本框读入想要发送的数据
            serialPort1.Write(BSendTemp, 0, 1);//发送数据       //up
               
       }

        private void button2_Click(object sender, EventArgs e)
        {
            Byte[] BSendTemp = new Byte[1]; //建立临时字节数组对象
            BSendTemp[0] = 4;//由文本框读入想要发送的数据
            serialPort1.Write(BSendTemp, 0, 1);//发送数据     //down
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Byte[] BSendTemp = new Byte[1]; //建立临时字节数组对象
            BSendTemp[0] = 1;//由文本框读入想要发送的数据
            serialPort1.Write(BSendTemp, 0, 1);//发送数据    //left
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Byte[] BSendTemp = new Byte[1]; //建立临时字节数组对象
            BSendTemp[0] =2;//由文本框读入想要发送的数据
            serialPort1.Write(BSendTemp, 0, 1);//发送数据     
        }

      

    }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-9 13:44 , Processed in 0.045100 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表