深入浅出FSUIPC的作用以及使用方法

看此贴前您需要掌握的技能或知识:
1. 有FSX或FS2004并正确安装了FSUIPC
2. 具备一定的C语言理解能力,C语言是一切高级语言的基础,单片机主要也用的C语言。
3. 掌握以下几种编程语言之一即可: VC++\VB\C#\DELPHI\JAVA\C++MFC\.NET版的C++或VB,本文以VB为例,因为相对而言上位机的编写VB比较容易,当然,FSUIPC_SDK中也包含了汇编,但个人不建议使用汇编,虽然汇编代码效率高,但非常难以理解,如果你是非常N的硬件工程师可能你会选择汇编(单片机也可用汇编)。
4. 单片机与PC机串口通信原理,这个是最基本的单片机和PC的通讯方式(实际上因为速度慢已经过时,但足够FS用),事实上USB更好,本文没有用USB,因为USB协议很复杂,而且不是每款单片机都支持USB。

需要注意的地方:
1. FSUIPC_SDK的文件中指出VB不是主要用的语言,如果你会C#的话,建议你用那个语言,将来可以和PMDG的SDK衔接起来。
2. 过去PMDG也是走的FSUIPC接口,但现在好像不是了,所以想控制PMDG的飞友还需再下功夫(我也在下功夫)
3. 看完本文后你可能不想买摇杆了,或者,你可能感觉买摇杆亏了,这都是正常现象,你需要知道的是摇杆的物理结构设计也是很辛苦的,所以并不亏。



如果你只想DIY个摇杆,那么MJOY16是你不二选择, 老毛子开发,功能相当强大,用AVR单片机(建议用ATMEGA16L)的虚拟USB技术,相当于直接模拟出了游戏控制器(别的游戏也能用),而且不需要你明白什么语言,只要焊接技术过硬、会向单片机烧程序即可。


本文适合人群:想DIY驾驶舱面板、开关或全套驾驶舱的高水准发烧友。


