




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、自制電腦紅外遙控接收器(PC軟解碼)網上有很多介紹紅外遙控接收器制作的文章,但其中大部分是用單片進行紅外解碼,然后再通過串口或USB把解碼后的按鍵信息傳入到PC的。這樣的電路制作起來,不僅造價相對偏高,而且需要對單片編程,這會令大部分軟件開發愛好者望而卻步。最近看到一篇僅需要7個簡單元器件的紅外接收器,只需拿起烙鐵,不需硬件編程就可以制作完成,原理圖如下:由原理圖我們可知,紅外接收頭把接收的紅外信號轉換為高低電平通過串口的DSR管腳傳入到PC,PC軟件通過對DSR高低電平信號的時間曲線進行分析,從而獲得相對應的按鍵信息。紅外遙控器一般采用脈寬調制的串行碼,經38kHz的載頻把紅外信號發射出去。
2、其編碼信息一般由三部分組成:引導碼、地址碼和數據碼。一般信號長度大約100ms左右,持續按鍵則重復發送(中間會有10ms以上的間歇)。常態下,紅外接收頭的輸出(OUT)都是高電平,引導碼信號首先會令紅外接收頭輸出一個大約10ms左右的低電平(不同遙控器有不同的時延),這可令接收設備從容判定信號的到來,而后面的地址碼和數據碼其電平高低變化就相對較快了,大概在幾十或幾百個微秒之間。PC紅外遙控軟件一般選用Girder,在使用之前需要安裝“SFH-56 plugin for Girder”這個插件(文件名igor SFH-56P lug.dll),否則不能正常處理我們這種電路的紅外接收器信號。可悲的
3、是我至今沒找到這個插件,網上提供的很多鏈接都是壞的。即使找到了這個插件,要想在我們自己編寫的程序中使用也是困難的,因為Girder并沒有為我們開發者提供API接口。既然Girder能用軟件實現紅外解碼,我們為什么不能呢?凡事都要開動大腦,積極行動才對,下面就是我自己焊接的一個紅外接收器(元器件是在中發買的,一共不到10元錢,還富裕好多電阻、電容!)(圖下方的紅外遙控器的接收器是基于USB的,僅支持Vista以上版本,并且不支持個人開發,不過今天它終于發揮了它應有的作用。當然用電視或VCD遙控器也是可以的)硬件有了,但程序該從何編起呢?1、由于接收到的紅外信號在微秒級別中變化,對系統實時性要求較
4、高,所以具備垃圾回收功能,實時性沒有保證的C#,似乎完不成這種信號的接收功能,所以我們選擇的是VC,由它實現高優先級的線程去進行信號接收。2、由于紅外遙控信號是脈寬調制的串行碼,所以我們需要采集信號的寬度,顯然采用一般的時鐘函數來獲取時間間隔是不可行的,因為精度太低,所以我們需用采用多媒體時鐘和高精度計時的API函數。3、一般我們按鍵持續時間為幾秒鐘,并且由于按鍵發出前有一個10ms左右的引導信號,所以我們的程序很容易判斷出信號起始點,這樣我們一次僅需要接收一定量的原始數據就可以完成初步信號采集工作。4、對于我們的紅外接收程序來說并不需要實際解碼出紅外信號到底包含了那些具體的信息,只要其能夠區
5、分出紅外遙控上的各個按鍵就行。5、由于紅接收器是通過串口RTS管腳供電,且通過DSR傳遞紅外信號的,所以我們的程序即使不接收數據,也要打開串口,不過僅需要處理RTS和DSR管腳的信號即可。好了,動手去做,下面是用VC實現的一個DLL,其功能就是接收并記錄紅外信號的持續時間。核心代碼如下:DWORDWINAPIThreadProc(LPVOIDpParam)LARGE_INTEGERlitmp;LONGLONGQPart1,QPart2;doubledfFreq;intiTime=0;/微秒/獲得計數器的時鐘頻率QueryPerformanceFrequency(&litmp);dfFreq=(
6、double)1000000.0/litmp.QuadPart;DWORDModemState,oldModemState=MS_DSR_ON;/EV_BREAKorEV_CTSorEV_DSRorEV_ERRorEV_RINGorEV_RLSDorEV_RXCHARorEV_RXFLAGorEV_TXEMPTY/SetCommMask(HSC_COM_Handle,EV_DSR);/DWORDEvtMask,dwError;/COMSTATcs;while(HSC_Thread_RunFlag)/等待DSR信號發生變化/WaitCommEvent(HSC_COM_Handle,&EvtMas
7、k,&HSC_Ovread);/ClearCommError(HSC_COM_Handle,&dwError,&cs);/獲得DSR的狀態GetCommModemStatus(HSC_COM_Handle,&ModemState);ModemState=(ModemState&MS_DSR_ON);if(ModemState=oldModemState)continue;oldModemState=ModemState;/清計數InterlockedExchange(&HSC_NUM,0);/開始接收數據if(HSC_State=0&ModemState=0)QueryPerformanceC
8、ounter(&litmp);QPart1=litmp.QuadPart;HSC_State=1;/復位計數InterlockedExchange(&HSC_NUM,0);InterlockedExchange(&HSC_Index,0);/開啟定時器HSC_TimerID=timeSetEvent(10,HSC_Accuracy,MMTimer,NULL,TIME_PERIODIC);continue;/接收數據狀態if(HSC_State=1)QueryPerformanceCounter(&litmp);QPart2=litmp.QuadPart;/-if(ModemState=0)iT
9、ime=(int)(QPart2-QPart1)*dfFreq);elseiTime=(int)(QPart1-QPart2)*dfFreq);if(HSC_IndexHSC_BufferSize)*(HSC_Buffer+HSC_Index)=iTime;InterlockedIncrement(&HSC_Index);/-QPart1=QPart2;returnSTILL_ACTIVE;如果采用WaitCommEvent函數,你會發現CPU使用時間會很低,不過它會讓接收程序無法正常退出,所以只好注釋掉該函數了,此時你會發現CPU使用時間會很高。原始數據一旦采集完畢,剩下的就由C#程序大顯身
10、手吧。C#中DLL的接口函數如下: const string DllPath = YFHSCollect.dll; DllImport(DllPath) public static extern Int32 HSCStart(Int32 COM, Int32 delay, Int32 BufferSize); DllImport(DllPath) public static extern Int32 HSCEnd(); DllImport(DllPath) public static extern Int32 HSCData(int intData);我封裝了一個類,一旦有按鍵信息,就會觸發一
11、個Click事件。此外程序還具備自學習功能,并且可以把學習后的結果序列化到一個XML文件中去,這樣下次再按鍵就可以識別出鍵名了。主程序中測試代碼如下:publicpartialclassfrmMain:FormYFHWCollecthw=null;inthwData=null;publicfrmMain()InitializeComponent();hw=newYFHWCollect(this,1);hw.Click+=newYFHWCollect.HWEventHandler(hw_Click);voidhw_Click(objectsender,HWEventArgse)stringstr
12、Info=;for(inti=0;ie.lstData.Count;i+)for(intj=0;je.lstDatai.Length;j+)strInfo+=e.lstDataij.ToString()+;strInfo+=rn;txtInfo.Text=strInfo;lblKeyName.Text=e.KeyName+(+(e.Interval/10).ToString()+ms);hwData=e.Data;picBar.Refresh();privatevoidbtnCommand_Click(objectsender,EventArgse)if(btnCommand.Text=開始)
13、btnCommand.Text=停止;hw.Start();elsebtnCommand.Text=開始;hw.End();privatevoidbtnStudy_Click(objectsender,EventArgse)hw.Study(txtKeyName.Text);privatevoidpicBar_Paint(objectsender,PaintEventArgse)intwidth=picBar.Width,height=picBar.Height;e.Graphics.DrawLine(newPen(Color.Gray),0,height/2,width,height/2);
14、if(hwData!=null)floatLen=0;foreach(intlinhwData)Len+=l;floatdx=width/Len,DX=0;Penp=newPen(Color.Green);floatY=0,Y1=height/4,Y2=(float)(height*3.0/4.0);floatX=0;for(inti=0;ihwData.Length;i+)Y=(i%2)=0?Y2:Y1);DX=hwDatai*dx;e.Graphics.DrawLine(p,X,Y,X+DX,Y);X+=DX;e.Graphics.DrawLine(p,X,Y1,X,Y2);測試程序運行結果如下:(上面顯示的數據為高電平和低電平的持續時間(低高低高),單位為1/10毫秒)注意事項:1、紅外遙控器按鍵偶數次和奇數次的編碼是不同的,程序需要學習兩次,才能正常識別按鍵信息。2、普通的USB轉串口由于僅連接了2、3、5管腳,所以不能正常使用,對比較好的US
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025財務人員合同書范本
- 2025年上海企業(事業)單位勞動合同
- 2025勞動合同書(示范文本)
- 2025二手房買賣合同全文版
- 2025餐廳臨時廚師勞動合同
- 2025水利工程建筑施工合同(范本)
- 《貓咪與花園:互動教學課件》
- 2025標準別墅裝修合同范本
- 大學生職業規劃190
- 申請甲方盡快簽合同協議
- 社區衛生服務中心(站)財務、藥品、固定資產、檔案、信息管理制度
- 田野考古工作規程附錄一
- 10x2017對稱式三輥卷板機設計說明書
- 大象版小學《科學》實驗目錄
- 氣柜施工方案(修改)
- 工廠無塵室培訓教材ppt課件
- 美國各州的縮寫及主要城市
- 畢業設計(論文)-電話聽筒塑料模具設計說明書
- 基坑監測階段性報告.doc
- 初始過程能力分析報告
- 第三章球墨鑄鐵ppt課件
評論
0/150
提交評論