自制电脑红外遥控接收器(pc软解码)

上传人:mg****85 文档编号:33620191 上传时间:2018-02-16 格式:DOC 页数:14 大小:215.50KB
返回 下载 相关 举报
自制电脑红外遥控接收器(pc软解码)_第1页
第1页 / 共14页
自制电脑红外遥控接收器(pc软解码)_第2页
第2页 / 共14页
自制电脑红外遥控接收器(pc软解码)_第3页
第3页 / 共14页
自制电脑红外遥控接收器(pc软解码)_第4页
第4页 / 共14页
自制电脑红外遥控接收器(pc软解码)_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《自制电脑红外遥控接收器(pc软解码)》由会员分享,可在线阅读,更多相关《自制电脑红外遥控接收器(pc软解码)(14页珍藏版)》请在金锄头文库上搜索。

1、自制电脑红外遥控接收器(PC 软解码) 收藏 网上有很多介绍红外遥控接收器制作的文章,但其中大部分是用单片进行红外解码,然后再通过串口或 USB 把解码后的按键信息传入到 PC 的。这样的电路制作起来,不仅造价相对偏高,而且需要对单片编程,这会令大部分软件开发爱好者望而却步。最近看到一篇仅需要 7 个简单元器件的红外接收器,只需拿起烙铁,不需硬件编程就可以制作完成,原理图如下:由原理图我们可知,红外接收头把接收的红外信号转换为高低电平通过串口的DSR 管脚传入到 PC,PC 软件通过对 DSR 高低电平信号的时间曲线进行分析,从而获得相对应的按键信息。红外遥控器一般采用脉宽调制的串行码,经 3

2、8kHz 的载频把红外信号发射出去。其编码信息一般由三部分组成:引导码、地址码和数据码。一般信号长度大约 100ms 左右,持续按键则重复发送(中间会有 10ms 以上的间歇)。常态下,红外接收头的输出(OUT)都是高电平,引导码信号首先会令红外接收头输出一个大约 10ms 左右的低电平(不同遥控器有不同的时延),这可令接收设备从容判定信号的到来,而后面的地址码和数据码其电平高低变化就相对较快了,大概在几十或几百个微秒之间。PC 红外遥控软件一般选用 Girder,在使用之前需要安装“SFH-56 plugin for Girder”这个插件(文件名igor SFH-56P lug.dll),

3、否则不能正常处理我们这种电路的红外接收器信号。可悲的是我至今没找到这个插件,网上提供的很多链接都是坏的。即使找到了这个插件,要想在我们自己编写的程序中使用也是困难的,因为 Girder 并没有为我们开发者提供 API 接口。既然 Girder 能用软件实现红外解码,我们为什么不能呢?凡事都要开动大脑,积极行动才对,下面就是我自己焊接的一个红外接收器(元器件是在中发买的,一共不到 10 元钱,还富裕好多电阻、电容!)(图下方的红外遥控器的接收器是基于 USB 的,仅支持 Vista 以上版本,并且不支持个人开发,不过今天它终于发挥了它应有的作用。当然用电视或 VCD 遥控器也是可以的)硬件有了,

4、但程序该从何编起呢?1、由于接收到的红外信号在微秒级别中变化,对系统实时性要求较高,所以具备垃圾回收功能,实时性没有保证的 C#,似乎完不成这种信号的接收功能,所以我们选择的是 VC,由它实现高优先级的线程去进行信号接收。2、由于红外遥控信号是脉宽调制的串行码,所以我们需要采集信号的宽度,显然采用一般的时钟函数来获取时间间隔是不可行的,因为精度太低,所以我们需用采用多媒体时钟和高精度计时的 API 函数。3、一般我们按键持续时间为几秒钟,并且由于按键发出前有一个 10ms 左右的引导信号,所以我们的程序很容易判断出信号起始点,这样我们一次仅需要接收一定量的原始数据就可以完成初步信号采集工作。4

