实例介绍
【实例截图】
【核心代码】
/*****************************************************************************/
/* Project : AvionicsInstrumentControlDemo */
/* File : DemoWondow.cs */
/* Version : 1 */
/* Language : C# */
/* Summary : Start window of the project, use to test the instruments */
/* Creation : 30/06/2008 */
/* Autor : Guillaume CHOUTEAU */
/* History : */
/*****************************************************************************/
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.Ports;
using System.Runtime.InteropServices;
namespace AvionicsInstrumentControlDemo
{
public partial class DemoWinow : Form
{
#region /*********************变量定义****************************/
private Form_3Dcuboid form_3Dcuboid;
private SerialPort Serial_Port = new SerialPort();
private bool closing = false;
private bool listening = false;
private Color[] MsgTypeColor = new Color[] { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red };
private bool StopDisFlag = false;
private long ReceiveCount = 0L;
private long SendCount = 0L;
private long FrameCount = 0L;
private List<byte> Data_Buffer = new List<byte>(0x800);
private byte[] Euler_Data = new byte[16];
private byte[] Acc_Gyr_Data = new byte[23];
private byte[] RC_Data = new byte[25];
private byte[] Temp_Data = new byte[50];
public Int16 Rol_P, Rol_I, Rol_D, Pit_P, Pit_I, Pit_D, Yaw_P, Yaw_I, Yaw_D;
public Int16 S_acc_x, S_acc_y, S_acc_z, S_gyr_x, S_gyr_y, S_gyr_z, S_mag_x, S_mag_y, S_mag_z;
public float D_ang_rol, D_ang_pit, D_ang_yaw, D_alt_csb, D_alt_prs;
public Int16 Rc_thr, Rc_yaw, Rc_rol, Rc_pit, Rc_aux_1, Rc_aux_2, Rc_aux_3, Rc_aux_4, Rc_aux_5, Rc_aux_6;
public Int16 Moto_1, Moto_2, Moto_3, Moto_4, Moto_5, Moto_6, Moto_7, Moto_8;
string CMD_Acc = "AAAF0101015C", CMD_Gyro = "AAAF0101025D", CMD_Acc_Gyro = "AAAF0101035E", CMD_Mag = "", CMD_Pid = "AAAF0201015D", CMD_Offset = "AAAF0201025E";
private float fly_roll;
public bool B_armed = true;//FLY
private bool GesShowFlag = false;
private bool Pid_flag = false;
private int xCount = 0;
private bool ZedCollectFlag = false;
private string s;
private int t;
#endregion
#region /*******************写入数据文件**************************/
//声明读写INI文件的API函数
[DllImport("kernel32")]
private static extern bool WritePrivateProfileString(string section, string key, string val, string filePath);
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string section, string key, string def, byte[] retVal, int size, string filePath);
static string FileName = Application.StartupPath "\\Mini4RotorsSetUPConfig.ini";
//写INI文件
public void WriteIni(string Section, string Ident, string Value)
{
if (!WritePrivateProfileString(Section, Ident, Value, FileName))
{
throw (new ApplicationException("写入配置文件出错"));
}
}
//读取INI文件指定
public string ReadIni(string Section, string Ident, string Default)
{
Byte[] Buffer = new Byte[65535];
int bufLen = GetPrivateProfileString(Section, Ident, Default, Buffer, Buffer.GetUpperBound(0), FileName);
//必须设定0(系统默认的代码页)的编码方式,否则无法支持中文
string s = Encoding.GetEncoding(0).GetString(Buffer);
s = s.Substring(0, bufLen);
return s.Trim();
}
private void GetIni()
{
roll_P.Value = int.Parse(ReadIni("Roll", "P", ""));
roll_I.Value = int.Parse(ReadIni("Roll", "I", ""));
roll_D.Value = int.Parse(ReadIni("Roll", "D", ""));
pitch_P.Value=int.Parse(ReadIni("Pit", "P", ""));
pitch_I.Value=int.Parse(ReadIni("Pit", "I", ""));
pitch_D.Value=int.Parse(ReadIni("Pit", "D", ""));
yaw_P.Value=int.Parse(ReadIni("Yaw", "P", ""));
yaw_I.Value=int.Parse(ReadIni("Yaw", "I", ""));
yaw_D.Value=int.Parse(ReadIni("Yaw", "D", ""));
}
private void SaveSetting()
{
WriteIni("Roll", "P", roll_P.Value.ToString());
WriteIni("Roll", "I", roll_I.Value.ToString());
WriteIni("Roll", "D", roll_D.Value.ToString());
WriteIni("Pit", "P", pitch_P.Value.ToString());
WriteIni("Pit", "I", pitch_I.Value.ToString());
WriteIni("Pit", "D", pitch_D.Value.ToString());
WriteIni("Yaw", "P", yaw_P.Value.ToString());
WriteIni("Yaw", "I", yaw_I.Value.ToString());
WriteIni("Yaw", "D", yaw_D.Value.ToString());
}
#endregion
#region /*******************曲线变量定义**************************/
public List<float> x1 = new List<float>();
public List<float> y1 = new List<float>();
public List<float> x2 = new List<float>();
public List<float> y2 = new List<float>();
public List<float> x3 = new List<float>();
public List<float> y3 = new List<float>();
public List<float> x4 = new List<float>();
public List<float> y4 = new List<float>();
public List<float> x5 = new List<float>();
public List<float> y5 = new List<float>();
public List<float> x6 = new List<float>();
public List<float> y6 = new List<float>();
#endregion
public DemoWinow()
{
InitializeComponent();
}
private void trackBarVerticalSpeed_Scroll(object sender, EventArgs e)
{
verticalSpeedInstrumentControl1.SetVerticalSpeedIndicatorParameters(trackBarVerticalSpeed.Value);
}
private void trackPitchAngle_Scroll(object sender, EventArgs e)
{
horizonInstrumentControl1.SetAttitudeIndicatorParameters(trackPitchAngle.Value, trackBarRollAngle.Value);
}
private void trackBarRollAngle_Scroll(object sender, EventArgs e)
{
horizonInstrumentControl1.SetAttitudeIndicatorParameters(trackPitchAngle.Value, trackBarRollAngle.Value);
}
private void trackBarHeading_Scroll(object sender, EventArgs e)
{
headingIndicatorInstrumentControl1.SetHeadingIndicatorParameters(trackBarHeading.Value);
}
private void DemoWinow_Load(object sender, EventArgs e)
{
this.form_3Dcuboid = new Form_3Dcuboid();
this.form_3Dcuboid.MinimizeInsteadOfClose = true;
this.InitCtlVal();
//SendData.Enabled = false;
//this.ZGraph = new ZGraph();
this.trackBarHeading.Scroll = new EventHandler(this.trackBar_Scroll);
this.trackPitchAngle.Scroll = new EventHandler(this.trackBar_Scroll);
this.trackBarRollAngle.Scroll = new EventHandler(this.trackBar_Scroll);
this.Serial_Port.DataReceived = new SerialDataReceivedEventHandler(this.SerialDataDis);
StartShowCube.Enabled = false;
StartCollect.Enabled = false;
dlBaudRate.SelectedIndex = 11;
dlDataByte.SelectedIndex = 0;
dlParity.SelectedIndex = 0;
dlStopByte.SelectedIndex = 0;
dlControl.SelectedIndex = 0;
}
private void InitCtlVal()
{
string[] ports = SerialPort.GetPortNames();
foreach (string port in ports)
{
dlPortName.Items.Add(port);
}
if (this.dlPortName.Items.Count > 0)
{
dlPortName.SelectedIndex = 0;
dlBaudRate.SelectedIndex = 11;
dlDataByte.SelectedIndex = 0;
dlParity.SelectedIndex = 0;
dlStopByte.SelectedIndex = 0;
dlControl.SelectedIndex = 0;
}
else
{
this.AppStateDis(MsgType.Outgoing, "计算机没有串口");
}
this.SetCtlState();
}
private void SetCtlState()
{
this.SerialPortSet.Enabled = !this.Serial_Port.IsOpen;
// this.OpenPort.Text = this.Serial_Port.IsOpen ? "&关闭串口" : "&打开串口";
}
private void trackBar_Scroll(object sender, EventArgs e)
{
form_3Dcuboid.Roll = this.trackBarRollAngle.Value;
form_3Dcuboid.Pitch = this.trackPitchAngle.Value;
form_3Dcuboid.Yaw = this.trackBarHeading.Value;
this.horizonInstrumentControl1.SetAttitudeIndicatorParameters((double)this.form_3Dcuboid.Pitch, (double)this.form_3Dcuboid.Roll);
//this.attitudeIndicatorInstrumentControl1.SetAttitudeIndicatorParameters((double)this.trackBar1.Value, (double)this.trackBar2.Value);
}
private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
if (tabControl1.SelectedTab == tabPage3)
{
form_3Dcuboid.FormBorderStyle = FormBorderStyle.None;
form_3Dcuboid.Visible = true;
form_3Dcuboid.TopLevel = false;
form_3Dcuboid.Parent = tabPage3;
form_3Dcuboid.ControlBox = false;
form_3Dcuboid.Dock = System.Windows.Forms.DockStyle.Fill;
form_3Dcuboid.Show();
}
}
private void DemoWinow_FormClosing(object sender, FormClosingEventArgs e)
{
this.closing = true;
while (this.listening)
{
Application.DoEvents();
}
this.Serial_Port.Close();
}
private void AppStateDis(MsgType msgtype, string msg)
{
this.AppState.ForeColor = this.MsgTypeColor[(int)msgtype];
this.AppState.Text = msg;
}
public enum MsgType
{
Incoming,
Outgoing,
Normal,
Warning,
Error
}
private string ByteArrayToHexString(byte[] data)
{
StringBuilder builder = new StringBuilder(data.Length * 3);
foreach (byte num in data)
{
builder.Append(Convert.ToString(num, 0x10).PadLeft(2, '0').PadRight(3, ' '));
}
return builder.ToString().ToUpper();
}
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] = Convert.ToByte(s.Substring(i, 2), 0x10);
}
return buffer;
}
private void SerialDataDis(object sender, SerialDataReceivedEventArgs e)
{
EventHandler method = null;
if (!this.StopDisFlag && !this.closing)
{
try
{
this.listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
int bytesToRead = this.Serial_Port.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
this.ReceiveCount = bytesToRead;//增加接收计数
byte[] buffer = new byte[bytesToRead];//声明一个临时数组存储当前来的串口数据
this.Serial_Port.Read(buffer, 0, bytesToRead);//读取缓冲数据
bool flag = false;
this.Data_Buffer.AddRange(buffer); //1.缓存数据
//2.完整性判断
while (this.Data_Buffer.Count >= 5)//至少要包含头(2字节) FUN(1字节) 长度(1字节) 校验(1字节)
{
//2.1 查找数据头
if (Data_Buffer[0] == 0xAA && Data_Buffer[1] == 0xAA && Data_Buffer[3] < 51)
{
int len = this.Data_Buffer[3];//数据长度
int fun = this.Data_Buffer[2];
//数据完整判断第一步,长度是否足够
//len是数据段长度,4个字节是while行注释的3部分长度
if (Data_Buffer.Count < len 5) break;
//2.3 校验数据,确认数据正确
//异或校验,逐个字节异或得到校验码
byte checksum = 0;
for (int i = 0; i <= (len 3); i )//checksum表示校验之前的求和
{
checksum = Data_Buffer[i];
}
if (checksum == Data_Buffer[len 4]) //如果数据校验正确,继续分析FUN字节
{
this.Data_Buffer.CopyTo(0, Temp_Data, 0, len 5);//复制一条完整数据到具体的数据缓存
this.Data_Buffer.RemoveRange(0, len 5);//正确分析一条数据,从缓存中移除数据。
switch (fun)
{
case 1://欧拉角
Euler_Data = Temp_Data;
D_ang_rol = (float)((Int16)(Temp_Data[4] << 8 | Temp_Data[5])) / 100;
D_ang_pit = (float)((Int16)(Temp_Data[6] << 8 | Temp_Data[7])) / 100;
D_ang_yaw = (float)((Int16)(Temp_Data[8] << 8 | Temp_Data[9])) / 100;
D_alt_csb = (Int16)(Temp_Data[10] << 8 | Temp_Data[11]);
D_alt_prs = (Int32)(Temp_Data[12] << 24 | Temp_Data[13] << 16 | Temp_Data[14] << 8 | Temp_Data[15]);
if (Temp_Data[16] == 0xa1)
B_armed = false;
else
B_armed = true;
break;
case 2://传感器数据
Acc_Gyr_Data = Temp_Data;
S_acc_x = (Int16)(Temp_Data[4] << 8 | Temp_Data[5]);
S_acc_y = (Int16)(Temp_Data[6] << 8 | Temp_Data[7]);
S_acc_z = (Int16)(Temp_Data[8] << 8 | Temp_Data[9]);
S_gyr_x = (Int16)(Temp_Data[10] << 8 | Temp_Data[11]);
S_gyr_y = (Int16)(Temp_Data[12] << 8 | Temp_Data[13]);
S_gyr_z = (Int16)(Temp_Data[14] << 8 | Temp_Data[15]);
S_mag_x = (Int16)(Temp_Data[16] << 8 | Temp_Data[17]);
S_mag_y = (Int16)(Temp_Data[18] << 8 | Temp_Data[19]);
S_mag_z = (Int16)(Temp_Data[20] << 8 | Temp_Data[21]);
break;
case 3:
RC_Data = Temp_Data;
Rc_thr = (Int16)(Temp_Data[4] << 8 | Temp_Data[5]);
Rc_yaw = (Int16)(Temp_Data[6] << 8 | Temp_Data[7]);
Rc_rol = (Int16)(Temp_Data[8] << 8 | Temp_Data[9]);
Rc_pit = (Int16)(Temp_Data[10] << 8 | Temp_Data[11]);
Rc_aux_1 = (Int16)(Temp_Data[12] << 8 | Temp_Data[13]);
Rc_aux_2 = (Int16)(Temp_Data[14] << 8 | Temp_Data[15]);
Rc_aux_3 = (Int16)(Temp_Data[16] << 8 | Temp_Data[17]);
Rc_aux_4 = (Int16)(Temp_Data[18] << 8 | Temp_Data[19]);
Rc_aux_5 = (Int16)(Temp_Data[20] << 8 | Temp_Data[21]);
Rc_aux_6 = (Int16)(Temp_Data[22] << 8 | Temp_Data[23]);
break;
case 16:
Rol_P = (Int16)(Temp_Data[4] << 8 | Temp_Data[5]);
Rol_I = (Int16)(Temp_Data[6] << 8 | Temp_Data[7]);
Rol_D = (Int16)(Temp_Data[8] << 8 | Temp_Data[9]);
Pit_P = (Int16)(Temp_Data[10] << 8 | Temp_Data[11]);
Pit_I = (Int16)(Temp_Data[12] << 8 | Temp_Data[13]);
Pit_D = (Int16)(Temp_Data[14] << 8 | Temp_Data[15]);
Yaw_P = (Int16)(Temp_Data[16] << 8 | Temp_Data[17]);
Yaw_I = (Int16)(Temp_Data[18] << 8 | Temp_Data[19]);
Yaw_D = (Int16)(Temp_Data[20] << 8 | Temp_Data[21]);
Pid_flag = true;
break;
default:
break;
}
flag = true;
}
//至此,已经被找到了一条完整数据。我们将数据直接分析,或是缓存起来一起分析
//我们这里采用的办法是缓存一次,好处就是如果你某种原因,数据堆积在缓存buffer中
//已经很多了,那你需要循环的找到最后一组,只分析最新数据,过往数据你已经处理不及时
//了,就不要浪费更多时间了,这也是考虑到系统负载能够降低。
else
this.Data_Buffer.RemoveRange(0, len 5);//从缓存中删除错误数据
}
else
{
//这里是很重要的,如果数据开始不是头,则删除数据
Data_Buffer.RemoveAt(0);
}
}
if (flag)
{
if (method == null)
{
method = delegate
{
this.FrameCount = 1L;
Application.DoEvents();
this.FrameNum.Text = this.FrameCount.ToString();
string Euler_data = " roll: " this.D_ang_rol.ToString() " pitch; " this.D_ang_pit.ToString() " yaw: " this.D_ang_yaw.ToString();
string Acc_data = " Acc_x: " this.S_acc_x.ToString() " Acc_y; " this.S_acc_y.ToString() " Acc_z: " this.S_acc_z.ToString();
string Gyr_data = " Gyr_x: " this.S_gyr_x.ToString() " Gyr_y; " this.S_gyr_y.ToString() " Gyr_z: " this.S_gyr_z.ToString();
this.Invoke((EventHandler)(delegate { eulerdatalabel.Text = Euler_data; }));
this.Invoke((EventHandler)(delegate { accdatalabel.Text = Acc_data; }));
this.Invoke((EventHandler)(delegate { gyrdatalabel.Text = Gyr_data; }));
horizonInstrumentControl1.SetAttitudeIndicatorParameters((double)D_ang_pit, (double)D_ang_rol);
headingIndicatorInstrumentControl1.SetHeadingIndicatorParameters(((int)D_ang_yaw) 180);
Application.DoEvents();
fly_roll = D_ang_rol;
if (fly_roll <= 0)
{
if (fly_roll <= -60)
{
fly_roll = 60;
turnCoordinatorInstrumentControl1.SetTurnCoordinatorParameters(-6, 0);
}
else
turnCoordinatorInstrumentControl1.SetTurnCoordinatorParameters((fly_roll / 10), 0);
}
else if (fly_roll >= 60)
{
fly_roll = 60;
turnCoordinatorInstrumentControl1.SetTurnCoordinatorParameters(6, 0);
}
else
turnCoordinatorInstrumentControl1.SetTurnCoordinatorParameters((fly_roll / 10), 0);
if (GesShowFlag)
{
form_3Dcuboid.Roll = D_ang_pit;
form_3Dcuboid.Yaw = D_ang_yaw;
form_3Dcuboid.Pitch = -D_ang_rol;
Application.DoEvents();
}
if (ZedCollectFlag)
{
if (xCount >= 400)
{
xCount = 0;
if (eulerwaveradio.Checked)
{
x1.Clear();
y1.Clear();
x2.Clear();
y2.Clear();
x3.Clear();
y3.Clear();
}
else
{
x1.Clear();
y1.Clear();
x2.Clear();
y2.Clear();
x3.Clear();
y3.Clear();
x4.Clear();
y4.Clear();
x5.Clear();
y5.Clear();
x6.Clear();
y6.Clear();
}
}
else
{
xCount ;
if (eulerwaveradio.Checked)
{
x1.Add((float)xCount);
x2.Add((float)xCount);
x3.Add((float)xCount);
}
else
{
x1.Add((float)xCount);
x2.Add((float)xCount);
x3.Add((float)xCount);
x4.Add((float)xCount);
x5.Add((float)xCount);
x6.Add((float)xCount);
}
}
if (eulerwaveradio.Checked)
{
y1.Add((float)D_ang_rol);
y2.Add((float)D_ang_pit);
y3.Add((float)D_ang_yaw);
}
else
{
y1.Add((float)S_acc_x);
y2.Add((float)S_acc_y);
y3.Add((float)S_acc_z);
y4.Add((float)S_gyr_x);
y5.Add((float)S_gyr_y);
y6.Add((float)S_gyr_z);
}
ZGraph.f_Refresh();
}
};
}
base.Invoke(method);
}
base.Invoke(new MethodInvoker(delegate
{
if (SerialCheckOutButton.Checked)
{
if (HexDis.Checked)
{
DataDisBox.AppendText(ByteArrayToHexString(buffer) "\r\n");
DataDisBox.ScrollToCaret();//可以将滚动条定位到当前光标处
}
else
{
DataDisBox.AppendText(Encoding.ASCII.GetString(buffer));
DataDisBox.ScrollToCaret();
}
}
else
ReceiveNum.Text = ReceiveCount.ToString();
}));
}
finally
{
listening = false;
}
}
}
private void Start_Collect()
{
if (eulerwaveradio.Checked)
{
x1.Clear();
y1.Clear();
x2.Clear();
y2.Clear();
x3.Clear();
y3.Clear();
ZGraph.f_ClearAllPix();
ZGraph.f_reXY();
ZGraph.f_LoadOnePix(ref x1, ref y1, Color.FromArgb(255, 0, 0), 1);//ROLL
ZGraph.f_AddPix(ref x2, ref y2, Color.FromArgb(0, 255, 0), 1);//YAW
ZGraph.f_AddPix(ref x3, ref y3, Color.FromArgb(0, 0, 255), 1);//PITCH
Application.DoEvents();
}
else
{
x1.Clear();
y1.Clear();
x2.Clear();
y2.Clear();
x3.Clear();
y3.Clear();
x4.Clear();
y4.Clear();
x5.Clear();
y5.Clear();
x6.Clear();
y6.Clear();
ZGraph.f_ClearAllPix();
ZGraph.f_reXY();
ZGraph.f_LoadOnePix(ref x1, ref y1, Color.FromArgb(255, 128, 0), 1);//acc_x
ZGraph.f_AddPix(ref x2, ref y2, Color.FromArgb(255, 255, 0), 1);//acc_y
ZGraph.f_AddPix(ref x3, ref y3, Color.FromArgb(154, 205, 50), 1);//acc_z
ZGraph.f_AddPix(ref x4, ref y4, Color.FromArgb(0, 255, 255), 1);//gyr_x
ZGraph.f_AddPix(ref x5, ref y5, Color.FromArgb(65, 105, 225), 1);//gyr_y
ZGraph.f_AddPix(ref x6, ref y6, Color.FromArgb(186, 85, 211), 1);//gyr_z
Application.DoEvents();
}
}
private void SerialSendData()
{
if (this.HexSend.Checked)
{
try
{
byte[] buffer = this.HexStringToByteArray(this.SendDataBox.Text);
this.Serial_Port.Write(buffer, 0, buffer.Length);
}
catch (FormatException)
{
this.AppStateDis(MsgType.Error, "数据格式不正确 ");
}
}
else
{
this.Serial_Port.Write(this.SendDataBox.Text);
this.AppStateDis(MsgType.Outgoing, "消息已发送");
}
int length = this.SendDataBox.Text.Length;
this.SendCount = length;
this.SendNum.Text = this.SendCount.ToString();
this.SendDataBox.SelectAll();
}
private void StopSend_Click(object sender, EventArgs e)
{
this.StopDisFlag = !this.StopDisFlag;
if (this.StopDisFlag)
{
StopSend.Text = "继续显示";
this.AppStateDis(MsgType.Error, "已停止显示");
}
else
{
StopSend.Text = "停止显示";
this.AppStateDis(MsgType.Error, "继续显示数据");
}
}
public int cubeX { get; set; }
public int cubeY { get; set; }
public int cubeZ { get; set; }
/*USB事件处理函数*/
public const int WM_DEVICECHANGE = 0x219;
public const int DBT_DEVICEARRIVAL = 0x8000;
public const int DBT_DEVICEREMOVECOMPLETE = 0x8004;
public bool IsCopy = false;
protected override void WndProc(ref Message m)
{
try
{
if (m.Msg == WM_DEVICECHANGE)
{
switch (m.WParam.ToInt32())
{
// USB插上
case DBT_DEVICEARRIVAL:
if (!IsCopy) // 如果不用这个判断,会被多次调用,原因不明
{
IsCopy = true;
// 其他处理
InitCtlVal();
}
break;
// USB移除
case DBT_DEVICEREMOVECOMPLETE:
IsCopy = false;
//InitCtlVal();
break;
default:
break;
}
}
}
catch (Exception ex)
{
MessageBox.Show("出错!" ex.Message, "请检查串口", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
base.WndProc(ref m);
}
private void TimingSend_CheckedChanged(object sender, EventArgs e)
{
if (this.TimingSend.Checked)
{
this.timer_send.Start();
this.AppStateDis(MsgType.Error, "已开启定时发送 ");
}
else
{
this.timer_send.Stop();
this.AppStateDis(MsgType.Error, "关闭定时发送");
}
}
private void clearRecBtn_Click(object sender, EventArgs e)
{
this.DataDisBox.Clear();
}
private void button9_Click(object sender, EventArgs e)
{
Application.DoEvents();
tabControl1.SelectedTab = tabPage3;
}
private void button8_Click(object sender, EventArgs e)
{
tabControl1.SelectedTab = tabPage1;
}
private void button7_Click(object sender, EventArgs e)
{
tabControl1.SelectedTab = tabPage2;
}
private void AccCheck_Click(object sender, EventArgs e)
{
byte[] AccBuffer = this.HexStringToByteArray(CMD_Acc);
this.Serial_Port.Write(AccBuffer, 0, AccBuffer.Length);
this.AppStateDis(MsgType.Error, "加速度校正 ");
}
private void GyroCheck_Click(object sender, EventArgs e)
{
byte[] GyroBuffer = this.HexStringToByteArray(CMD_Gyro);
this.Serial_Port.Write(GyroBuffer, 0, GyroBuffer.Length);
this.AppStateDis(MsgType.Error, "陀螺仪校正 ");
}
private void MagCheck_Click(object sender, EventArgs e)
{
byte[] GyroBuffer = this.HexStringToByteArray(CMD_Mag);
this.Serial_Port.Write(GyroBuffer, 0, GyroBuffer.Length);
this.AppStateDis(MsgType.Error, "磁力计校正 ");
}
private void OpenPort_Click(object sender, EventArgs e)
{
if (this.dlPortName.Items.Count > 0)
{
if (this.Serial_Port.IsOpen)
{
this.closing = true;
while (this.listening)
{
Application.DoEvents();
}
this.Serial_Port.DiscardInBuffer();
this.Serial_Port.Close();
SendData.Enabled = false;
this.OpenPort.BackgroundImage = Properties.Resources.usb;
this.AppStateDis(MsgType.Outgoing, "串口关闭");
this.serialPortlabel.Text = "串口关闭";
}
else
{
this.closing = false;
this.Serial_Port.BaudRate = int.Parse(this.dlBaudRate.Text);
this.Serial_Port.DataBits = int.Parse(this.dlDataByte.Text);
this.Serial_Port.StopBits = (StopBits)Enum.Parse(typeof(StopBits), this.dlStopByte.Text);
this.Serial_Port.Parity = (Parity)Enum.Parse(typeof(Parity), this.dlParity.Text);
this.Serial_Port.PortName = this.dlPortName.Text;
this.Serial_Port.Open();
StartShowCube.Enabled = true;
StartCollect.Enabled = true;
SendData.Enabled = true;
//Reset3DButton.Enabled = true;
this.OpenPort.BackgroundImage = Properties.Resources.usbon;
this.AppStateDis(MsgType.Outgoing, "串口打开");
this.serialPortlabel.Text = "串口打开";
}
this.SetCtlState();
}
else
{
MessageBox.Show(this, "计算机没有串口,请连接设备");
this.InitCtlVal();
}
}
private void FlySetButton_Click(object sender, EventArgs e)
{
tabControl1.SelectedTab = tabPage4;
}
private void StartCollect_Click(object sender, EventArgs e)
{
if (!this.ZedCollectFlag)
{
this.ZedCollectFlag = true;
this.Start_Collect();
this.waveLabel.Text = "停止采集";
}
else
{
this.ZedCollectFlag = false;
this.waveLabel.Text = "开始采集";
xCount = 0;
ZGraph.f_ClearAllPix();
//ZGraph.f_reXY();
}
}
private void StartShowCube_Click(object sender, EventArgs e)
{
if (!this.GesShowFlag)
{
this.GesShowFlag = true;
this.plane3dLabel.Text = "停止显示";
}
else
{
this.GesShowFlag = false;
this.plane3dLabel.Text = "开始显示";
}
}
private void Reset3DButton_Click(object sender, EventArgs e)
{
this.cubeX = 0;
this.cubeY = 0;
this.cubeZ = 0;
trackBarVerticalSpeed.Value = 0;
verticalSpeedInstrumentControl1.SetVerticalSpeedIndicatorParameters(0);
this.form_3Dcuboid.Roll = this.trackBarRollAngle.Value = 0;
this.form_3Dcuboid.Pitch = this.trackPitchAngle.Value = 0;
horizonInstrumentControl1.SetAttitudeIndicatorParameters(0, 0);
this.form_3Dcuboid.Yaw = this.trackBarHeading.Value = 0;
headingIndicatorInstrumentControl1.SetHeadingIndicatorParameters(0);
}
private void SendData_Click(object sender, EventArgs e)
{
try
{
this.SerialSendData();
}
catch
{
this.AppStateDis(MsgType.Error, "数据格式不正确或串口没有打开");
}
}
private void clearRXTXbutton_Click(object sender, EventArgs e)
{
this.ReceiveCount = 0L;
this.ReceiveNum.Text = this.ReceiveCount.ToString();
this.SendCount = 0L;
this.SendNum.Text = this.SendCount.ToString();
}
private void clearSendBoxbtn_Click(object sender, EventArgs e)
{
SendDataBox.Text = "";
}
private void timer_UI_Tick(object sender, EventArgs e)
{
if (eulerwaveradio.Checked)
{
rol_label.Text = "roll :一";
pit_label.Text = "pitch :一";
yaw_label.Text = "yaw :一";
acc_x_label.Text = "";
acc_y_label.Text = "";
acc_z_label.Text = "";
gyr_x_label.Text = "";
gyr_y_label.Text = "";
gyr_z_label.Text = "";
}
if (basicwaveradio.Checked)
{
rol_label.Text = "";
pit_label.Text = "";
yaw_label.Text = "";
acc_x_label.Text = "Acc_x :一";
acc_y_label.Text = "Acc_y :一";
acc_z_label.Text = "Acc_z :一";
gyr_x_label.Text = "Gyr_x :一";
gyr_y_label.Text = "Gyr_y :一";
gyr_z_label.Text = "Gyr_z :一";
}
//修改接收计数
acc_x.Text = S_acc_x.ToString();
acc_y.Text = S_acc_y.ToString();
acc_z.Text = S_acc_z.ToString();
gyr_x.Text = S_gyr_x.ToString();
gyr_y.Text = S_gyr_y.ToString();
gyr_z.Text = S_gyr_z.ToString();
mag_x.Text = S_mag_x.ToString();
mag_y.Text = S_mag_y.ToString();
mag_z.Text = S_mag_z.ToString();
if(Pid_flag)
{
roll_P.Value = Rol_P;
roll_I.Value = Rol_I;
roll_D.Value = Rol_D;
pitch_P.Value = Pit_P;
pitch_I.Value = Pit_I;
pitch_D.Value = Pit_D;
yaw_P.Value = Yaw_P;
yaw_I.Value = Yaw_I;
yaw_D.Value = Yaw_D;
Pid_flag = false;
}
//alt_csb.Text = D_alt_csb.ToString();
//alt_prs.Text = D_alt_prs.ToString();
if (B_armed)
{
plane3dLabel.Text = "飞机锁定";
lockctrlfly.Checked = false;
}
else
{
plane3dLabel.Text = "飞机解锁";
lockctrlfly.Checked = true;
}
}
private void save_data_button_Click(object sender, EventArgs e)
{
SaveSetting();
}
private void read_data_button_Click(object sender, EventArgs e)
{
GetIni();
}
private void timer_send_Tick(object sender, EventArgs e)
{
if (this.SendSet.Enabled)
{
this.s = this.SendTim.Text;
if (this.s == "")
{
this.t = 1;
}
else
{
int.TryParse(this.s, out this.t);
}
this.timer_send.Interval = this.t;
this.SerialSendData();
}
else
{
this.timer_send.Stop();
}
}
private void Read_Pid_button_Click(object sender, EventArgs e)
{
byte[] PidBuffer = this.HexStringToByteArray(CMD_Pid);
this.Serial_Port.Write(PidBuffer, 0, PidBuffer.Length);
this.AppStateDis(MsgType.Error, "读取PID");
}
private byte[] CreateData(Int16 rol_p, Int16 rol_i, Int16 rol_d, Int16 pit_p, Int16 pit_i, Int16 pit_d, Int16 yaw_p, Int16 yaw_i, Int16 yaw_d) //构建数据包
{
byte checksum = 0;
byte[] data = new byte[23];
data[0] = 0xaa;
data[1] = 0xaf;
data[2] = 0x10;
data[3] = 0x12;
data[4] = (byte)((rol_p & 0xff00)>>8);
data[5] = (byte)(rol_p & 0xff);
data[6] = (byte)((rol_i & 0xff00) >> 8);
data[7] = (byte)(rol_i & 0xff);
data[8] = (byte)((rol_d & 0xff00) >> 8);
data[9] = (byte)(rol_d & 0xff);
data[10] = (byte)((pit_p & 0xff00) >> 8);
data[11] = (byte)(pit_p & 0xff);
data[12] = (byte)((pit_i & 0xff00) >> 8);
data[13] = (byte)(pit_i & 0xff);
data[14] = (byte)((pit_d & 0xff00) >> 8);
data[15] = (byte)(pit_d & 0xff);
data[16] = (byte)((yaw_p & 0xff00) >> 8);
data[17] = (byte)(yaw_p & 0xff);
data[18] = (byte)((yaw_i & 0xff00) >> 8);
data[19] = (byte)(yaw_i & 0xff);
data[20] = (byte)((yaw_d & 0xff00) >> 8);
data[21] = (byte)(yaw_d & 0xff);
for (int i = 0; i < 18; i )
checksum = data[i 4];
data[22] = checksum;
return data;
}
private void Save_Pid_button_Click(object sender, EventArgs e)
{
byte[] Pid_data = CreateData(
Convert.ToInt16(roll_P.Value),Convert.ToInt16(roll_I.Value),Convert.ToInt16( roll_D.Value),
Convert.ToInt16( pitch_P.Value),Convert.ToInt16( pitch_I.Value),Convert.ToInt16( pitch_D.Value),
Convert.ToInt16( yaw_P.Value),Convert.ToInt16( yaw_I.Value),Convert.ToInt16( yaw_D.Value));
this.Serial_Port.Write(Pid_data, 0, Pid_data.Length);
this.AppStateDis(MsgType.Error, "写入PID数据到飞控 ");
}
}
}
标签: AHRS
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论