正在阅读:C++实现用掌上电脑遥控电视C++实现用掌上电脑遥控电视

2005-09-08 10:07 出处: 作者:朱先中编译 责任编辑:moningfeng

  这个函数在我的ornada上运行良好。请看下面的讨论以进一步确定你要做的可能性改变。

BOOL CIrPulse::MakeStream(DWORD lValue) {
 DWORD dwStreamLength;
 //创建开始脉冲
 dwStreamLength=iHPulse/charWidth;
 ASSERT(Write((const char *)bPulseStream.GetData(),
 dwStreamLength)==dwStreamLength);
 // ************************************
 // ***** 在下一个脉冲到来前延迟一段时间
 // ************************************
 //循环操作代码中的位来发送脉冲
 for(int i=0;i<iDataLength;i++) {
  if(lValue & 1) {
   //创建一个脉冲1
   dwStreamLength=i1Pulse/charWidth;
   ASSERT(Write((const char *)bPulseStream.GetData(),
   dwStreamLength)==dwStreamLength);
   // *********************************
   // ***在下一个脉冲到来前延迟一段时间
   // *********************************
  }
  else {
   //创建一个脉冲 0
   dwStreamLength=i0Pulse/charWidth;
   ASSERT(Write((const char *)bPulseStream.GetData(),
   dwStreamLength)==dwStreamLength);
   // ********************************
   // **在下一个脉冲到来前延迟一段时间
   // ********************************
  }
  lValue >>= 1;
 }
 return TRUE;
}


  我在所附源代码中包含了一个简单的应用程序,它使用CIrPulse来创建一台索尼TV的远距离遥控。它具有基本的频道选择、音量调整和开/关机的功能。

4. 特别注意

  因为该CIrPort类使用一个串行端口连接到该IR端口,所以必须生成一个40KHz的载波信号,这通过从该串行端口发送恰当的字符来实现。幸好,如果我们发送字符0xdb,以115200波特,用8个数据位,2个停止位和奇偶校验,这样就能产生一种极接近38.4KHz的载波信号。我们所有的索尼设备接收这种数据是没有问题的。

  最大的问题是,如何实现间隔每次脉冲的沉默周期。不可能由串行端口来产生该沉默周期,因为就算你发送一个0x0字符,由于存在起始和停止位,你仍然在该IR上得到脉冲。我通过发送不同的字符进行试验,依据的前提是如果你不以40KHz的频率发送一个载波信号,这有可能使设备误把这个当作一个沉默。这样做的优点是你可以产生一个包含完整的代码的byteArray,以确保准确计时。但是结果并不一致,所以我拒绝使用这个方法,为的是实现在两次从串行端口发出成组的0xdb字符之间支持暂停。因为需要的延迟是以550μs的顺序;到目前为止,我还没有找到取得独立于处理器速度的暂停的方法。在我的Jornada上,是完全不必产生一个延迟的,因为每次调用Write函数看上去都使用了合适的时限。不管怎样,我担心的是,你可能胡乱产生一个可以使你的掌上电脑能工作的一个延迟。
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品