在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 軟硬結(jié)合——酷我音樂(lè)盒的逆天玩法

            軟硬結(jié)合——酷我音樂(lè)盒的逆天玩法

            作者: 時(shí)間:2017-01-18 來(lái)源:網(wǎng)絡(luò) 收藏

              1、靈感來(lái)源:

            本文引用地址:http://www.biyoush.com/article/201701/343047.htm

              LZ是純宅男,一天從早上8:00起一直要呆在電腦旁到晚上12:00左右吧~平時(shí)也沒(méi)人來(lái)閑聊幾句,刷空間暑假也沒(méi)啥動(dòng)態(tài),聽(tīng)音樂(lè)吧...~有些確實(shí)不好聽(tīng),于是就不得不打斷手頭的工作去點(diǎn)擊下一曲或是找個(gè)好聽(tīng)的歌來(lái)聽(tīng)...但是,[移動(dòng)手鎖定鼠標(biāo)-->移動(dòng)鼠標(biāo)關(guān)閉當(dāng)前頁(yè)面選擇音樂(lè)軟件頁(yè)面-->選擇合適的音樂(lè)-->恢復(fù)原來(lái)的界面] 這一過(guò)程也會(huì)煩人不少,如果說(shuō)軟件的設(shè)計(jì)要在用戶體驗(yàn)上做足功夫,感覺(jué)這一點(diǎn)是軟件設(shè)計(jì)人員很難管住的方面,畢竟操作系統(tǒng)也就這樣安排的嘛(當(dāng)然,有些機(jī)智的開(kāi)發(fā)人員加了幾個(gè)熱鍵,確實(shí)方便了不少!)。于是我想能不能設(shè)計(jì)一個(gè)軟件能盡量少打斷我們正常的工作簡(jiǎn)單操作去觸發(fā)下一曲~

              2、需求分析:

              下圖左一是傳統(tǒng)的操作模式,在這里要人的眼、手并用而且還必須等待記憶,可能我們平時(shí)感覺(jué)不到,但是這個(gè)過(guò)程卻是比較浪費(fèi)時(shí)間且分散注意力!

              下圖右一是想改為的操作模式,在這里我們只需要外部觸發(fā)(如:搖一下頭或者微笑一下,甚至只要想一下就可以啦),讓切歌任務(wù)在后臺(tái)進(jìn)行,這樣就能不打斷前臺(tái)工作(這里的前臺(tái)和后臺(tái)只是當(dāng)前工作窗口和非當(dāng)前窗口,和專(zhuān)業(yè)的有差別!)

                

             

              3、解決方案

              根據(jù)上面分析我們需要這些條件:

              外部硬件設(shè)備,可以接收特殊信號(hào)并傳給PC

              PC上的軟件能夠讀取硬件傳來(lái)的信號(hào)并分析信息,做出切歌任務(wù)

              結(jié)合我現(xiàn)有設(shè)備,做出如下方案:

              硬件采用STC89C52單片機(jī)最小系統(tǒng)占用P1.0和P1.1兩個(gè)端口和超聲波測(cè)距模塊HC-SR04,通過(guò)根據(jù)遮擋物在超聲波測(cè)距范圍內(nèi)停留的時(shí)間來(lái)發(fā)出觸發(fā)“下一曲”,“暫?!?,“上一曲”事件的信號(hào)。

                

             

              軟件采用讀取單片機(jī)發(fā)送的觸發(fā)事件信號(hào)消息,然后調(diào)用WinAPI對(duì)音樂(lè)盒窗口進(jìn)行識(shí)別計(jì)算以及發(fā)送點(diǎn)擊消息,來(lái)控制切換歌曲。

                

             

              PS:這里根據(jù)手在超聲波范圍內(nèi)停留的時(shí)間來(lái)分出3種信號(hào):

              短暫停留在區(qū)域內(nèi)-->下一曲信號(hào)

              稍長(zhǎng)停留在區(qū)域內(nèi)-->上一曲信號(hào)

              超長(zhǎng)停留在區(qū)域內(nèi)-->暫停信號(hào)

              4、作品提前展示及相關(guān)介紹:

              哈哈,秒懂啦吧!圖中那個(gè)像望遠(yuǎn)鏡的東西就是超聲波測(cè)距模塊,它的前面輻射狀的空間(我設(shè)置為40cm)就是有效范圍,那個(gè)黑色的像蜈蚣的東西就是單片機(jī)(就相當(dāng)于電腦里的CPU),插在USB里面的不用介紹就是USB轉(zhuǎn)TTL啦!主要就是負(fù)責(zé)采集傳感器信號(hào)然后將距離信息通過(guò)USB發(fā)送給電腦。最終達(dá)到達(dá)到的效果是:你的手只要在區(qū)域內(nèi)揮一下,就能切歌啦!手停長(zhǎng)一點(diǎn)時(shí)間就能暫停啦!這個(gè)玩法沒(méi)試過(guò)吧,哈哈!

                

             

              下面這個(gè)圖就是基于的電腦端軟件,其主要功能就是連接進(jìn)行數(shù)據(jù)接收、數(shù)據(jù)處理、以及查找音樂(lè)盒的窗口、計(jì)算該點(diǎn)擊的按鈕位置、發(fā)出點(diǎn)擊消息、在不同窗口中切換(因?yàn)橐獙?shí)現(xiàn)少打擾當(dāng)前活動(dòng)的目的)。這里為了測(cè)試方便所以加了3個(gè)功能按鈕:上一曲、暫停、下一曲,通過(guò)點(diǎn)擊這些按鈕能實(shí)現(xiàn)控制酷我音樂(lè)盒歌曲的切換,然后右邊加了個(gè)下拉框用來(lái)枚舉當(dāng)前可用,LINK按鈕就是連接該串口的觸發(fā)按鈕。下面一個(gè)文本顯示區(qū)是用來(lái)顯示串口傳過(guò)來(lái)的距離的數(shù)據(jù)的(便于調(diào)試哈~)

                

             

              5、軟件部分技術(shù)詳解

              該部分要用到很多Windows API,主要功能就是查找窗口句柄、控制窗口顯示、計(jì)算窗口位置、聚焦窗口、窗口切換....算是把窗口有關(guān)的常用API都用上啦~此外,還用到了鼠標(biāo)光標(biāo)位置設(shè)定、鼠標(biāo)點(diǎn)擊消息發(fā)送最終達(dá)到模擬鼠標(biāo)點(diǎn)擊事件。當(dāng)然,串口通信絕對(duì)不能少滴!

              5.1、C#串口通信

              5.1.1、獲取當(dāng)前可用串口列表

              1 //Get all port list for selection

              2 //獲得所有的端口列表,并顯示在列表內(nèi)

              3 PortList.Items.Clear();

              4 string[] Ports = SerialPort.GetPortNames();

              5

              6 for (int i = 0; i < Ports.Length; i++)

              7 {

              8 string s = Ports[i].ToUpper();

              9 Regex reg = new Regex("[^COM\d]", RegexOptions.IgnoreCase " RegexOptions.Multiline);//正則表達(dá)式

              10 s = reg.Replace(s, "");

              11

              12 PortList.Items.Add(s);

              13 }

              14 if (Ports.Length >1) PortList.SelectedIndex = 1;

              調(diào)用串口要引用 using System.IO.Ports;

              第9行的正則表達(dá)式要引用 using System.Text.RegularExpressions;

              第3行的PortList是那個(gè)下拉框;

              整體的功能就是通過(guò)第4行的函數(shù)獲取所有可用串口,然后加入下拉框顯示,如果有可用的就把第一個(gè)選中;

              5.1.2、串口連接按鈕事件

              1 private void btn_link_Click(object sender, EventArgs e)

              2 {

              3 if (!Connection.IsOpen)

              4 {

              5 //Start

              6 Status = "正在連接...";

              7 Connection = new SerialPort();

              8 btn_link.Enabled = false;

              9 Connection.PortName = PortList.SelectedItem.ToString();

              10 Connection.Open();

              11 Connection.ReadTimeout = 10000;

              12 Connection.DataReceived += new SerialDataReceivedEventHandler(PortDataReceived);

              13 Status = "連接成功";

              14 }

              15 }

              PS:整體很好理解就是把下拉框選中的串口號(hào)連接上,這里第12行比較重要,它調(diào)用SerialDataReceivedEventHandler(Func Name)來(lái)定義一個(gè)數(shù)據(jù)接收函數(shù)的句柄,這里PortDataReceived你可以隨便寫(xiě),但是接下來(lái)你要寫(xiě)對(duì)應(yīng)的實(shí)現(xiàn)函數(shù):(這里說(shuō)句柄比較難理解,你就理解成一個(gè)函數(shù),綁定串口的函數(shù),一旦串口有數(shù)據(jù)發(fā)動(dòng)過(guò)來(lái)就執(zhí)行這個(gè)函數(shù)....)

              1 //接收串口數(shù)據(jù)

              2 private int num=0; //障礙物進(jìn)入范圍的時(shí)間

              3 private bool enter=false; //是否有障礙物進(jìn)入

              4 private int signal=0; //對(duì)每次進(jìn)入范圍的時(shí)間分段形成控制信號(hào)

              5 private void PortDataReceived(object o, SerialDataReceivedEventArgs e)

              6 {

              7 int length = 1;

              8 byte[] data = new byte[length];

              9 Connection.Read(data, 0, length);

              10 for (int i = 0; i < length; i++)

              11 {

              12 ReceivedData = string.Format("{0}",data[i]);

              13 }

              14

              15 //數(shù)據(jù)濾波轉(zhuǎn)換為控制信號(hào)

              16 if (data[0] != 136 && !enter){ //當(dāng)有障礙物進(jìn)入時(shí),傳過(guò)來(lái)數(shù)據(jù)不是136并且是第一個(gè)

              17 enter = true;

              18 num = 1;

              19 }else if (data[0] == 136 && enter){ //當(dāng)障礙物離開(kāi)時(shí),傳過(guò)來(lái)數(shù)據(jù)變?yōu)?36且是第一個(gè)

              20 enter = false;

              21 if (num > 1 && num < 6){

              22 signal = 1;

              23 }else if (num > 5 && num < 10){

              24 signal = 2;

              25 }else if (num > 9){

              26 signal = 3;

              27 }

              28 num = 0;

              29 }else if (data[0] != 136 && data[0] >= 0 && enter){

              30 num++;

              31 }

              32 }

              PS:這就是串口數(shù)據(jù)接收函數(shù)實(shí)現(xiàn),先別看其他內(nèi)容,因?yàn)槔锩嫔婕盀V波算法和控制信號(hào)生成的算法,只要看第7~13行的代碼核心部分就是第9行從緩沖區(qū)讀取串口數(shù)據(jù)放到data[]數(shù)組中,這樣串口數(shù)據(jù)就放在data[]中啦!怎么處理是下面的事啦~

              5.1.3、重量級(jí)功能函數(shù):

              1 ///

              2 /// 模擬鼠標(biāo)點(diǎn)擊函數(shù)

              3 ///

              4 /// 0是上一曲,1是暫停,2是下一曲

              5 public void func(int n_control_type)

              6 {

              7 //bool isVisabled; //窗口原來(lái)狀態(tài),隱藏還是顯示

              8 IntPtr hCurWin = GetForegroundWindow(); //獲取當(dāng)前激活窗口

              9

              10 IntPtr hMusic = FindWindow("kwmusicmaindlg", null); //找到窗口句柄

              11 if (hMusic == null)

              12 {

              13 return;

              14 }

              15 Point pt; //獲取鼠標(biāo)當(dāng)前位置

              16 GetCursorPos(out pt);

              17 ShowWindow(hMusic,SW_SHOWNORMAL); //如果是隱藏的就讓他正常顯示出來(lái)

              18 SetForegroundWindow(hMusic); //將音樂(lè)盒窗口放在最上層

              19

              20 RECT rect = new RECT(); //獲取窗口矩形

              21 GetWindowRect(hMusic, ref rect);

              22 int width = rect.Right - rect.Left;


            上一頁(yè) 1 2 3 下一頁(yè)

            關(guān)鍵詞: C# 串口

            評(píng)論


            相關(guān)推薦

            技術(shù)專(zhuān)區(qū)

            關(guān)閉