深入浅出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











注:串口调试助手是免费软件,版权归原作者所有。
鉴于本帖篇幅有点长,我决定对下位机另开一贴,同时也防止本帖沉掉,相信版主应该没意见吧
//--------------------------------------------------------------------------
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值