搜索
bottom↓
回复: 17

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

[复制链接]

出0入0汤圆

发表于 2011-4-19 07:46:44 | 显示全部楼层 |阅读模式
先上个图,PID部分没编好,正在弄,大家感兴趣的话,我弄完那部分,就上传所有代码
(原文件名:1.jpg)


(原文件名:20110419(001).jpg)


(原文件名:20110419(002).jpg)


(原文件名:20110419(003).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[1];      //控制协议,默认一个字节。

        public Form1()
        {
            InitializeComponent();
            CtrlCommand[0] = 0;
        }
        private byte[] HexStringToByteArray(string s)                              
        {
            s = s.Replace(" ", "");                                                
            byte[] buffer = new byte[s.Length / 2];
            for (int i = 0; i < s.Length; i += 2)
                    buffer[i / 2] = (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[bytes];
                    serialPort.Read(buffer, 0, bytes);

                    //*************************************************************************
                    //接下来的语句用来处理协议中的接受数据,协议是通过收发十六进制完成。
                    //*************************************************************************
                    Plotx += 1;
                    //速度曲线
                    SpeedPloty = buffer[0];
                    SpeedPloty <<= 8;
                    SpeedPloty |= buffer[1];
                    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[0] |= (1 << 5);
            CtrlCommand[0] |= (byte)Convert.ToByte(txtPwmOn.Text);
            serialPort.Write(CtrlCommand, 0, CtrlCommand.Length);
        }

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

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

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

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

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

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

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

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

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

        private void btnLeft_MouseUp(object sender, MouseEventArgs e)
        {
            txtStatus.Text = "停止";
            CtrlCommand[0] &= (0 << 5);
            CtrlCommand[0] |= (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[0] = (byte)Convert.ToByte(txtPwmOn.Text);
            }
        }
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2011-4-19 07:48:35 | 显示全部楼层
程序是半成品,简单弄了弄,机器人是三分之一,还没弄伸长机构了。机械正在加工。
等都弄好了,我发上来。
程序比较乱,没整理好,见笑了

出0入0汤圆

发表于 2011-4-19 07:59:30 | 显示全部楼层
山的程序和我有得一比了~~~ 哈哈

出0入0汤圆

发表于 2011-4-19 13:14:52 | 显示全部楼层
代码是C#的吗?

出0入0汤圆

发表于 2011-4-19 13:32:43 | 显示全部楼层
不错,支持!

出0入0汤圆

 楼主| 发表于 2011-4-19 15:16:08 | 显示全部楼层
回复【3楼】cqfeiyu
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-4-19 15:36:03 | 显示全部楼层
上工程。。。

出0入0汤圆

发表于 2011-4-19 15:57:55 | 显示全部楼层
上工程哥们

出0入0汤圆

发表于 2011-4-19 16:19:00 | 显示全部楼层
mark 参考 ,也正在写上位机

出0入0汤圆

 楼主| 发表于 2011-4-19 19:07:39 | 显示全部楼层
回复【6楼】sytu_xww 芦苇
-----------------------------------------------------------------------

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

出0入0汤圆

 楼主| 发表于 2011-4-19 19:08:28 | 显示全部楼层
回复【7楼】FlashNuk
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-4-19 21:26:53 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2011-4-20 08:39:58 | 显示全部楼层
关注你绘图和速度的那个控件,可否提供信息?

出0入0汤圆

 楼主| 发表于 2011-4-20 15:49:32 | 显示全部楼层
回复【12楼】sytu_xww 芦苇
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2011-4-26 11:41:34 | 显示全部楼层
太过瘾了!

出0入0汤圆

发表于 2011-4-26 17:09:49 | 显示全部楼层
回复【13楼】coolsure  
-----------------------------------------------------------------------

我的邮箱 sytu_xww    yahoo.com.cn

出0入0汤圆

发表于 2011-4-26 17:44:13 | 显示全部楼层
不知LZ pid部分进展怎样了?

出0入0汤圆

发表于 2011-9-8 13:35:49 | 显示全部楼层
收藏
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 00:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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