控制器通过串行接口接收到命令,但机器人手臂不动

时间:2016-05-18 22:51:00

标签: c# serial-port robot

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


namespace SerialPort
{
    public partial class Form1 : Form
    {

    public Form1()
    {
        InitializeComponent();
        cmdClose.Enabled = false;
        foreach (String s in System.IO.Ports.SerialPort.GetPortNames()) 
        {
            txtPort.Items.Add(s);
        }
    }

    public System.IO.Ports.SerialPort sport;

    public void serialport_connect(String port, int baudrate , Parity parity, int databits, StopBits stopbits) 
    {
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();

        sport = new System.IO.Ports.SerialPort(
        port, baudrate, parity, databits, stopbits);
        try
        {
            sport.Open();
            cmdClose.Enabled = true;
            cmdConnect.Enabled = false;
            txtReceive.AppendText("[" + dtn + "] " + "Connected\n");
            sport.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived);
        }
        catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error"); }
    }

    private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e)  
    {
        this.BeginInvoke(new Action(() =>
        {
            DateTime dt = DateTime.Now;
            String dtn = dt.ToShortTimeString();       
            txtReceive.AppendText("[" + dtn + "] " + "Received: " + sport.ReadExisting() + "\n");
        }));
    }

    private void cmdConnect_Click(object sender, EventArgs e)
    {
        String port = txtPort.Text;
        int baudrate = Convert.ToInt32(cmbbaudrate.Text);
        Parity parity = (Parity)Enum.Parse(typeof(Parity), cmbparity.Text);
        int databits = Convert.ToInt32(cmbdatabits.Text);
        StopBits stopbits = (StopBits)Enum.Parse(typeof(StopBits), cmbstopbits.Text);

        serialport_connect(port, baudrate, parity, databits, stopbits);

    }

    private void button1_Click(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();
        String data = txtDatatoSend.Text;
        sport.Write(data);
        txtReceive.AppendText("[" + dtn + "] " + "Sent: " + data + "\n");
    }

    private void cmdClose_Click_1(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();

        if (sport.IsOpen) 
        {
            sport.Close();
            cmdClose.Enabled = false;
            cmdConnect.Enabled = true;
            txtReceive.AppendText("[" + dtn + "] " + "Disconnected\n");
        }
    }
}

}

enter image description here

通过串口发送命令后如图所示,我的机器人根本不动。但是,如果我关闭visual studio并打开名为Roboteq的软件,我的机器人将按照我之前发送的命令移动,甚至没有加载Roboteq中的端口。知道为什么会这样吗?我认为控制器肯定收到了我的命令,但不知何故它没有执行,也许打开Roboteq使它执行。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您的设备是否要求命令以换行符终止?

    sport.WriteLine(data);

https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.writeline(v=vs.110).aspx

答案 1 :(得分:0)

您可能需要先设置电动机模式(“ ^ MMOD 6 \ r”),然后将串行看门狗超时更改为5秒钟左右(“ ^ RWD 5000 \ r”),否则G命令将变为立即取消。然后您将可以发出G命令

0:开环 1:闭环速度 2:相对于闭环位置 3:闭环计数位置 4:闭环位置跟踪 5:扭矩 6:闭环速度位置

相关问题