|
先上个图,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[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, 杜汶泽)
|