问题描述
最近在做一个项目,自己负责的主要工作是将定义好的结构体中的变量的数据传出来,以及matlab计算后传回来的数据进行解算并显示结构体1:传递初始化数据-没有问题结构体2:实时传递摇杆采集的数据-有问题结构体3:传递自动飞行数据-没有问题结构体4:接受matlab结算的数据,并进行显示(暂时还没有测试)现在遇到的问题,主要是:我需要实时传递摇杆采集的数据并传递出去这是按钮事件,当点击按钮之后开始传递结构体的数据SendUAV_ManualPilotpSendUAV_ManualPilot;staticboolflag=true;privatevoidbtSendMPdatas_Click(objectsender,EventArgse){if(flag)Send_MP_Data();elselstbxMessageView.Invoke(showMessageCallback,"finishSendUAVManualPilotData");}publicvoidSend_MP_Data(){flag=!flag;while(true){timer1.Start();pSendUAV_ManualPilot.DataType=NetDataType.UAV_ManualPilot_Data;pSendUAV_ManualPilot.UAV_symbol=1;pSendUAV_ManualPilot.aileron=double.Parse(textBoxAileron.Text);pSendUAV_ManualPilot.elevator=double.Parse(textBoxElevator.Text);pSendUAV_ManualPilot.rudder=double.Parse(textBoxRudder.Text);pSendUAV_ManualPilot.throttle=double.Parse(textBoxTL.Text);pSendUAV_ManualPilot.mixture=double.Parse(textBoxMixture.Text);if(int.Parse(textBoxGearsBrake.Text)==1)//0:L0R0,1:L1R0,2:L0R1,3:L1R1;{pSendUAV_ManualPilot.break_left=1;pSendUAV_ManualPilot.break_left=0;}elseif(int.Parse(textBoxGearsBrake.Text)==2)//0:L0R0,1:L1R0,2:L0R1,3:L1R1;{pSendUAV_ManualPilot.break_left=0;pSendUAV_ManualPilot.break_left=1;}elseif(int.Parse(textBoxGearsBrake.Text)==3)//0:L0R0,1:L1R0,2:L0R1,3:L1R1;{pSendUAV_ManualPilot.break_left=1;pSendUAV_ManualPilot.break_left=1;}else//0:L0R0,1:L1R0,2:L0R1,3:L1R1;{pSendUAV_ManualPilot.break_left=0;pSendUAV_ManualPilot.break_left=0;}//发送的补齐数据-无意义pSendUAV_ManualPilot.unuseful_1_int=111;pSendUAV_ManualPilot.unuseful_2_byte=22;pSendUAV_ManualPilot.unuseful_3_byte=33;pSendUAV_ManualPilot.unuseful_4_byte=44;//再补21字节pSendUAV_ManualPilot.unuseful_1_int_add=123;pSendUAV_ManualPilot.unuseful_2_byte_add=10;pSendUAV_ManualPilot.unuseful_3_byte_add=11;pSendUAV_ManualPilot.unuseful_4_byte_add=12;//sendMPdata:pSendUAV_ManualPilot;lstbxMessageView.Invoke(showMessageCallback,"SendUAVManualPilotData...");networkStream=tcpClient.GetStream();byte[]bytes=Memcpy.StructToByte(pSendUAV_ManualPilot);networkStream.Write(bytes,0,bytes.Length);}}
这是对摇杆的动作进行实时采集和计算的方法privatevoidtimer1_Tick(objectsender,EventArgse){labelDate.Text=DateTime.Now.Date.ToString();labelTime.Text=DateTime.Now.TimeOfDay.ToString();jst.UpdateStatus();for(inti=0;i<sticks.Length;i++){jstList[i].UpdateStatus();}Joystick_Data_calculated();}float[]variable;privatevoidJoystick_Data_calculated(){variable=newfloat[6];//roll,pitch,yaw,thrust,mixturefloatdeadzone=0.10f;floatMaxValue=65535.0f;/*jstList[Joysticktype[0]].state.X;*/variable[0]=((float)(jstList[Joysticktype[0]].state.X)-MaxValue/2)/(MaxValue/2);//aileronvariable[1]=((float)(jstList[Joysticktype[0]].state.Y)-MaxValue/2)/(MaxValue/2);//elevatorvariable[2]=((float)(jstList[Joysticktype[0]].state.Rz)-MaxValue/2)/(MaxValue/2);//ruddervariable[3]=(MaxValue-(float)(jstList[Joysticktype[1]].state.Z))/(MaxValue);//throttle//variable[0]=((variable[0]>deadzone)?(variable[0]-deadzone):(variable[0]+deadzone))/(1-deadzone);//variable[1]=((variable[1]>0)?(variable[1]-deadzone):(variable[1]+deadzone))/(1-deadzone);//variable[2]=((variable[2]>0)?(variable[2]-deadzone):(variable[2]+deadzone))/(1-deadzone);for(inti=0;i<3;i++){if(variable[i]>deadzone)variable[i]=(variable[i]-deadzone)/(1-deadzone);elseif(variable[i]<(-deadzone))variable[i]=(variable[i]+deadzone)/(1-deadzone);elsevariable[i]=0;}variable[1]=-variable[1];variable[2]=-variable[2];textBoxTL.Text=variable[3].ToString();textBoxAileron.Text=variable[0].ToString();textBoxElevator.Text=variable[1].ToString();textBoxRudder.Text=variable[2].ToString();textBoxMixture.Text="0.8";byte[]buttonstate=jstList[Joysticktype[0]].state.GetButtons();for(inti=0;i<buttonstate.Length;i++){if(buttonstate[i]!=0)textBoxGearsBrake.Text=i.ToString();//else//textBoxGearsBrake.Text="0";}}
这是对收到的matlab的数据进行结算并显示的代码://开始解包ReceiveUAVstatusDatapReceiveUAVstatusData;privatevoidReceiveMessage(){Thread.Sleep(100);while(true){try{byte[]receivemessage=newbyte[134];networkStream.Read(receivemessage,0,receivemessage.Length);pReceiveUAVstatusData=(ReceiveUAVstatusData)Memcpy.BytesToStruct(receivemessage,pReceiveUAVstatusData.GetType());dataGridViewFSD.Rows[0].Cells[1].Value=pReceiveUAVstatusData.Lng;dataGridViewFSD.Rows[1].Cells[1].Value=pReceiveUAVstatusData.Lat;dataGridViewFSD.Rows[2].Cells[1].Value=pReceiveUAVstatusData.Alt;dataGridViewFSD.Rows[3].Cells[1].Value=pReceiveUAVstatusData.AGL;dataGridViewFSD.Rows[4].Cells[1].Value=pReceiveUAVstatusData.phi;dataGridViewFSD.Rows[5].Cells[1].Value=pReceiveUAVstatusData.theta;dataGridViewFSD.Rows[6].Cells[1].Value=pReceiveUAVstatusData.psi;dataGridViewFSD.Rows[7].Cells[1].Value=pReceiveUAVstatusData.alpha;dataGridViewFSD.Rows[8].Cells[1].Value=pReceiveUAVstatusData.beta;dataGridViewFSD.Rows[9].Cells[1].Value=pReceiveUAVstatusData.IAS;dataGridViewFSD.Rows[10].Cells[1].Value=pReceiveUAVstatusData.VertSpd;dataGridViewFSD.Rows[11].Cells[1].Value=pReceiveUAVstatusData.Fuel;dataGridViewFSD.Rows[12].Cells[1].Value=pReceiveUAVstatusData.Fuel;dataGridViewFSD.Rows[13].Cells[1].Value=pReceiveUAVstatusData.simulate_time;}catch{if(reader!=null){reader.Close();}if(writer!=null){writer.Close();}if(tcpClient!=null){tcpClient.Close();}//lstbxMessageView.Invoke(showMessageCallback,"ClientRe-connect");//重新开启一个线程等待新的连接//ThreadacceptThread=newThread(acceptClientConnect);//acceptThread.Start();}setTextd=newsetText(Threading);//委托this.Invoke(d);}}
我想问下,我的那个实时传递摇杆的数据的那段代码正确么?因为我这边没办法测,我自己根据流程,自己想了一下,应该是正确的,但是timer1().Start那段代码,我想使用timer1.ontick(null)这个方法,但是,当我使用的时候,编译器提示我说,这个是一个保护的方法,不能调用(但是,我已经将timer的modifier属性设置为public了),自己也想不通为什么自己C#小菜鸟一个,刚刚学C#不到两周,希望,CSDN上的大神能帮帮我看看,这段程序的逻辑有什么问题没有,又或者有更好的方法在send_MP_data方法中来调用timer1_click这个方法,进行摇杆数据的采集
解决方案
本帖最后由 zhangbin144 于 2014-10-28 11:32:33 编辑
解决方案二:
各路神仙,你们到底在哪里啊?
解决方案三:
你就是想执行timer1_Tick里的方法,把它封装成函数,各种地方想用就用函数,或者把代码复制过去执行不要妄图执行timer1_Tick这个方法
解决方案四:
如果处理方法验证了是可行,估计错误出现的地方就是细节问题,请详细检查一下~
解决方案五:
引用2楼Z65443344的回复:
你就是想执行timer1_Tick里的方法,把它封装成函数,各种地方想用就用函数,或者把代码复制过去执行不要妄图执行timer1_Tick这个方法
你的意思是,我再定义一个方法,比如:publicvoidTIME(){timer1_Tick(null,null);}
那么对于timer1_Tick()这个方法中的参数,我需要传什么参数进去呢?
解决方案六:
我的意思是,你定义一个函数,比如叫voidDoSomething(){}把代码写在这个方法里然后timer1_Tick里执行DoSomething();其他地方要用,也执行DoSomething();不要一门心思老想去执行timer1_Tick()