如何在传输结构体数据的同时,完成结构体中变量数据的采集?

问题描述

最近在做一个项目,自己负责的主要工作是将定义好的结构体中的变量的数据传出来,以及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()

时间: 2024-10-26 05:43:47

如何在传输结构体数据的同时,完成结构体中变量数据的采集?的相关文章

大数据:13个真实世界情景中的数据科学应用

现在让我们看看13个在真实世界情景下的例子,了解现代数据科学家可以帮助我们做些什么.这些例子将有助于你学习如何专注于一个问题和如何形式化一个问题,以及如何仔细评估所有潜在问题--总之,是学习数据科学家在提出解决方案之前,如何定位问题和进行战略性思考.你也会看到为什么一些广泛使用的技术,如标准回归,可能并不适合所有情况. 数据科学家的思维方式不同于工程师.运筹学专业人士.计算机科学家.虽然运筹学涉及很多分析,但这一领域的焦点是具体业务优化层面,如库存管理和质量控制.运筹学涉及国防.经济.工程.军事

表空间 数据文件-oracle数据库表空间中的数据文件自动扩展到32G后不再自动扩展

问题描述 oracle数据库表空间中的数据文件自动扩展到32G后不再自动扩展 CSDN移动问答oracle表空间中的数据文件自动扩展到32G后不再自动扩展,报ora-01653错误,我之后手动加了个数据文件,但是不久之后这个数据文件自动扩展到了32G又报错,请问这是什么原因,难道以后只能手动添加数据文件么????

memo导入数据到数据库-如何将memo中的数据导入BDE中的DB数据库中

问题描述 如何将memo中的数据导入BDE中的DB数据库中 各位老师好 请问如何将memo控件中的数据导入DB中. db数据库中已经有字段 如下 idx Name Act Look memo中的数据 0,矿泉水,5,5, 其中,为分割符 请问代码该如何写

excel数据透视图怎么做 EXCEL表格中创建数据透视图的图解

1.打开excel如下所示准备一些数据,我随便打开一指数据,这里是2013年-2014年3个销售人员的费用报销情况. 2.然后点击菜单上的"插入"-"数据透视表"-"数据透视图"如下图所示. 3.在弹出的窗口里,选择好要分析的数据的区域,选择放置透视图的位置为:新工作表,点击确定.出现的界面如下图2所示. 4.然后我们找到数据透视表字段列表,点击左侧的三角符号下拉,选择:字段节和区域节并排. 5.如我们需要年份,我们就可以把"年份&qu

企业中的数据工具

数据 企业数据应用工具的选择 一.  为什么要选择工具 企业与机关.院校有于最大的不同就是内部人员的素质层次不一,而因很多原因不能要求所有的人都可以有很高的水平.记着我所接触的一个还算是十分新的企业里,在企业里会格盘就算是计算机高手了.这也从一个方面表现出了企业应用的滞后性. 正是在这种环境里,为了叫我们一线人员能够不改变其原有工作习惯的条件下完成工作.我们也进一步去体会办公自动化产品本身的高度集成与开放性.而这一切的基础都源于ODBC,下面将仔细说明这一切. 二.可爱的ODBC.缓慢的ODBC

SQL Server 2000中的数据存储形式(二)

server|数据 SQL Server 是一个关系数据库管理系统,它最初是由Microsoft .Sybase 和Ashton-Tate三家公司共同开发的,于1988 年推出了第一个OS/2 版本.在Windows NT 推出后Microsoft与Sybase 在SQL Server 的开发上就分道扬镳了,Microsoft 将SQL Server 移植到Windows NT系统上专注于开发推广SQL Server 的Windows NT 版本,Sybase 则较专注于SQL Server在U

阿里云数据库,破解大型网站架构设计中的数据存储难题

摘要:3月10日,2017阿里云网站行业热点问题和解决方案线下研讨会在上海举行.在本次研讨会上,阿里云数据库团队产品专家王义成(花名挚尤)针对于大型网站的数据库架构设计以及阿里云ApsaraDB所提供的服务管理和解决方案进行了深入介绍. 分享者简介:王义成(花名挚尤),阿里云数据库团队产品专家,负责阿里云NoSQL数据库的产品规划.加入阿里巴巴近5年的时间,参与过多种云数据库的产品设计工作.目前主要负责阿里云的MongoDB.Redis以及MemCache产品,旨在为广大客户提供安全可靠的数据库

机器学习项目中的数据预处理与数据整理之比较

要点 在常见的机器学习/深度学习项目里,数据准备占去整个分析管道的60%到80%. 市场上有各种用于数据清洗和特征工程的编程语言.框架和工具.它们之间的功能有重叠,也各有权衡. 数据整理是数据预处理的重要扩展.它最适合在可视化分析工具中使用,这能够避免分析流程被打断. 可视化分析工具与开源数据科学组件之间,如R.Python.KNIME.RapidMiner互为补充. 避免过多地使用组件能够加速数据科学项目.因此,在数据准备步骤中利用流式获取框架或流式分析产品会是一个不错的选择. 机器学习和深度

SQL同时更新两张表中关联数据方法

文章标题比较难理解,先让我举个例子,解释一下要实现的操作. 有两张表,t_statistics.t_add,如下 t_statistics数据 t_add数据 现在需要将 t_statistics 表 addtotal 字段的值减去 t_add 表 total 字段的值,条件是两者有相同的 id,所以正确的操作之后,t_add 记录无变化,t_statistics 记录如下 测试的数据库为Oracle(Oracle Database 10g Enterprise Edition Release