看此贴前您需要掌握的技能或知识:
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

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

深入浅出FSUIPC的作用以及使用方法相关推荐

  1. ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法

    ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法 参考文章: (1)ios10 safari浏览器 在touchmove 里面写 ...

  2. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

  3. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  4. Python之pyc文件作用及生成方法

    Python之pyc文件作用及生成方法_宗而研之的博客-CSDN博客 1 什么是pyc 首先了解下python的运行机制及特性:当我们运行python文件程序的时候,Python解释器将源码转换为字节 ...

  5. 荒野求生一直获取服务器信息,荒野求生各资源作用及获取方法

    关于资源作用及获取方法! 1.木材:作用最大的资源,没有木材你将难以生存. 作用:烧制食物;蒸馏淡水;升级或建造建筑;制造武器;生火;烧制木炭等. 获取方式:砍伐海滩椰子树;砍伐雨林乔木;砍伐松木林松 ...

  6. 荒岛求生html5母狼攻,荒岛求生各资源作用及获取方法详解

    荒岛求生各资源作用及获取方法详解 2018-03-06 13:45:22来源:游戏下载编辑:野狐禅评论(0) 荒岛求生地图中有很多资源可以获取,它们各有什么作用呢?下面就为大家带来荒岛求生资源作用及获 ...

  7. 荒岛求生html5母狼攻,荒岛求生各资源作用及获取方法解析 荒岛求生资源怎么获得...

    荒岛求生地图中有很多资源可以获取,它们各有什么作用呢?下面为大家带来荒岛求生各资源作用及获取方法解析,还不清楚的玩家一起来看看吧. 荒岛求生各资源作用及获取方法解析 1.木材:作用最大的资源,没有木材 ...

  8. 计算机网络设置中的网关是什么设备,网关是什么_网关的作用与设置方法介绍 一看就明白...

    网关是什么?对于普通的用户来说,电脑网关不是很明白的,不过接触电脑多了之后,大家也会常常会听到"网关"这个词,那么问题就来了,这个网关是什么意思呢?它又有哪些作用呢?今晚,智能手机 ...

  9. 关于IOS调用微信支付jsapi不起作用的解决方法

    关于IOS调用微信支付jsapi不起作用的解决方法 参考文章: (1)关于IOS调用微信支付jsapi不起作用的解决方法 (2)https://www.cnblogs.com/randy619/p/5 ...

最新文章

  1. Essential Studio for mobile MVC如何创建一个Razor应用程序平台
  2. USACO 保护花朵 Protecting the Flowers, 2007 Jan
  3. 第十二章:Java_常用类
  4. php识别地址,实现地址自动识别实例(PHP)
  5. 多线程基础(二)pthread的了解
  6. Altium AD20常用的操作快捷键,个人总结精炼版,全干货超实用
  7. 工具栏快速创建类_还费时费力找菜单栏中的工具?教你制作属于自己的快速访问工具栏...
  8. 网站技术架构发展之我见--[引子]
  9. 基于信息论的编码技术
  10. 6个小故事:让你变身营销超人!
  11. 从西直门立交桥谈IT架构与重构(干货)
  12. vscode——记单词插件Qwerty Learner
  13. oracle的柳叶刀,柳叶刀:千万分之一的罕见病
  14. 传统手工排程痛点多,带您了解APS高级计划排程系统
  15. 智慧校园是实现智慧教育的必由之路
  16. 判断字符串中是否仅包含英文字母、数字和汉字
  17. Android studio包含四个tab微信页面设计
  18. ecshop2.5软件的文件架构{转}
  19. processing创意图形代码_Processing练习-Self Sketch - TAI CHI
  20. SAP License:ERP系统是什么意思

热门文章

  1. vue图片查看控件v-viewer使用
  2. centos7下编译openjdk11
  3. Red5 修改RTMP监听端口和ip
  4. c语言两个字符串比较,将两个字符串s1和s2比较,如果s1s2,数组编程:将2个字符串s1和s2比较。若s1s2输出1;若s1=s2,输出0;若s1s2,输出-1(不能用strcmp函数)...
  5. hive sqoop导出 postgresql精度丢失_Mysql 与 hadoop 数据同步(迁移),你需要知道 Sqoop...
  6. HTML5DOM红蓝盒子,DOM介绍以及使用方法(示例代码)
  7. qt c语言socket,c – Qt双向客户端服务器使用QTcpSocket和QTcpServer
  8. 多表操作查询 一对一
  9. Android_Kotlin 代码学习
  10. Javascript引擎单线程机制及setTimeout执行原理说明