C#实现读取红外线遥控器.doc_第1页
C#实现读取红外线遥控器.doc_第2页
C#实现读取红外线遥控器.doc_第3页
C#实现读取红外线遥控器.doc_第4页
C#实现读取红外线遥控器.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#实现读取红外线遥控器2009-07-28 23:10前言: 很早就有一个想法,使用遥控器控制计算机,但一直没有实现。前段时间我一兄弟制作了一个红外头,接在计算机上,用其它软件实现了,但是我通过上拉软件进行读取时,总是发现每次产生的数据不一致,不一致我就没办法进行相应的操作。一直在摸索,找了很多资料,终于成功了,现把方法共享。一、串口加红外头电路图 U1接收头可以用TL0038A或TL0038B型号,其主要是管脚定义不一样,功能是相同。TL0038A的标记N处是一个缺脚,接收头TL0038B没有缺脚,只要拿到接收头管脚排列和其中的那一种管脚排列一样,就说时其管脚的定义就一样; Q1(9014)的作用是提高接收头拉电流能力,保证当串口2脚有较大拉电流时,不至于接收头拉电流太大使其电压下降到无法正常接收电压; D1、D3(1N4148)的作用是串口中4、7脚对地(5脚)在没有运行程序时一般电压为-6V-13V,当运行程序时 电压为+6V+13V,二极起隔离负压的作用; R1(200欧电阻)的作用是限流电阻,其选取范围可以从100到470欧(200为最佳),根据串口4、7电压高低选择,电压高选大一些,电压低选小一些,推荐用200欧电阻。其功率标称不管是1/4、1/8的电阻都可能用,因为功率很小所以都没有关系; D2(5.1V稳压管)的作用是保存5V电压恒压.滤波电容保证5V供电稳定。有两种功率标称1W和0.5W,这两种都可能用; C1(47UF/16V)的作用是滤波电容保证5V供电稳定。其容量可以在47UF-220UF范围选取。耐压只要在10V以上都能用。 U1TL0038ATL0038B1.一体化红外线接收头,电视机或VCD等里面都有。2.接收头有两种管脚定义.只要你买的接收头管脚排列如图所示的一种,相对应的管脚定义如图所示。3.TTL0038A与TL0038B只是作者用型号,其它型号都以用,只要管脚定义一样、VCC电压为5V就可以通用。4.TL0038A、TL0038B判断就看接收头管脚排列是否有空脚(标记N处),有就TL0038A型号。Q190149014为NPN型三极管,其管脚定义如图所示,E、B、C分别对应电路图中的三极管E、B、C。D1、D31N41481N4148二极管,图中(-)端对应电路图中的1N4148二极管箭头左边的黑线。图中(+)端对应电路图中的1N4148二极管箭头右边的黑三角。R1200欧电阻200欧稳压限流电阻,可用选择100欧到470欧之间电阻(推荐用200欧电阻),1/4W、1/8W电阻匀可使用。D25.1V稳压管5.1V稳压管的管脚判断与1N4148二极管一样,5.1V稳压管功率标称有1W(图左)或0.5W(图右)在这电路中都可以用。C147uF/16V电容47uF/16V电容为滤波电容,容量为47uF-220uF耐压、耐压在10V以上匀可使用权。如图所示电容上的白线(-)端为电路图中C1黑线(负端)。RS232C及三芯电缆线串口9芯母头及三芯电缆线(2米左右)1.串口9芯母头就是9孔的接头,电脑上的串口接头是9针,购买时注意这个就可以了。2.图中是一次成品的串口母头,我们要买的是串口9芯母头及外壳。3. 串口9芯母头引脚判断,一、可以根据接头上所标的数字判断;二、可以把接头对着自己,上面5个孔、下面4个孔,上面5个孔是从右到左为1-5、下面4个孔是从右到左为6-9。购买以上元器件后你就可以准备制作:1. 准备电烙铁、焊锡、助焊剂、万能表制作工具; 2. 因电路很简单就用做电路板,直接在串口头搭焊元器件即可; 3. 电源部分:在串口4,7脚个焊上(D1、D3)1n4148正端,把(D1、D3)1N4148两个负端与(R1)200欧电阻的一端焊上,再把(R1)200欧电阻另一端与电容的正端、稳压管的负端焊在一起,接着把电容负端及稳压管正端焊到串口5脚,这样5V电源就好了; 4. 接收部分:(Q1)9014三极管的E极接来串口2脚上,C极接到(D1、D3)1N4148两个负端及电阻的一端焊处,把2米的三芯线的一端三根线分别接到(R1)200欧电阻另一端与电容的正端、稳压管的负端焊处给接收头提供5V供电、串口的5脚提供接地、接到(Q1)9014三极管的b极起来接输入,把2米的三芯线的另一端三根线分别接到接收头的VCC、GND、OUT各管脚; 5. 把焊好电路的9芯串口母头放入串口外壳安装好后,电路就算已经完成了。 6. 运行IRCtrl程序后保证软件中打开的串口为你接接收器的串口并在串口接入收接器电路。要进行电路中5个电压点检测,分别是接收头的VCC电压为4.5V以上、接收头的OUT电压为3.7V以上、串口的2脚电压为3V以上、串口的4脚电压为6V以上、串口的7脚电压为6V以上,如果这5个点电压不符合要求请回来第3步重新查找,如果这5个点电压对了就说电路连接正常了。 注:以上摘自IRCtrl成品图如下二、C# 实现对于一般的红外遥控器来说,会是32位的编码,例如NEC的编码规则就是:用户识别码(8位)+ 用户识别码反码(8位)+ 数据码(8位)+ 数据码反码(8位)。经过一番研究,将上述编码按字节分开:00 FE FC FE FE FC FE FE FC 00 00 00 00 00 00 00 00 FC FC FC FC 00 F8 F8 F0 00 00 00 00 F0 00 00 00 00 00 00如果把00当做0,把FE、FC这些当做1,改写一下:0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 1 0 0再把这些0、1代码8位分成一组,末尾多余的0去掉,转化为16进制:7F807B84看到这里应该清楚了吧,经过这样一番转换的信号完全符合NEC的编码规则,而使用的遥控器确实就是采用了NEC的芯片的。回头分析一下,我猜想产生这样情况的原因可能是和串口设置的波特率有关,因为我们我们不知道红外遥控器的频率,不知道一个脉冲式多少时间,因此在较高波特率的情况下,0信号变成了多个0,1信号变成了多个1,至于为什么会有FC、FE这样不一样的编码,我猜想应该是因为一个脉冲的末尾电压不稳定造成的。注:以上分析摘自互联网,如有雷同或者侵权,请发邮件通知我。知道了这些,接下来的事情就简单了,写个函数转化一下就可以了,下面我附上源码。具体实现的时候我用到了DataReceived事件对串口数据进行监听,这样只要遥控器有信号过来就可以显示了。c# codeusing System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.IO.Ports;namespace 串口通信 public partial class Form1 : Form private SerialPort port; private const int CodeLength = 32; delegate void SetInfo(string info); public Form1() InitializeComponent(); private void button1_Click(object sender, EventArgs e) /初始化并打开串口 /用户选择完之后就可以通过构造方法实例化一个SerialPort对象。对于一般的红外线遥控器,使用以下的参数就可以了。 try port = new SerialPort(combComName.SelectedItem.ToString(),9600, Parity.None, 8, StopBits.One); /注意!使用SerialPort类,并且取串口的供电,需要把Dtr或者Dts随意打开一个,至于为什么打开,请查串口各脚定义。 port.DtrEnable = true; port.Open(); /监听串口数据 port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); btOpen.Enabled = false; btClose.Enabled = true; catch MessageBox.Show(打开串口失败,请检查串口是否被占用); /关闭串口 private void button2_Click(object sender, EventArgs e) port.Close(); btOpen.Enabled = true; btClose.Enabled = false; void port_DataReceived(object sender, SerialDataReceivedEventArgs e) byte buffer = new byteCodeLength; System.Threading.Thread.Sleep(100); int length = port.Read(buffer, 0, CodeLength); if (length CodeLength) return; this.Invoke(new SetInfo(DataReceived), BytesToHexString(buffer, 0, length); private string BytesToHexString(byte buffer, int offset, int length) string info = ; for (int i = offset; i offset + length; i+) info += string.Format(0:X2 , bufferi).Trim(); return info; protected void DataReceived(string info) /这里是要实现的功能,我只测试读出,并做简单的判断,如果你有想法,按自己的想法实现。 rtbSerialInfo.Text += (SignalToHexCode( info ).ToUpper()+rn; switch (SignalToHexCode(info) case 7f800af5: labSerialInfo.Text = 你当前按键是数字1!; break; case 7f803ec1: labSerialInfo.Text = 你当前按键是数字2!; break; default: break; /将原始的二进制信号转化为二进制编码 private string SignalToBinaryCode(string Signal) if (string.IsNullOrEmpty(Signal) return null; else string Code = ; for (int i = 0; i CodeLength*2; i = i + 2) if (Signal.Substring(i,1).Equals( 0) ) Code = Code + 0; else Code = Code + 1; return Code; /将二进制编码转化为16进制编码 private string SignalToHexCode(string Signal) Signal = SignalToBinaryCode(Signal); if (!string.IsNullOrEmpty(Signal) string HexCode = ; string HexCodePiece = ; for (int i = 0; i CodeLength; i = i + 4) HexCodePiece = Signal.Substring(i, 4); HexCode = HexCode + Convert.ToString(Convert.ToInt32(HexCodePiece, 2), 16); return HexCode; else return null; /*在名称空间System.IO.Ports里。要实例化一个SerialPort类,我们必须知道串口的名字,使用方法System.IO.Ports.SerialPort.GetPortNames()可以获得当前电脑可用的串口,如果计算机上有多个串口,计算机很难判断哪个串口是用来接受红外线数据的,因此只能由用户决定,这里我们可以用一个comboBox将可用串口列出来,供用户选择*/ private void comboBox1_DropDown(object sender, Eve

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论