一、什么是FSUIPC?
在FS2004时代,FSUIPC是所有高水平插件的接口,有人也说它是模块或者外挂程序,从安装上看,FSUIPC就是一个很小的DLL文件,但它很重要,没有它很多插件工作不了,这个现象延续到了FSX时代,但FSX时代官方提出了新的概念,就是SimConnect,这个东西使FSUIPC不再那么重要了,因为插件可以走那个接口了,但我们还是要装FSUIPC,因为它还有灵活定义摇杆的功能,总之FSUIPC功能非常强大,我们是在用它的最基本且重要的功能。
二、简单的原理(你可能觉得不简单)
想通过硬件来控制FS一个方式就是用游戏控制器,而另外的方式就是通过接口连接到FS,我们这里用FSUIPC是因为FSUIPC相对简单,而后者的结构(写指令)主要是:先用单片机识别开关状态--单片机将开关状态调制成便于串口传送的格式--单片机用串口发送给电脑--电脑上位机解读串口发来的数据并提取开关状态--电脑上位机将开关状态写入FSUIPC对应偏移地址的内存中--FSUIPC向FSX发送相应指令--FSX相应的开关发生变化;(读指令FSUIPC读取FSX相应的信息到FSUIPC相应的偏移地址的内存中(主要用于MCP的数码管读取,不过它很强大,甚至包括飞机型号都能读)--由上位机完成读取FSUIPC的相应偏移地址的内存中的FS信息--上位机将该信息调制成适合串口传送的格式--单片机收到并解调该信息--单片机控制相应的硬件显示该信息。
三、请到官方链接http://www.schiratti.com/dowson.html下载FSUIPC_SDK 解压后你会发现大概是这样的:

你惊喜地发现里面有个EXE文件,没错,你可以打开它试一试,然后打开FSX,随便加载个机模机场进游戏。 //-----------------------------------------------------------------
FSInterrogate2std.exe关于它的作用:
1.找到你想完成的指令在FSUIPC的偏移地址,只有知道了该地址你才可以知道该对那里进行操作。
2.知道该怎么赋值、达到什么效果。

本文以控制FD(飞行指挥仪)开关为例
打开 FSInterrogate2std.exe
有一个About的提示,直接OK忽略掉,不是什么重要信息(版权啊什么的)
然后你会看到主页面是个大表格,很简单,左侧第一列即为偏移地址,后面的是相关信息。


我们得到相关信息:
偏移地址2EE0、变量类型是U32(一般理解为unsigned int 32)、SIZE=4(直接翻译是尺寸,大家意会即可)、READ/WRITE代表可读可写
但我们还是不知道怎么赋值

左下单击Interrogate(步骤1)
左上单击Setup Fields(步骤2)


在表格中找到2EE0项(步骤3)
此时如果你没开FSX,把FSX打开并随意加载一个有FD的机模,随便一个机场,进游戏,本文以默认321为例
一般默认状态下FD是关闭的
执行步骤4,点击Read Buffer1 32bit Buffer1显示0 
这就意味着FSUIPC的2EE0偏移地址中的32位数据为0时对应FSX中的FD是关闭状态,
我们再切入FSX,手动把FD点亮
再次执行步骤4,同理,我们会发现FD开启时对应的32位数据是1
这时候我们就知道该怎么控制FSUIPC去控制FSX了。
//------------------------------------------------------------
接下来我们开始上位机的编写(我用的环境是VB6.0,没错,就是这个很老的版本)
解压UIPC_SDK_VisualBasic.zip

看一下FSUIPC的帮助文档(readme),从中我们可以看出不管使用任何语言都是基本一个套路:
FSUIPC_Initialization()初始化
FSUIPC_Open()开
FSUIPC_Read()/Write() 读或写
FSUIPC_Process()这个是每次操作读或写后必须要经过的过程
FSUIPC_Close()在你关闭上位机是顺便要关掉FSUIPC

至于其他部分相当于SDK中写好的驱动大家不懂也无伤大雅,当然明白更好。

然后再进一层目录,打开.vbp文件,这是工程文件,相当于官方例程点直接运行,此时应该不会报错(不管你开不开FSX),如果你报错了说明VB软件有问题或者别的有问题。
如果你开了FSX,此时对话框中应该显示你FSX中的虚拟时间,FSUIPC版本,FS版本,由此可知该例程以读为主,所以本文没有赘述有关读的操作,有兴趣的同学直接读懂例程部分即可
帮助文档中给出了获取飞机型号的代码,我们来练习一下,以复制粘贴为主
首先在窗口中拖出一个TEXT框


Public Function GetAircraftTitle(ByRef AircraftTitle As String) As Boolean。。。。。End Function
这部分代码直接复制到整篇代码的尾部即可,它是一个函数,我们在其他地方调用它
If GetAircraftTitle(ACTitle) Then
        ' do whatever with the result passed back in ACTitle
       Text1.Text = ACTitle  ‘这部分是需要添加的,用于在窗口显示机型信息
      Else
        '* display/process the error message based back in ACTitle
      End If

而这部分代码需要放在 Private Sub Timer1_Timer() 中
插入到End Sub之前即可
运行正常

//-----------------------------------------------------------------------------
编辑我们自己的代码段是照猫画虎的过程
  If FSUIPC_Write(&H2EE0, 4, VarPtr(fd_status), dwResult) Then
  
   If FSUIPC_Process(dwResult) Then
   Else
   End If
  
  End If

我们手动对fd_status赋值,看一下FSX的变化,正常,进入下一步/阶段
//----------------------------------------------------------------------------------
串口的数据处理:
掌握串口传输数据原理是每个硬件工程师最基本的要求,为方便理解,本文只涉及很简单的应用,不包含校验的复杂过程。
首先定义数据包的基本格式:FA fd_status(0/1) FB 简单的说就是 FA 00 FB 或 FA 01 FB
然后我们只讲一下思路,就是先识别FA,然后显然FA之后的数就应该赋值给fs_status,赋值到什么时候结束呢?识别出FB的时候。
具体实现方式本文不再细讲,相关电子论坛会有完整的原理解释,有需要的同学请研读我提供的代码,不懂可以百度或跟帖
然后是调试过程,该过程使用了串口调试助手和虚拟串口通道,本文结尾附件出可下载,也可自行百度下载别的版本。
打开串口调试助手Porthelper.exe,将波特率与VB中匹配,COM口选虚拟桥的一端,然后VB上配置成另一端即可。 选择HEX发送
发送窗口输入 FA 00 FB 或 FA 01 FB 并点击发送,观察FSX变化,正常


这时你用鼠标点FD应该是无效的,上位机会不断地刷FD的状态,所以这样才能保证将来硬件与软件的同步。

//-------------------------------------------------------------------



注意这个选项,关于MSCOMM1的,它默认是0











注:串口调试助手是免费软件,版权归原作者所有。
鉴于本帖篇幅有点长,我决定对下位机另开一贴,同时也防止本帖沉掉,相信版主应该没意见吧
//--------------------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432581.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 VC6 中使用 GdiPlus-安装

安装三部曲: Step1:下载 GdiPlus SDK 文件包; 链接地址1:http://www.codeguru.com/code/legacy/gdi/GDIPlus.zip 链接地址2:http://www.codersource.net/samples/mfcgdiplus.zip Step2:安装; &a…

ASP.NET MVC 的多国语系支持

ASP.NET MVC 的多国语系支持 posted on 2014-05-14 11:31 stickout 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/linhui/p/3727364.html

aliyun centos6 安装mysql_阿里云CentOS6.8安装MySQL5.6

1、使用SSH Secure Shell工具连接阿里云服务器2、使用SSH Secure File Transfer工具上传MySQL压缩包3、解压MySQL压缩包到指定目录(需要在先/usr/local下创建mysql目录)进入压缩文件存放位置,进行解打包:tar -xvf MySQL-5.6.22-1.el6.i686.rpm-bundle.ta…

用Javascript获取页面元素的位置

制作网页的过程中,你有时候需要知道某个元素在网页上的确切位置。 下面的教程总结了Javascript在网页定位方面的相关知识。 一、网页的大小和浏览器窗口的大小 首先,要明确两个基本概念。 一张网页的全部面积,就是它的大小。通常情况下&#…

[Qt] 利用QtWebKit完成JavaScript访问C++对象

http://blog.csdn.net/longsir_area/article/details/42965565 一. 介绍 在浏览器扩展或者WebApp的项目经常用的脚本语言JavaScript有很多局限性,比如,javascript语言不能够夸窗口访问js对象,不能直接读写磁盘文件(这个…

mysql三大范式_MySQL学习笔记

1、数据库结构设计1、总-总体流程图2、分-【提取属性】业务分析评价的属性:{用户,课程主标题,内容,综合评分,内容实用,简洁易懂,逻辑分析,发布时间} 问答评论属性:{类型,…

QT webkit 各个类之间关系--QWebView-QWebPag

一、QT webkit简介 1.Qt Qt(发音同 cute)是一个跨平台的C应用程式开发框架,有时又被称为C部件工具箱。Qt被用在KDE桌面环境、Opera、Google Earth、Skype、Adobe Photoshop Album和VirtualBox的开发中。它是挪威Qt Software 的产品&#xff0…

vue 文件转换二进制_在vue中使用axios实现post方式获取二进制流下载文件(实例代码)...

需求点击导出下载表格对应的excel文件在 vue 项目中,使用的 axios ,后台 java 提供的 post 接口 api实现第一步,在 axios 请求中加入参数,表示接收的数据为二进制文件流responseType: "blob"第二步,在拿到数据流之后,把流转为指定文件格式并创建a标签,模拟点击下载,实…

vs生成qt moc文件

1. 右键需要生成moc文件的头文件 2. 将生产的moc加入工程中

javascript好文---深入理解定位父级offsetParent及偏移大小

前面的话 偏移量(offset dimension)是javascript中的一个重要的概念。涉及到偏移量的主要是offsetLeft、offsetTop、offsetHeight、offsetWidth这四个属性。当然,还有一个偏移参照——定位父级offsetParent。本文将详细介绍该部分内容 offsetParent定位父级 在理解…

bash中将字符串split成数组的方法

相信编程时,字符串的处理是很频繁被处理的问题,其中大家肯定不陌生各种语言的string.split(sp)将字符串按照某个字符或子串切分成一个数组。 同样,我们在用shell处理文本信息时也可以方便地实现该功能。 这里主要使用了bash中关于字符串变量的…

理解 e.clientX,e.clientY e.pageX

event.clientX、event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性 event.pageX、event.pageY 类似于event.clientX、event.clientY,…

基于FlashPaper的文档播放器

本文主要讨论、描述了使用Adobe公司的Flex与FlashPaper产品完成对发布到网上的文档资料进行只读控制,也就是说只允许浏览操作、对下载、打印进行控制。FlashPaper FlashPaper是Macromedia的一款用于将操作系统所识别的文档的内容通过虚拟打印机制将内容转换为swf文件…

python经纬度转换xy坐标公式 pyqt_EXCEL公式进行经纬度与XY坐标的相互转换

一、用EXCEL进行高斯投影换算从经纬度B、L换算到高斯平面直角坐标X、Y(高斯投影正算),或从X、Y换算成B、L(高斯投影反算),一般需要专用计算机软件完成。在目前流行的换算软件中不足之处,就是灵活性较差,大都需要一个点一个点地进行…

java桥_JAVA 桥模式

桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化”。这句话很短,但是第一次读到这句话的人很可能都会思考良久而不解其意。这句话有三个关键词,也就是抽象化、实现化和脱耦。理解这三个词所代表…

java utf8 byte_byte以及UTF-8的转码规则

https://www.cnblogs.com/hell8088/p/9184336.html多年来闲麻烦,只记录笔记,不曾编写BLOG,本文为原创,如需转载请标明出处废话不说,直奔主题ascii计算机只接受 “高”、“低”电压,所以使用二进制 1 和 …

理解GL_TRIANGLE_STRIP等绘制三角形序列的三种方式

GL_TRIANGLE_STRIP绘制三角形方式很多时候令人疑惑,在这里对其运作机理进行解释。 一般情况下有三种绘制一系列三角形的方式,分别是GL_TRIANGLES、GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN。 如下图所示: GL_TRIANGLES是以每三个顶点绘制一个三…

jpa mysql乐观锁_【快学springboot】8.JPA乐观锁OptimisticLocking

介绍当涉及到企业应用程序时,正确地管理对数据库的并发访问是至关重要的。为此,我们可以使用Java Persistence API提供的乐观锁定机制。它导致在同一时间对同一数据进行多次更新不会相互干扰。为了使用OptimisticLocking,我们需要一个实体(En…

php mysql 库存变负数_php解决秒杀并发入库导致的库存负数

我们知道数据库处理sql是一条条处理的,假设购买商品的流程是这样的:sql1:查询商品库存1 if(库存数量 > 0)2 {3 //生成订单4 //库存-15 >当没有并发时,上面的流程看起来是如此完美,假设同时两个人下单,而库存只有…

python if else格式_Python if else条件语句详解

我们看到的代码都是顺序执行的,也就是先执行第1条语句,然后是第2条、第3条……一直到最后一条语句,这称为顺序结构。但是对于很多情况,顺序结构的代码是远远不够的,比如一个程序限制了只能成年人使用,儿童因…