| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> c/c++ >> C++實現用掌上電腦遙控電視
 

C++實現用掌上電腦遙控電視

2008-06-01 02:04:55  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  1. 簡介

  你是否曾想過通過你的掌上電腦上的IR端口控制你的TV、Hi-Fi或者其它視頻?本文將介紹怎樣使用掌上電腦中的IR端口來編程控制一台TV。

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  2. 背景

  我近些日子丟失了我的老式索尼TV的遙控器。這本身沒有什麽問題,因爲我買了個新的遙控器作爲代替。然而,當電視失去了它的設定的顔色時,我碰到了問題,因爲它只能顯示黑白色了,而新的遙控器沒有顔色調整按鈕。我決定在我的老式的Jornada 525掌上電腦上寫一個程序使用IR端口把正確的代碼發送給TV。

  共有三個主要協議可以用于發送IR代碼到設備上。索尼TV使用 』Pulse Coded』 方法,它需要發送一個包含頭(header)位的以空格隔開的』1』位和』0』位的數據流。這些位被調制成一種40KHz的載波信號。其中,頭長度爲2200 μs,』1』位爲110 μs,』0』位爲550 μs,而空格是550μs的沈默(silence)。大多數索尼設備使用12位數據,它被分離成6位的地址(設備類型)和6位命令。因此數據看起來象這個樣子:hxxxxxxyyyyyy,其中h是頭位,xxxxxx是6位的命令(msb first),yyyyyy是6位的地址。對此我不再細述,因爲網上有很多資源描述這種協議,並列舉了針對不同設備的代碼。一些新的索尼設備使用19位代碼,我相信另外的制造商也使用和我描述的相同的格式。還有可能爲使用』Space Coded』或』Shift Coded』協議的設備寫出相似的類。

  我曾使用嵌入式C++寫過一個類CirPulse,它封裝了從一台運行Windows CE 3.0的Jornada 525 PC上控制索尼及其相匹配設備的功能。估計它能夠與其它相匹配設備和操作系統一起工作,但是你需要試驗才行!

  

