深入浅出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,一经查实,立即删除!

相关文章

PHP面向对象2之变量、方法

1 <?php2 /**3 * PHP面向对象基础 调用变量4 */5 class Computer{6 //字段成员的声明格式&#xff1a;修饰符 变量名[xxx]7 public $_name;//public 表示类外可以访问&#xff0c;为公有变量8 public $_model;9 } 10 //创建一个对象…

在 VC6 中使用 GdiPlus-安装

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

算法训练|实现 Trie (前缀树)

208. 实现 Trie (前缀树) - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; Trie&#xff0c;又称前缀树或字典树&#xff0c;是一棵有根树&#xff0c;其每个节点包含以下字段&#xff1a; 指向子节点的指针数组 children。对于本题而言&#xff0c;数组长度为 26…

ASP.NET MVC 的多国语系支持

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

airtest web 录制滑块_Airtest之web自动化(一)

Airtest之web自动化(一)[此文档有许多涉及到gif动图的地方&#xff0c;请全屏观看]了解Airtest&#xff1a;简介&#xff1a;Airtest是由网易团队开发的一款自动化框架&#xff0c;前期运用与游戏测试(通过截图识别)&#xff0c;后来又被运用到安卓测试以及web测试。这款自动化…

error C2065: 'ULONG_PTR' : undeclared identifier

处理方法: 把#define ULONG_PTR ULONG 加到 stdafx文件 靠前面的位置 原因&#xff1a; Visual C 6.0 开发环境, gdi 的头文件和库文件并没有被包含在环境中, 需要您手工安装 VC6 中没有 ULONG_PTR 类型

重构价格日历

重构价格日历转载于:https://www.cnblogs.com/usual2013blog/p/3728655.html

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

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

RegOpenKeyEx 返回值 2

RegOpenKeyEx 返回值 2 x64 系统&#xff1a; 32bit 应用程序调用RegOpenKeyEx (HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft", 0, KEY_WOW64_64KEY | KEY_READ, &hKey ); 注意 KEY_WOW64_64KEY 权限值必须使用否则将查找不到指定的路径。

mysql client 未开启_Django+mysqlclient未关闭数据库连接

我使用2个mysql数据库连接。在django中的每个页面请求之后&#xff0c;连接计数(如SHOW STATUS LIKE Conn%所示)每次增加2。在Python 3.4.0django 1.8.2mysqlclient 1.3.6版(Windows和Linux似乎都有这个问题)最初我直接通过MySQLdb访问第二个数据库&#xff0c;但现在我改为使用…

OpenGL中各种坐标系的理解

OPENGL坐标系可分为&#xff1a;世界坐标系和当前绘图坐标系。 世界坐标系&#xff1a;在OpenGL中&#xff0c;世界坐标系是以屏幕中心为原点(0, 0, 0)&#xff0c;且是始终不变的。你面对 屏幕&#xff0c;你的右边是x正轴&#xff0c;上面是y正轴&#xff0c;屏幕指向你的为z…

默认手机照相功能

下面是主要代码: - (void) addPicEvent { //先设定sourceType为相机&#xff0c;然后判断相机是否可用&#xff08;ipod&#xff09;没相机&#xff0c;不可用将sourceType设定为相片库 UIImagePickerControllerSourceType sourceType UIImagePickerControllerSourceT…

qmake生成vs2013工程文件

qmake -spec win32-msvc2013 -r -tp vc xxx.pro

iOS面试题

今天上午&#xff0c;下午分别面试了两家公司。上午是一家互联网公司&#xff0c;气氛还比较好&#xff0c;是我比较喜欢的。技术这块是直接机试&#xff0c;主要是给了些BUG让我修复&#xff0c;整个过程还算顺利。下午去了一家大型的证券公司。整理技术问题如下&#xff1a; …

Prepar3d.cfg

如果设置为0&#xff0c;打开p3d直接进入默认场景 [USERINTERFACE] SHOW_SCENARIO_WINDOW1

mysql严格模式 报错_mysql严格模式

mysql严格模式严格模式例子1234567DB::table(table_name)->where(status, 1)->select(DB::raw(sum(score) as num,user_id,channel))->groupBy(user_id)->orderBy(num, desc)->limit(10)->get();会报错&#xff1a;Syntax error or access violation: 1055 E…

Android Service 的一些笔记

绑定服务&#xff1a; 用于间接调用服务里面的方法。如果调用者Activity被销毁了&#xff0c;服务也跟着销毁了&#xff0c;服务也会跟着销毁。 开启服务&#xff1a; 不可以调用服务里面的方法。如果调用者的Activity退出了&#xff0c;服务还会长期在后台运行 生命周期 ①单独…

python traceback 丢失_基于python traceback实现异常的获取与处理

这篇文章主要介绍了基于python traceback实现异常的获取与处理,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下1、traceback.print_exc()2、traceback.format_exc()3、traceback.print_exception()简单说下这三个…

用Javascript获取页面元素的位置

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

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

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