亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C#實現在PC端讀取紅外線遙控器信號

2019-11-17 04:16:46
字體:
來源:轉載
供稿:網友

這幾天要完成個任務,就是利用一個紅外線適配器接受紅外線遙控器的信號,在PC上讀取信號,并判斷按的是哪個鍵,因為整個項目的需要,要求用C#實現。

 

首先,需要一個紅外線適配器(廢話~),因為我是用本本開發的,而我的本本沒有串口,所以就用了一個USB的紅外線適配器,這里需要一個USB轉串口的驅動,網上搜一下就有了,CSDN的下載里也有朋友上傳。

 

驅動裝上之后,就可以進行開發了。.net 為我們提供了一個串口類(有且僅有一個~~),就是SerialPort類,在名稱空間System.IO.Ports里。要實例化一個SerialPort類,我們必須知道串口的名字,使用方法System.IO.Ports.SerialPort.GetPortNames()可以獲得當前電腦可用的串口,如果計算機上有多個串口,計算機很難判斷哪個串口是用來接受紅外線數據的,因此只能由用戶決定,這里我們可以用一個comboBox將可用串口列出來,供用戶選擇

view plaincopy to clipboardPRint?
string[] ports = System.IO.Ports.SerialPort.GetPortNames();  
           foreach (string port in ports)  
           {  
               combComName.Items.Add(port);  
           } 
 string[] ports = System.IO.Ports.SerialPort.GetPortNames();
            foreach (string port in ports)
            {
                combComName.Items.Add(port);
            }

用戶選擇完之后就可以通過構造方法實例化一個SerialPort對象了。對于一般的紅外線遙控器,使用以下的參數就可以了。

view plaincopy to clipboardprint?
port = new SerialPort( combComName.SelectedItem.ToString() , 9600, Parity.None, 8, StopBits.One);  
            port.Open(); 
port = new SerialPort( combComName.SelectedItem.ToString() , 9600, Parity.None, 8, StopBits.One);
            port.Open();

打開串口之后,我們就可以讀取串口信號了。這里我們使用read方法。由于一條按鍵信號一般為32位,這里我們就只接收32位數據了。

view plaincopy to clipboardprint?
byte[] buffer = new byte[36];  
System.Threading.Thread.Sleep(100);  
port.Read(buffer, 0, 36); 
byte[] buffer = new byte[36];
System.Threading.Thread.Sleep(100);
port.Read(buffer, 0, 36);

接下來是要把byte轉化成為16進制代碼??梢詫懸粋€函數

view plaincopy to clipboardprint?
private string BytesToHexString(byte[] buffer, int offset, int length)  
       {  
           string info = "";  
           for (int i = offset; i < offset + length; i++)  
           {  
               info += string.Format("{0:X} ", buffer[i]).Trim();  
           }  
           return info;  
       } 
 private string BytesToHexString(byte[] buffer, int offset, int length)
        {
            string info = "";
            for (int i = offset; i < offset + length; i++)
            {
                info += string.Format("{0:X} ", buffer[i]).Trim();
            }
            return info;
        }

好的,現在如果我們用上述方法把接收到的信號顯示出來,應該是類似于這樣的:

 

00FEFCFEFEFCFEFEFC0000000000000000FCFCFCFC00F8F8F000000000F00000

而且即使是同一個按鍵,有時候編碼還會有不一樣的。

 

 

對于一般的紅外遙控器來說,不可能會是這么長的編碼的,例如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事件對串口數據進行監聽,這樣只要遙控器有信號過來就可以顯示了。

