primula作者
14年8个月前IP:未同步
394951
10楼
本来因为急于求成,代码风格注释什么的都没在意,就没好意思把代码拿出来。。。

读取游戏摇杆需要用到DirectX ,一般玩游戏的电脑都有DirectX ,但开发需要SDK ,所以要下载DirectX SDK。

然后就是枚举设备,具体怎么读取可以参考一本叫《 Visual C++游戏编程基础》 的书,到处都有电子书下载,在有一章节讲了游戏摇杆怎么读取,但那个版本好像是DirectX7,有点老了,有的API名字已经变了,具体可以参照安装好了的DirectX SDK 目录下的示例程序,也可以参考我的读取程序。

读出来了摇杆数值以后就是用串口控制单片机,在单片机端就是通过串口然后对指令一个解析,我定义的指令是4个字节长,以@开头,以#结束,中间两个表示舵机A该转的角度,和舵机B该转的角度,单片机端接收指令主要代码在下面,我用的飞思卡尔。
void interrupt 20  SCI0_ISR(void)
{    
  unsigned char rdata;
  SCI0CR2_RIE=0;
  //此处为串口中断需要处理的事情
  rdata = Sci0Read();
  
  switch(rdata)
  {
    case '@':               //起始符号
        sci_count = 0;  
        sci_ready = 0;    
        break;
    case '#':                //终结符号
        sci_data[sci_count++] = 0;
        sci_ready = 1;
        break;
        
    default:
        sci_data[sci_count++] = rdata;        
  
  }
  SCI0CR2_RIE = 1;  
}
当主程序检测到sci_ready为1以后,就读取接收缓冲区,分别控制产生的PWM来控制舵机转过多少角度,具体舵机怎么控制可以百度。。。
上位机在枚举按键的时候就可以设定X轴和Y轴的上限和下限,在此处我设定的是下限0,上限180度,这样在摇杆静止居中的时候就是中间90度,舵机也转在中间位置,在后面付上的代码中,因为后来改来控制云台了,所以在串口发送部分发送的数据有变化,是发送的控制云台的指令。。。在代码中也有我自己写的串口类,只需要简单设置一下串口属性就行了,比如comm.OpenComm(L"com2",9600);打开串口2,波特率9600,    comm.SetLenght(0);设置接收到几个比特以后发送接收到消息,这里设置成0就是每收到一个字节都发送一次消息。具体怎么用在源代码里也有。。-_-
附上上位机代码,已经被我从控制舵机修改成控制监控球芯了,效果可以在论坛中另一篇帖子中找到  ^_^
另代码稍微有点乱,没什么注释,高手莫见笑[s:220]

attachment icon 上位机.rar 13.32KB RAR 40次下载
评论
文号 / 394951

百炼成钢
名片发私信
学术分 1
总主题 20 帖总回复 184 楼拥有证书:学者 机友 笔友
注册于 2012/03/10 14:27:21最后登录 2025/08/18 12:03:27
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:0

个人简介

暂未填写
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的