C++實現用掌上電腦遙控電視
更多內容請看C/C++技術專題 電腦配置手冊 電腦維修專題專題,或

  3. 實現過程分析

  這個CIrPulse類暴露了幾個函數,它們使得發送IR代碼盡可能輕易。在聲明CIrPulse類時,你應該調用一次FindIrPort(),它返回一個描述IrDA端口的端口號的UINT,這通過搜索注冊表得到。

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  這個端口號用于後面的調用來打開IrDA端口進行串行通訊。

  UINT CIrPulse::FindIrPort()

  {

  // 查詢注冊表中的IR端口號

  HKEY hKey = NULL;

  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Comm\IrDA"),0, 0, &hKey) == ERROR_SUCCESS)

  {

  DWord dwType = 0;

  DWORD dwData = 0;

  DWORD dwSize = sizeof(dwData);

  if (RegQueryValueEx(hKey, _T("Port"), NULL, &dwType, (LPBYTE) &dwData, &dwSize) == ERROR_SUCCESS)

  {

  if (dwType == REG_DWORD && dwSize == sizeof(dwData))

  {

  RegCloseKey(hKey);

  

   return (UINT) dwData;

  }

  }

  RegCloseKey(hKey);

  }

  return 0;

  }

  得到端口號後,你可以調用Open(UINT)函數,把通過調用FindIrPort()得到的端口號傳遞過去。這打開該端口並設置串口參數,假如成功返回true。該端口被設置爲115200波特,8個數據位,2個停止位和奇偶校驗位。關于如何産生載波以及爲什麽我使用這些設置將在本文後面介紹。

  BOOL CIrPulse::Open(UINT uiport)

  {

  ASSERT(uiPort > 0 && uiPort <= 255);

  Close();

  //打開IRDA端口

  CString strPort;

  strPort.Format(_T("COM%d:"), uiPort);

  m_irPort = CreateFile((LPCTSTR) strPort, GENERIC_READ GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);

  if (m_irPort == INVALID_HANDLE_VALUE)

  {

  return FALSE;

  }

  //設置輸入和輸出緩沖區的大小

  VERIFY(SetupComm(m_irPort, 2048, 2048));

  //清除讀和寫緩沖區

  VERIFY(PurgeComm(m_irPort,PURGE_TXABORTPURGE_RXABORT

  PURGE_TXCLEARPURGE_RXCLEAR));

  //重新初始化所有的IRDA端口設置

  DCB dcb;

  dcb.DCBlength = sizeof(DCB);

  VERIFY(GetCommState(m_irPort, &dcb));

  dcb.BaudRate = CBR_115200;

  dcb.fBinary = TRUE;

  dcb.fParity = TRUE;

  dcb.fOutxCtsFlow = FALSE;

  dcb.fOutxDsrFlow = FALSE;

  dcb.fDtrControl = DTR_CONTROL_DISABLE;

  dcb.fDsrSensitivity = FALSE;

  dcb.fTXContinueOnXoff = FALSE;

  dcb.fOutX = FALSE;

  dcb.fInX = FALSE;

  dcb.fErrorChar = FALSE;

  dcb.fNull = FALSE;

  dcb.fRtsControl = RTS_CONTROL_DISABLE;

  dcb.fAbortOnError = FALSE;

  dcb.ByteSize = 8;

  dcb.Parity = EVENPARITY;

  dcb.StopBits = TWOSTOPBITS;

  VERIFY(SetCommState(m_irPort, &dcb));

  //爲所有的讀和寫操作設置超時值

  COMMTIMEOUTS timeouts;

  VERIFY(GetCommTimeouts(m_irPort, &timeouts));

  timeouts.ReadIntervalTimeout = MAXDWORD;

  timeouts.ReadTotalTimeoutMultiplier = 0;

  timeouts.ReadTotalTimeoutConstant = 0;

  timeouts.WriteTotalTimeoutMultiplier = 0;

  timeouts.WriteTotalTimeoutConstant = 0;

  VERIFY(SetCommTimeouts(m_irPort, &timeouts));

  DWORD dwEvent=EV_TXEMPTY;

  SetCommMask(m_irPort,dwEvent);

  return TRUE;

  }

C++實現用掌上電腦遙控電視
更多內容請看C/C++技術專題 電腦配置手冊 電腦維修專題專題,或

  調用函數SetCodeSize(DWORD)來設置要傳送的位數(如12位)。這可以在任何時候完成且只需要做一次。它一直保持有效,直到後面的調用改變它爲止。

  最後調用SendCode(long),傳遞實際要發送的代碼。

  BOOL CIrPulse::SendCode(DWORD lValue)

  {

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  

  DWORD dwCount;

  int i=0;

  ASSERT(iDataLength>0);

  //清除傳送緩沖區

  VERIFY(PurgeComm(m_irPort,PURGE_TXABORT PURGE_RXABORT PURGE_TXCLEAR PURGE_RXCLEAR));

  

   //每次按鍵設置代碼6次

  for(int x=0;x<6;x++) {

  MakeStream(lValue); //發送代碼

  dwCount=GetTickCount();

  while(GetTickCount()<dwCount+26) //延遲26ms

  i++;

  }

  return true;

  }

  注重這個函數調用另外一個函數MakeStream(long)6次,每兩次調用之間停頓26毫秒。我發現該代碼必須發送好幾次才能使接收設備響應,大概是爲防止假行爲的緣故吧。26毫秒對于接收設備登記該代碼是必需的,在下一個代碼出現之前。

  這個函數MakeStream(long)把字節流寫入IrPort,並根據是否有起始位(1或者0)來確保發送正確的數據包長度。包含數據字節(0xdb)的緩沖區是以一個ByteArray形式存在的。

  函數Close()用于在端口使用後,自然地關閉IrPort。

  