view plaincopy to clipboardprint?
using 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 testseral  
{  
    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)  
        {  
            //初始化并打開串口  
            port = new SerialPort( combComName.SelectedItem.ToString() , 9600, Parity.None, 8, StopBits.One);  
            port.Open();  
            //監聽串口數據  
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);  
            btOpen.Enabled = false;  
            btClose.Enabled = true;  
        }  
        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 byte[CodeLength];  
                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} ", buffer[i]).Trim();  
            }  
            return info;  
        }  
        protected void DataReceived(string info)  
        {  
            rtbSerialInfo.Text += SignalToHexCode( info );  
        }  
        //將原始的二進制信號轉化為二進制編碼  
        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;  
        }  
        private void comboBox1_DropDown(object sender, EventArgs e)  
        {  
            //獲得所有串口  
            combComName.Items.Clear();  
            string[] ports = System.IO.Ports.SerialPort.GetPortNames();  
            foreach (string port in ports)  
            {  
                combComName.Items.Add(port);  
            }  
        }  
    }  
}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91在线高清视频| 国外成人在线直播| 亚洲精品日韩欧美| 97精品国产97久久久久久| 日韩国产高清视频在线| 日本久久精品视频| 亚洲美女精品成人在线视频| 亚洲一区av在线播放| 91精品啪aⅴ在线观看国产| 亚洲成人在线视频播放| 国产精品亚洲欧美导航| 中文字幕精品在线视频| 96sao精品视频在线观看| 久久精品国产亚洲一区二区| 国产一区二区三区视频| 亚洲精品日韩激情在线电影| 亚洲а∨天堂久久精品喷水| 亚洲精品视频网上网址在线观看| 久久综合亚洲社区| 欧美精品videos性欧美| 午夜精品蜜臀一区二区三区免费| 亚洲欧美一区二区三区在线| 亚洲黄色www| 久久久久久久久久久免费精品| 亚洲欧美色图片| 亚洲第一天堂av| 国产精品wwwwww| 国产日韩精品视频| 亚洲色图欧美制服丝袜另类第一页| 欧美大成色www永久网站婷| 亚洲天堂成人在线| 另类专区欧美制服同性| 国产精品青草久久久久福利99| 欧美精品在线观看91| 亚洲国产精品久久| 色先锋久久影院av| 日韩久久精品成人| 这里只有精品视频| 日韩视频―中文字幕| 国产69精品久久久久9999| 国模吧一区二区三区| 日韩中文在线视频| 91久久在线视频| 大胆人体色综合| 伊人久久大香线蕉av一区二区| 久久久日本电影| 成人国产精品一区| 欧美一区二区三区精品电影| 国产精品美女久久| 91精品视频一区| 亚洲成人av在线播放| 深夜福利91大全| 日本午夜精品理论片a级appf发布| 久久av在线播放| 日韩成人av在线| 日韩hd视频在线观看| 91chinesevideo永久地址| 777精品视频| 136fldh精品导航福利| 911国产网站尤物在线观看| 久久久久久久影院| 国产精品久久久久久久av大片| 国产精品一久久香蕉国产线看观看| 亚洲综合中文字幕在线观看| 亚洲天堂免费观看| 欧美激情在线观看| 久久久国产成人精品| 久久精品91久久久久久再现| 久久久久久久影视| 久久久久国产精品一区| 久99九色视频在线观看| 最好看的2019的中文字幕视频| 欧美丝袜美女中出在线| 亚洲欧美成人在线| 亚洲最大的网站| 日韩大陆欧美高清视频区| 国产日产亚洲精品| 久久久久国产精品www| 日韩电影在线观看中文字幕| 成人精品视频在线| 91精品国产乱码久久久久久久久| 精品亚洲国产视频| 欧美性资源免费| 亚洲男人天堂2019| 欧美精品在线网站| 成人久久18免费网站图片| 欧美福利视频网站| 日本a级片电影一区二区| 国产精品第8页| 久热国产精品视频| 日韩高清电影好看的电视剧电影| 精品国产拍在线观看| 国产啪精品视频| 2021国产精品视频| 九九热精品视频在线播放| 成人a在线观看| 久久视频免费在线播放| 欧美激情乱人伦一区| 国产精品999999| 一个人看的www久久| 欧美国产日韩视频| 在线成人免费网站| 国产伦精品免费视频| 亚洲香蕉成人av网站在线观看| 日韩av免费在线观看| 欧美在线视频在线播放完整版免费观看| 国产美女高潮久久白浆| 亚洲第一页自拍| 亚洲美女av在线播放| 98午夜经典影视| 欧美激情精品久久久久久蜜臀| 国内揄拍国内精品少妇国语| 欧美激情一区二区三区高清视频| 久久综合伊人77777蜜臀| 国产亚洲美女精品久久久| 久99久在线视频| 欧美精品videossex88| 91精品在线国产| 国产精品午夜一区二区欲梦| 国产一区二区三区在线| 姬川优奈aav一区二区| 久久99精品久久久久久青青91| 成人黄色短视频在线观看| 久久久精品网站| 在线播放国产一区二区三区| 国产精品18久久久久久首页狼| 日韩性xxxx爱| 红桃视频成人在线观看| 国产aⅴ夜夜欢一区二区三区| 2019中文字幕全在线观看| 欧美区二区三区| 欧美亚洲激情在线| 日韩成人免费视频| 久久久久国产精品免费| 69国产精品成人在线播放| 91成人免费观看网站| 国产成人精品在线视频| 成人黄色短视频在线观看| 成人国产精品一区二区| 亚洲性夜色噜噜噜7777| 91精品久久久久久久久久| 亚洲视频第一页| 欧美黑人xxxx| 亚洲男人第一av网站| 亚洲欧洲在线视频| 久久久久一本一区二区青青蜜月| 久久av在线播放| 欧美在线观看视频| 亚洲国产欧美精品| 51精品国产黑色丝袜高跟鞋| 国产在线观看精品一区二区三区| 精品亚洲一区二区三区在线播放| 亚洲男人天天操| 亚洲色图15p| 久久久国产精品亚洲一区| 亚洲精美色品网站| 国产精品爽黄69天堂a| 亚洲国产精彩中文乱码av| 亚洲国产精品视频在线观看| 岛国av一区二区在线在线观看| 欧美日本在线视频中文字字幕| 色婷婷久久av| 亚洲国产精品嫩草影院久久| 日韩av不卡在线|