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;
}
你是否曾想過通過你的掌上電腦上的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;
}

