C#serial命令移动Arduino伺服X度?

时间:2012-05-01 01:04:09

标签: c# serial-port arduino

我有一个Arduino连接伺服(引脚9,5.5v和地面),它将在Arduino上进行任何测试;但是,当我发送一个串行命令来移动它时,没有任何反应。 rx灯闪烁,所以我知道Arduino正在获取信息。我认为问题出在我的字节转换中。

代码时间:

Arduino代码:

#include <Servo.h> 

Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
void setup() 
{ 
    myservo.attach(9); 
    // attaches the servo on pin 9 to the servo object and sets the rotation to 0
    myservo.write(0); 
} 

int pos1= 0;
int pos2= 0;
int pos3= 0;
int totalMove = 0;

void loop() 
{ 
    if (Serial.available() > 0 && totalMove > 0)
    {
        pos1 = Serial.read() - '0'; 
        // pos2 = Serial.read() - '0'; 
        // pos3 = Serial.read() - '0'; 
        // totalMove = ((pos3) + (pos2*10) + pos1*100);

        myservo.write(pos1);
     }
} 

你看到其他的持有者因为我希望能够发送大于9的值,但是现在我只需要让它回应:)

C#代码:

public void moveServo()
{
    if (!serialPort1.IsOpen)
    {
        Console.WriteLine("Oops");
        serialPort1.Open();
        return;
    }

    serialPort1.DtrEnable = true;

    serialPort1.DataReceived += 
        new System.IO.Ports.SerialDataReceivedEventHandler(
            serialPort1_DataReceived);

    serialPort1.Write(new byte[] {57}, 0, 1);
}

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您确定使用其他软件吗?这通常是第一步,即使你必须使用超级终端。这将解决任何电缆问题,并为您提供正确的参数。

我也推荐来自SysInternals的PortMon。它允许您在应用程序运行时监视串行端口活动。

确保您正在设置所有串口参数;波特率,数据位,停止位,奇偶校验,握手以及读写超时。您还可以设置用于NewLine字符的值。

此外,您可以尝试自己阅读,而不是依赖于收到数据的事件。

答案 1 :(得分:1)

您正在发送此字节

serialPort1.Write(new byte[] {57}, 0, 1);

基本上是字符'9'。接收者代码是

pos1 = Serial.read() - '0'; 

表示pos1的值为9(请注意缺少的')。然后将该值直接写入Servo实例。

myservo.write(pos1);

将所有部分汇总:您可以有效地仅将值0到9发送到伺服。但是reference page告诉你write需要0到180的范围。只向伺服发送0到9可能只是稍微摆动一下。

答案 2 :(得分:0)

也许是因为你的逻辑水平。

lpt和串口输出为2.5v,某些驱动需要5v才能设置和复位。

所以你需要像max232这样的ic来将逻辑电平从2.5v转换为5v。