C++實現用掌上電腦遙控電視
更多內容請看C/C++技術專題 電腦配置手冊 電腦維修專題專題,或

  這個函數在我的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函數看上去都使用了合適的時限。不管怎樣,我擔心的是,你可能胡亂産生一個可以使你的掌上電腦能工作的一個延遲。

C++實現用掌上電腦遙控電視
更多內容請看C/C++技術專題 電腦配置手冊 電腦維修專題專題,或
 
 
 
上一篇《C++中extern “C”含義深層探索》
下一篇《精華:C++編程新手錯誤語錄(續一)》
 
 
 
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

河南夫妻在溫嶺網絡直播“造人”內容涉黃被刑事拘留

夫妻網絡直播“造人”爆紅   1月9日,溫嶺城北派出所接到南京警方的協查通告,他們近期打掉了一個涉黃直播APP平台。而根據掌握的線索,其中有一對涉案的夫妻主播...

如何防止牆紙老化?牆紙變舊變黃怎麽辦?

如何防止牆紙老化? (1)選擇透氣性好的牆紙 市場上牆紙的材質分無紡布的、木纖維的、PVC的、玻璃纖維基材的、布面的等,相對而言,PVC材質的牆紙最不透氣...

鮮肌之謎非日本生産VS鮮肌之謎假日貨是謠言

觀點一:破日本銷售量的“鮮肌之謎” 非日本生産 近一段時間,淘寶上架了一款名爲“鮮肌之謎的” 鲑魚卵巢美容液,號稱是最近日本的一款推出的全新護膚品,産品本身所...

中國最美古詩詞精選摘抄

系腰裙(北宋詞人 張先) 惜霜蟾照夜雲天,朦胧影、畫勾闌。人情縱似長情月,算一年年。又能得、幾番圓。 欲寄西江題葉字,流不到、五亭前。東池始有荷新綠,尚小如...

關于女人的經典語句

關于女人的經典語句1、【做一個獨立的女人】 思想獨立:有主見、有自己的人生觀、價值觀。有上進心,永遠不放棄自己的理想,做一份自己喜愛的事業,擁有快樂和成就...

未來我們可以和性愛機器人結婚嗎?

你想體驗機器人性愛嗎?你想和性愛機器人結婚嗎?如果你想,機器人有拒絕你的權利嗎? 近日,第二屆“國際人類-機器人性愛研討會”大會在倫敦金史密斯大學落下帷幕。而...

全球最變態的十個地方

10.土耳其地下洞穴城市 變態指數:★★☆☆☆ 這是土耳其卡帕多西亞的一個著名景點,傳說是當年基督教徒們爲了躲避戰爭而在此修建。裏面曾住著20000人,...

科學家稱,人類死亡後意識將在另外一個宇宙中繼續存活

據英國《每日快報》報道,一位科學家兼理論家Robert Lanza博士宣稱,世界上並不存在人類死亡,死亡的只是身體。他認爲我們的意識借助我們體內的能量生存,而且...

《屏裏狐》片頭曲《我愛狐狸精》歌詞是什麽?

