发一个我做的亚太机器人电机控制的上位机,原创。
先上个图,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);
}
}
}
} 程序是半成品,简单弄了弄,机器人是三分之一,还没弄伸长机构了。机械正在加工。
等都弄好了,我发上来。
程序比较乱,没整理好,见笑了 山的程序和我有得一比了~~~ 哈哈 代码是C#的吗? 不错,支持! 回复【3楼】cqfeiyu
-----------------------------------------------------------------------
c#的,山寨成分多,毕竟自己学的是自动化,不是搞软件的,软件算法薄弱。C#是自学的。见笑了。 上工程。。。 上工程哥们 mark 参考 ,也正在写上位机 回复【6楼】sytu_xww 芦苇
-----------------------------------------------------------------------
我弄完善了,肯定上。现在还有机器人的码盘没有弄好。把PID加上,上位机就挺好了。 回复【7楼】FlashNuk
-----------------------------------------------------------------------
我弄完善了,肯定上。现在还有机器人的码盘没有弄好。把PID加上,上位机就挺好了。 mark!! 关注你绘图和速度的那个控件,可否提供信息? 回复【12楼】sytu_xww 芦苇
-----------------------------------------------------------------------
控件的安装程序找不到了。我把帮助发上来。我找到安装文件给你,你给我邮箱
点击此处下载 ourdev_632304VRCC2K.rar(文件大小:1.60M) (原文件名:iocompActiveX.rar) 太过瘾了! 回复【13楼】coolsure
-----------------------------------------------------------------------
我的邮箱 sytu_xww yahoo.com.cn 不知LZ pid部分进展怎样了? 收藏
页:
[1]