C++實現(xiàn)用掌上電腦遙控電視

字號:

1. 簡介
    你是否曾想過通過你的掌上電腦上的IR端口控制你的TV、Hi-Fi或者其它視頻?本文將介紹怎樣使用掌上電腦中的IR端口來編程控制一臺TV。
    2. 背景
    我近些日子丟失了我的老式索尼TV的遙控器。這本身沒有什么問題,因為我買了個新的遙控器作為代替。然而,當電視失去了它的設定的顏色時,我遇到了問題,因為它只能顯示黑白色了,而新的遙控器沒有顏色調(diào)整按鈕。我決定在我的老式的Jornada 525掌上電腦上寫一個程序使用IR端口把正確的代碼發(fā)送給TV。
    共有三個主要協(xié)議可以用于發(fā)送IR代碼到設備上。索尼TV使用 ’Pulse Coded’ 方法,它需要發(fā)送一個包含頭(header)位的以空格隔開的’1’位和’0’位的數(shù)據(jù)流。這些位被調(diào)制成一種40KHz的載波信號。其中,頭長度為2200 μs,’1’位為110 μs,’0’位為550 μs,而空格是550μs的沉默(silence)。大多數(shù)索尼設備使用12位數(shù)據(jù),它被分離成6位的地址(設備類型)和6位命令。因此數(shù)據(jù)看起來象這個樣子:hxxxxxxyyyyyy,其中h是頭位,xxxxxx是6位的命令(msb first),yyyyyy是6位的地址。對此我不再細述,因為網(wǎng)上有很多資源描述這種協(xié)議,并列舉了針對不同設備的代碼。一些新的索尼設備使用19位代碼,我相信另外的制造商也使用和我描述的相同的格式。還有可能為使用’Space Coded’或’Shift Coded’協(xié)議的設備寫出相似的類。
    我曾使用嵌入式C++寫過一個類CirPulse,它封裝了從一臺運行Windows CE 3.0的Jornada 525 PC上控制索尼及其相匹配設備的功能。估計它能夠與其它相匹配設備和操作系統(tǒng)一起工作,但是你需要試驗才行!
    3. 實現(xiàn)過程分析
    這個CIrPulse類暴露了幾個函數(shù),它們使得發(fā)送IR代碼盡可能容易。在聲明CIrPulse類時,你應該調(diào)用一次FindIrPort(),它返回一個描述IrDA端口的端口號的UINT,這通過搜索注冊表得到。這個端口號用于后面的調(diào)用來打開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;
    }