《我愛狐狸精》 - 劉馨棋   (電視劇《屏裏狐》主題曲)   作詞:金十三&李旦   作曲:劉嘉   狐狸精 狐狸仙   千年修...

 
 
 
1. 簡介   你是否曾想過通過你的掌上電腦上的IR端口控制你的TV、Hi-Fi或者其它視頻?本文將介紹怎樣使用掌上電腦中的IR端口來編程控制一台TV。 2. 背景   我近些日子丟失了我的老式索尼TV的遙控器。這本身沒有什麽問題,因爲我買了個新的遙控器作爲代替。然而,當電視失去了它的設定的顔色時,我碰到了問題,因爲它只能顯示黑白色了,而新的遙控器沒有顔色調整按鈕。我決定在我的老式的Jornada 525掌上電腦上寫一個程序使用IR端口把正確的代碼發送給TV。   共有三個主要協議可以用于發送IR代碼到設備上。索尼TV使用 』Pulse Coded』 方法,它需要發送一個包含頭(header)位的以空格隔開的』1』位和』0』位的數據流。這些位被調制成一種40KHz的載波信號。其中,頭長度爲2200 μs,』1』位爲110 μs,』0』位爲550 μs,而空格是550μs的沈默(silence)。大多數索尼設備使用12位數據,它被分離成6位的地址(設備類型)和6位命令。因此數據看起來象這個樣子:hxxxxxxyyyyyy,其中h是頭位,xxxxxx是6位的命令(msb first),yyyyyy是6位的地址。對此我不再細述,因爲網上有很多資源描述這種協議,並列舉了針對不同設備的代碼。一些新的索尼設備使用19位代碼,我相信另外的制造商也使用和我描述的相同的格式。還有可能爲使用』Space Coded』或』Shift Coded』協議的設備寫出相似的類。   我曾使用嵌入式C++寫過一個類CirPulse,它封裝了從一台運行Windows CE 3.0的Jornada 525 PC上控制索尼及其相匹配設備的功能。估計它能夠與其它相匹配設備和操作系統一起工作,但是你需要試驗才行! [url=/bbs/detail_1785327.html][img]http://image.wangchao.net.cn/it/1323423865151.gif[/img][/url] 更多內容請看C/C++技術專題 電腦配置手冊 電腦維修專題專題,或 3. 實現過程分析   這個CIrPulse類暴露了幾個函數,它們使得發送IR代碼盡可能輕易。在聲明CIrPulse類時,你應該調用一次FindIrPort(),它返回一個描述IrDA端口的端口號的UINT,這通過搜索注冊表得到。 這個端口號用于後面的調用來打開IrDA端口進行串行通訊。 UINT CIrPulse::FindIrPort() {  // 查詢注冊表中的IR端口號  HKEY hKey = NULL;  if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("Comm\IrDA"),0, 0, &hKey) == ERROR_SUCCESS)  {   DWord dwType = 0;   DWORD dwData = 0;   DWORD dwSize = sizeof(dwData);   if (RegQueryValueEx(hKey, _T("Port"), NULL, &dwType, (LPBYTE) &dwData, &dwSize) == ERROR_SUCCESS)   {    if (dwType == REG_DWORD && dwSize == sizeof(dwData))    {     RegCloseKey(hKey);     return (UINT) dwData;    }   }   RegCloseKey(hKey);  }  return 0; }   得到端口號後,你可以調用Open(UINT)函數,把通過調用FindIrPort()得到的端口號傳遞過去。這打開該端口並設置串口參數,假如成功返回true。該端口被設置爲115200波特,8個數據位,2個停止位和奇偶校驗位。關于如何産生載波以及爲什麽我使用這些設置將在本文後面介紹。 BOOL CIrPulse::Open(UINT uiport) {  ASSERT(uiPort > 0 && uiPort <= 255);  Close();  //打開IRDA端口  CString strPort;  strPort.Format(_T("COM%d:"), uiPort);  m_irPort = CreateFile((LPCTSTR) strPort, GENERIC_READ GENERIC_WRITE,0, NULL, OPEN_EXISTING, 0, NULL);  if (m_irPort == INVALID_HANDLE_VALUE)  {   return FALSE;  }  //設置輸入和輸出緩沖區的大小  VERIFY(SetupComm(m_irPort, 2048, 2048));  //清除讀和寫緩沖區  VERIFY(PurgeComm(m_irPort,PURGE_TXABORTPURGE_RXABORT  PURGE_TXCLEARPURGE_RXCLEAR));  //重新初始化所有的IRDA端口設置  DCB dcb;  dcb.DCBlength = sizeof(DCB);  VERIFY(GetCommState(m_irPort, &dcb));  dcb.BaudRate = CBR_115200;  dcb.fBinary = TRUE;  dcb.fParity = TRUE;  dcb.fOutxCtsFlow = FALSE;  dcb.fOutxDsrFlow = FALSE;  dcb.fDtrControl = DTR_CONTROL_DISABLE;  dcb.fDsrSensitivity = FALSE;  dcb.fTXContinueOnXoff = FALSE;  dcb.fOutX = FALSE;  dcb.fInX = FALSE;  dcb.fErrorChar = FALSE;  dcb.fNull = FALSE;  dcb.fRtsControl = RTS_CONTROL_DISABLE;  dcb.fAbortOnError = FALSE;  dcb.ByteSize = 8;  dcb.Parity = EVENPARITY;  dcb.StopBits = TWOSTOPBITS;  VERIFY(SetCommState(m_irPort, &dcb));  //爲所有的讀和寫操作設置超時值  COMMTIMEOUTS timeouts;  VERIFY(GetCommTimeouts(m_irPort, &timeouts));  timeouts.ReadIntervalTimeout = MAXDWORD;  timeouts.ReadTotalTimeoutMultiplier = 0;  timeouts.ReadTotalTimeoutConstant = 0;  timeouts.WriteTotalTimeoutMultiplier = 0;  timeouts.WriteTotalTimeoutConstant = 0;  VERIFY(SetCommTimeouts(m_irPort, &timeouts));  DWORD dwEvent=EV_TXEMPTY;  SetCommMask(m_irPort,dwEvent);  return TRUE; } [url=/bbs/detail_1785327.html][img]http://image.wangchao.net.cn/it/1323423865178.gif[/img][/url] 更多內容請看C/C++技術專題 電腦配置手冊 電腦維修專題專題,或   調用函數SetCodeSize(DWORD)來設置要傳送的位數(如12位)。這可以在任何時候完成且只需要做一次。它一直保持有效,直到後面的調用改變它爲止。   最後調用SendCode(long),傳遞實際要發送的代碼。 BOOL CIrPulse::SendCode(DWORD lValue) {  DWORD dwCount;  int i=0;  ASSERT(iDataLength>0);  //清除傳送緩沖區  VERIFY(PurgeComm(m_irPort,PURGE_TXABORT PURGE_RXABORT PURGE_TXCLEAR PURGE_RXCLEAR));  //每次按鍵設置代碼6次  for(int x=0;x<6;x++) {   MakeStream(lValue); //發送代碼   dwCount=GetTickCount();   while(GetTickCount()<dwCount+26) //延遲26ms    i++;  }  return true; }   注重這個函數調用另外一個函數MakeStream(long)6次,每兩次調用之間停頓26毫秒。我發現該代碼必須發送好幾次才能使接收設備響應,大概是爲防止假行爲的緣故吧。26毫秒對于接收設備登記該代碼是必需的,在下一個代碼出現之前。   這個函數MakeStream(long)把字節流寫入IrPort,並根據是否有起始位(1或者0)來確保發送正確的數據包長度。包含數據字節(0xdb)的緩沖區是以一個ByteArray形式存在的。   函數Close()用于在端口使用後,自然地關閉IrPort。 [url=/bbs/detail_1785327.html][img]http://image.wangchao.net.cn/it/1323423865200.gif[/img][/url] 更多內容請看C/C++技術專題 電腦配置手冊 電腦維修專題專題,或   這個函數在我的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函數看上去都使用了合適的時限。不管怎樣,我擔心的是,你可能胡亂産生一個可以使你的掌上電腦能工作的一個延遲。 [url=/bbs/detail_1785327.html][img]http://image.wangchao.net.cn/it/1323423865232.gif[/img][/url] 更多內容請看C/C++技術專題 電腦配置手冊 電腦維修專題專題,或
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
小龍女彤彤之情溢皇都
龔潔
智能手機形象美女
崔潔彤
回家的路上----
中國一站(哈爾濱)
清明植物園的花。
桃花堤印象之豎版
 
>>返回首頁<<
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有