5、、对于我们的红外接收程序来说并不需要实际解码出红外信号到底包含了那些具体的信息,只要其能够区分出红外遥控上的各个按键就行。5、由于红接收器是通过串口 RTS 管脚供电,且通过 DSR 传递红外信号的,所以我们的程序即使不接收数据,也要打开串口,不过仅需要处理 RTS 和 DSR 管脚的信号即可。好了,动手去做,下面是用 VC 实现的一个 DLL,其功能就是接收并记录红外信号的持续时间。核心代码如下:DWORD WINAPI ThreadProc(LPVOID pParam)LARGE_INTEGER litmp; LONGLONG QPart1,QPart2; double dfFreq;in

6、t iTime=0; /微秒/ 获得计数器的时钟频率 QueryPerformanceFrequency( dfFreq = (double)1000000.0/litmp.QuadPart;DWORD ModemState,oldModemState=MS_DSR_ON;/EV_BREAK or EV_CTS or EV_DSR or EV_ERR or EV_RING or EV_RLSD or EV_RXCHAR or EV_RXFLAG or EV_TXEMPTY/SetCommMask(HSC_COM_Handle,EV_DSR);/DWORD EvtMask,dwError;/CO

7、MSTAT cs;while(HSC_Thread_RunFlag)/等待 DSR 信号发生变化/WaitCommEvent(HSC_COM_Handle,/ClearCommError(HSC_COM_Handle, /获得 DSR 的状态GetCommModemStatus(HSC_COM_Handle,ModemState = (ModemState if(ModemState = oldModemState) continue;oldModemState=ModemState;/清计数InterlockedExchange( /开始接收数据if(HSC_State = 0 & Mode

8、mState = 0)QueryPerformanceCounter( QPart1 = litmp.QuadPart; HSC_State=1;/复位计数 InterlockedExchange(InterlockedExchange(/开启定时器HSC_TimerID = timeSetEvent(10,HSC_Accuracy,MMTimer,NULL,TIME_PERIODIC);continue;/接收数据状态if(HSC_State = 1)QueryPerformanceCounter( QPart2 = litmp.QuadPart; /-if(ModemState = 0)

9、iTime = (int)(QPart2-QPart1)*dfFreq); elseiTime = (int)(QPart1-QPart2)*dfFreq);if(HSC_Index HSC_BufferSize)*(HSC_Buffer+HSC_Index) = iTime;InterlockedIncrement(/-QPart1=QPart2;return STILL_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 文件中去,这样下次再按键就可以识别出键名了。主程序中测试代码如下:public partial class frmMain : FormYFHWCollect hw =null;int hwData = null;public frmMain()InitializeComponent();hw = new YFHWCollect(this, 1); hw.Click += new YFHWCollect.HWEventHandler(hw_Click);void hw_Click(object se

12、nder, HWEventArgs e)string strInfo = ;for (int i = 0; i e.lstData.Count; i+)for (int j = 0; j e.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(); private v

13、oid btnCommand_Click(object sender, EventArgs e)if (btnCommand.Text = 开始)btnCommand.Text = 停止;hw.Start();elsebtnCommand.Text = 开始;hw.End();private void btnStudy_Click(object sender, EventArgs e)hw.Study(txtKeyName.Text);private void picBar_Paint(object sender, PaintEventArgs e) int width = picBar.Wi

14、dth, height = picBar.Height;e.Graphics.DrawLine(new Pen(Color.Gray), 0, height / 2, width, height / 2);if (hwData != null)float Len=0;foreach(int l in hwData)Len+=l;float dx = width / Len,DX=0;Pen p = new Pen(Color.Green);float Y=0, Y1=height/4,Y2=(float)(height*3.0/4.0);float X=0;for(int i=0;ihwDat

15、a.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 管脚,所以不能正常使用,对比较好的 USB 转串口(比如 Moxa 的三百多一根),虽然所有的管脚都引出了,但是由于是通过 USB 转换的,所以响应时间很是问题,我就因为这个差一点功亏一篑,幸好把程序又在 PC 机跑了一遍。/获得 DSR 的状态GetCommModemStatus(HSC_COM_Handle,上面的指令如果采用的是 USB 转串口,运行时间会是 7ms 左右,而用主板自带串口仅是几个微秒,相差实在太大了。所以上面的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号