coolsure 发表于 2011-4-19 07:46:44

发一个我做的亚太机器人电机控制的上位机,原创。

先上个图,PID部分没编好,正在弄,大家感兴趣的话,我弄完那部分,就上传所有代码http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_631941PUK7S6.jpg
(原文件名:1.jpg)

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_631942R7C3O7.jpg
(原文件名:20110419(001).jpg)

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_631943WQ1IKX.jpg
(原文件名:20110419(002).jpg)

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_631944TPA7RH.jpg
(原文件名:20110419(003).jpg)

http://cache.amobbs.com/bbs_upload782111/files_38/ourdev_631945V5E0IR.jpg
(原文件名:20110419.jpg)



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


namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
      String SendString="00";
      bool StopShow =false;
      ushort AutoSendTimer = 100;
      ulong Plotx = 0;
      ulong SpeedPloty = 0;
      bool btnCtrlFlag =false;
      private byte[] CtrlCommand = new byte;      //控制协议,默认一个字节。

      public Form1()
      {
            InitializeComponent();
            CtrlCommand = 0;
      }
      private byte[] HexStringToByteArray(string s)                              
      {
            s = s.Replace(" ", "");                                                
            byte[] buffer = new byte;
            for (int i = 0; i < s.Length; i += 2)
                  buffer = (byte)Convert.ToByte(s.Substring(i, 2), 16);
            return buffer;
      }
      private string ByteArrayToHexString(byte[] data)
      {
            StringBuilder sb = new StringBuilder(data.Length * 3);
            foreach (byte b in data)
                sb.Append(Convert.ToString(b, 16).PadLeft(2, '0').PadRight(3, ' '));
            return sb.ToString().ToUpper();
      }
      private void btnOpen_Click(object sender, EventArgs e)
      {
            if (serialPort.IsOpen)
            {
                if (chkAuto.Checked)
                {
                  MessageBox.Show("请先关闭自动发送!");
                  return;
                }
                serialPort.Close();
                btnOpen.Text = "打开串口";
                Led.Active = false;
            }
            else
            {
                btnOpen.Text = "关闭串口";
                serialPort.BaudRate = int.Parse(cboBaudRate.Text);
                serialPort.PortName = cboPortName.Text;
                serialPort.Open();
                Led.Active = true;
            }
      }

      private void btnSend_Click(object sender, EventArgs e)
      {
            if (serialPort.IsOpen == false)
            {
                chkAuto.Checked = false;
                MessageBox.Show("串口没有打开,请打开串口");
                return;
            }
            else
            {
                if (chkHex.Checked)
                {
                  byte[] data = HexStringToByteArray(SendString);
                  //*************************************************************************
                  //接下来的语句用来处理协议中的发送数据,协议是通过收发十六进制完成。通过修改data[]来完成,数组的大小可以根据协议来设置。
                  //*************************************************************************


                  //*************************************************************************
                  serialPort.Write(data, 0, data.Length);
                }
                else
                {
                  serialPort.Write(SendString);
                }
            }
      }
      private void txtSend_TextChanged(object sender, EventArgs e)
      {
            SendString = txtSend.Text;
      }

      private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
      {
            CheckForIllegalCrossThreadCalls = false;
                if (chkHexShow.Checked == false)
                {
                  string data = serialPort.ReadExisting();
                  
                  if (StopShow == false)
                  {
                        txtReceive.Text += data;
                  }
                }
                else
                {
                  int bytes = serialPort.BytesToRead;
                  byte[] buffer = new byte;
                  serialPort.Read(buffer, 0, bytes);

                  //*************************************************************************
                  //接下来的语句用来处理协议中的接受数据,协议是通过收发十六进制完成。
                  //*************************************************************************
                  Plotx += 1;
                  //速度曲线
                  SpeedPloty = buffer;
                  SpeedPloty <<= 8;
                  SpeedPloty |= buffer;
                  SpeedPointer.Position = SpeedPloty;
                  plot.get_Channel(0).AddXY(Plotx, SpeedPloty);
                  //风速曲线
                  //*************************************************************************

                  if (StopShow == false)
                  {
                        txtReceive.Text += ByteArrayToHexString(buffer);
                  }

                }
      }

      private void btnClear_Click(object sender, EventArgs e)
      {
            txtReceive.Text = "";
      }

      private void btnStop_Click(object sender, EventArgs e)
      {
            StopShow = !StopShow;
            if (StopShow == false)
                btnStop.Text = "停止显示";
            if (StopShow == true)
                btnStop.Text = "开始显示";
      }

      private void txtTimer_TextChanged(object sender, EventArgs e)
      {
            if ((ushort)Convert.ToUInt16(txtTimer.Text) > 0)
                AutoSendTimer = (ushort)Convert.ToUInt16(txtTimer.Text);
            else
                MessageBox.Show("时间必须大于0");
      }

      private void chkAuto_CheckedChanged(object sender, EventArgs e)
      {
            if (serialPort.IsOpen == false)
            {
                MessageBox.Show("串口没有打开,请打开串口");
                if (chkAuto.Checked == true)
                {
                  chkAuto.Checked = false;
                }
                else
                  return;
            }
            else if (chkAuto.Checked == true)
            {

                timer.Enabled = false;
                timer.Interval = AutoSendTimer;
                timer.Enabled = true;
            }
            else
            {
                timer.Enabled = false;
            }
      }

      private void timer_Tick(object sender, EventArgs e)
      {
            if (serialPort.IsOpen == false)
            {
                chkAuto.Checked = false;
                MessageBox.Show("串口没有打开,请打开串口");
                return;
            }
            else
            {
                if (chkHex.Checked)
                {
                  byte[] data = HexStringToByteArray(SendString);
                  //*************************************************************************
                  //接下来的语句用来处理协议中的发送数据,协议是通过收发十六进制完成。通过修改data[]来完成,数组的大小可以根据协议来设置。
                  //*************************************************************************


                  //*************************************************************************
                  serialPort.Write(data, 0, data.Length);
                }
                else
                {
                  serialPort.Write(SendString);
                }
            }
      }

      private void btnCtrl_Click(object sender, EventArgs e)
      {
            if (btnCtrlFlag == false)
            {
                btnCtrlFlag = true;
                Led1.Active = true;
                btnCtrl.Text = "关闭";
                btnFront.Enabled = true;
                btnLeft.Enabled = true;
                btnLeftFront.Enabled = true;
                btnRight.Enabled = true;
                btnRightFront.Enabled = true;
                btnBack.Enabled = true;
                txtSend.Enabled = false;
                btnSend.Enabled = false;
            }
            else
            {
                btnCtrlFlag = false;
                Led1.Active = false;
                btnCtrl.Text = "打开";
                btnFront.Enabled = false;
                btnLeft.Enabled = false;
                btnLeftFront.Enabled = false;
                btnRight.Enabled = false;
                btnRightFront.Enabled = false;
                btnBack.Enabled = false;
                txtSend.Enabled = true;
                btnSend.Enabled = true;
            }
      }
      //*************************************************************************
      //控制机器人运动,协议为一个个字节   0   0   0 | 0   0   0   0   0
      //最高三位标志运动状态,000(停止),001(前进),010(后退),011(左转),100(左前),101(右前),110(右转)
      //第五位是占空比的二分之一,机器人中将占空比二倍,低五位最大是11111,10进制是31,单片机二倍以后是62。
      //*************************************************************************
      

      private void SerialSendHex(string str)
      {
            byte[] data = HexStringToByteArray(str);
            serialPort.Write(data, 0, data.Length);
      }
      private void btnFront_MouseDown(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "前进";
            CtrlCommand |= (1 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnFront_MouseUp(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "停止";
            CtrlCommand &= (0 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnBack_MouseDown(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "后退";
            CtrlCommand |= (2 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnBack_MouseUp(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "停止";
            CtrlCommand &= (0 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }
      private void btnRightFront_MouseDown(object sender, MouseEventArgs e)
      {

            txtStatus.Text = "右前";
            CtrlCommand |= (5 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }
      private void btnRightFront_MouseUp(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "停止";
            CtrlCommand &= (0 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnRight_MouseDown(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "右转";
            CtrlCommand |= (6 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnRight_MouseUp(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "停止";
            CtrlCommand &= (0 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnLeftFront_MouseDown(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "左前";
            CtrlCommand |= (4 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnLeftFront_MouseUp(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "停止";
            CtrlCommand &= (0 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnLeft_MouseDown(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "左转";
            CtrlCommand |= (3<<5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void btnLeft_MouseUp(object sender, MouseEventArgs e)
      {
            txtStatus.Text = "停止";
            CtrlCommand &= (0 << 5);
            CtrlCommand |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
      }

      private void txtPwmOn_TextChanged(object sender, EventArgs e)
      {
            if ((ushort)Convert.ToUInt16(txtPwmOn.Text) < 1)
                MessageBox.Show("占空比太小,不适合调试", "作者提示");
            else if ((ushort)Convert.ToUInt16(txtPwmOn.Text) >= 50)
                MessageBox.Show("占空比大于50,速度太快,不适合调试", "作者提示");
            else
            {
                CtrlCommand = (byte)Convert.ToByte(txtPwmOn.Text);
            }
      }
    }
}

coolsure 发表于 2011-4-19 07:48:35

程序是半成品,简单弄了弄,机器人是三分之一,还没弄伸长机构了。机械正在加工。
等都弄好了,我发上来。
程序比较乱,没整理好,见笑了

jrcsh 发表于 2011-4-19 07:59:30

山的程序和我有得一比了~~~ 哈哈

cqfeiyu 发表于 2011-4-19 13:14:52

代码是C#的吗?

eworker 发表于 2011-4-19 13:32:43

不错,支持!

coolsure 发表于 2011-4-19 15:16:08

回复【3楼】cqfeiyu
-----------------------------------------------------------------------

c#的,山寨成分多,毕竟自己学的是自动化,不是搞软件的,软件算法薄弱。C#是自学的。见笑了。

sytu_xww 发表于 2011-4-19 15:36:03

上工程。。。

FlashNuk 发表于 2011-4-19 15:57:55

上工程哥们

wjd40 发表于 2011-4-19 16:19:00

mark 参考 ,也正在写上位机

coolsure 发表于 2011-4-19 19:07:39

回复【6楼】sytu_xww 芦苇
-----------------------------------------------------------------------

我弄完善了,肯定上。现在还有机器人的码盘没有弄好。把PID加上,上位机就挺好了。

coolsure 发表于 2011-4-19 19:08:28

回复【7楼】FlashNuk
-----------------------------------------------------------------------

我弄完善了,肯定上。现在还有机器人的码盘没有弄好。把PID加上,上位机就挺好了。

raohao101 发表于 2011-4-19 21:26:53

mark!!

sytu_xww 发表于 2011-4-20 08:39:58

关注你绘图和速度的那个控件,可否提供信息?

coolsure 发表于 2011-4-20 15:49:32

回复【12楼】sytu_xww 芦苇
-----------------------------------------------------------------------

控件的安装程序找不到了。我把帮助发上来。我找到安装文件给你,你给我邮箱
点击此处下载 ourdev_632304VRCC2K.rar(文件大小:1.60M) (原文件名:iocompActiveX.rar)

qiu452555846 发表于 2011-4-26 11:41:34

太过瘾了!

sytu_xww 发表于 2011-4-26 17:09:49

回复【13楼】coolsure
-----------------------------------------------------------------------

我的邮箱 sytu_xww    yahoo.com.cn

Bicycle 发表于 2011-4-26 17:44:13

不知LZ pid部分进展怎样了?

diziaihaozhe 发表于 2011-9-8 13:35:49

收藏
页: [1]
查看完整版本: 发一个我做的亚太机器人电机控制的上位机,原创。