自制电脑红外遥控接收器Word格式.docx
- 文档编号:13480682
- 上传时间:2022-10-11
- 格式:DOCX
- 页数:10
- 大小:119.31KB
自制电脑红外遥控接收器Word格式.docx
《自制电脑红外遥控接收器Word格式.docx》由会员分享,可在线阅读,更多相关《自制电脑红外遥控接收器Word格式.docx(10页珍藏版)》请在冰豆网上搜索。
引导码、地址码和数据码。
一般信号长度大约100ms左右,持续按键则重复发送(中间会有10ms以上的间歇)。
常态下,红外接收头的输出(OUT)都是高电平,引导码信号首先会令红外接收头输出一个大约10ms左右的低电平(不同遥控器有不同的时延),这可令接收设备从容判定信号的到来,而后面的地址码和数据码其电平高低变化就相对较快了,大概在几十或几百个微秒之间。
PC红外遥控软件一般选用Girder,在使用之前需要安装“SFH-56pluginforGirder”这个插件(文件名"
igorSFH-56Plug.dll"
),否则不能正常处理我们这种电路的红外接收器信号。
可悲的是我至今没找到这个插件,网上提供的很多链接都是坏的。
即使找到了这个插件,要想在我们自己编写的程序中使用也是困难的,因为Girder并没有为我们开发者提供API接口。
既然Girder能用软件实现红外解码,我们为什么不能呢?
凡事都要开动大脑,积极行动才对,下面就是我自己焊接的一个红外接收器(元器件是在中发买的,一共不到10元钱,还富裕好多电阻、电容!
)
(图下方的红外遥控器的接收器是基于USB的,仅支持Vista以上版本,并且不支持个人开发,不过今天它终于发挥了它应有的作用。
当然用电视或VCD遥控器也是可以的)
硬件有了,但程序该从何编起呢?
1、由于接收到的红外信号在微秒级别中变化,对系统实时性要求较高,所以具备垃圾回收功能,实时性没有保证的C#,似乎完不成这种信号的接收功能,所以我们选择的是VC,由它实现高优先级的线程去进行信号接收。
2、由于红外遥控信号是脉宽调制的串行码,所以我们需要采集信号的宽度,显然采用一般的时钟函数来获取时间间隔是不可行的,因为精度太低,所以我们需用采用多媒体时钟和高精度计时的API函数。
3、一般我们按键持续时间为几秒钟,并且由于按键发出前有一个10ms左右的引导信号,所以我们的程序很容易判断出信号起始点,这样我们一次仅需要接收一定量的原始数据就可以完成初步信号采集工作。
4、对于我们的红外接收程序来说并不需要实际解码出红外信号到底包含了那些具体的信息,只要其能够区分出红外遥控上的各个按键就行。
5、由于红接收器是通过串口RTS管脚供电,且通过DSR传递红外信号的,所以我们的程序即使不接收数据,也要打开串口,不过仅需要处理RTS和DSR管脚的信号即可。
好了,动手去做,下面是用VC实现的一个DLL,其功能就是接收并记录红外信号的持续时间。
核心代码如下:
DWORDWINAPIThreadProc(LPVOIDpParam)
{
LARGE_INTEGERlitmp;
LONGLONGQPart1,QPart2;
doubledfFreq;
intiTime=0;
//微秒
//获得计数器的时钟频率
QueryPerformanceFrequency(&
litmp);
dfFreq=(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,&
EvtMask,&
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)
QueryPerformanceCounter(&
QPart1=litmp.QuadPart;
HSC_State=1;
//复位计数
HSC_Index,0);
//开启定时器
HSC_TimerID=timeSetEvent(10,HSC_Accuracy,MMTimer,NULL,TIME_PERIODIC);
}
//接收数据状态
if(HSC_State==1)
QPart2=litmp.QuadPart;
//--
if(ModemState==0)
{
iTime=(int)((QPart2-QPart1)*dfFreq);
else
iTime=(int)((QPart1-QPart2)*dfFreq);
if(HSC_Index<
HSC_BufferSize)
*(HSC_Buffer+HSC_Index)=iTime;
InterlockedIncrement(&
HSC_Index);
QPart1=QPart2;
returnSTILL_ACTIVE;
}
如果采用WaitCommEvent函数,你会发现CPU使用时间会很低,不过它会让接收程序无法正常退出,所以只好注释掉该函数了,此时你会发现CPU使用时间会很高。
原始数据一旦采集完毕,剩下的就由C#程序大显身手吧。
C#中DLL的接口函数如下:
conststringDllPath=@"
YFHSCollect.dll"
;
[DllImport(DllPath)]
publicstaticexternInt32HSCStart(Int32COM,Int32delay,Int32BufferSize);
publicstaticexternInt32HSCEnd();
publicstaticexternInt32HSCData(int[]intData);
我封装了一个类,一旦有按键信息,就会触发一个Click事件。
此外程序还具备自学习功能,并且可以把学习后的结果序列化到一个XML文件中去,这样下次再按键就可以识别出键名了。
主程序中测试代码如下:
publicpartialclassfrmMain:
Form
YFHWCollecthw=null;
int[]hwData=null;
publicfrmMain()
InitializeComponent();
hw=newYFHWCollect(this,1);
hw.Click+=newYFHWCollect.HWEventHandler(hw_Click);
voidhw_Click(objectsender,HWEventArgse)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自制 电脑 红外 遥控 接收器
![提示](https://static.bdocx.com/images/bang_tan.gif)