辽宁快乐12遗漏预测

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2241|回復: 0
打印 上一主題 下一主題

辽宁快乐12打法技巧: STM32F103串口簡單化處理

[復制鏈接]

辽宁快乐12遗漏预测 www.kqsbiw.com.cn 624

主題

627

帖子

416

積分

專欄作家

Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25Rank: 25

積分
416
跳轉到指定樓層
1#
發表于 2015-4-15 17:18:53 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32F103串口簡單化處理
用過串口的人,是不是覺得用串口時,都有種不是很爽的感覺,因為串口接受數據時,時間是不確定的,有可能隨時都會發送過來,這樣就必須要用到中斷來讀取數據,但是讀取過來的數據長度也經常并不是確定的,使用DMA也不是很合適,那就要在每接受一個數據,進行一次處理,這樣中斷函數就變大,并且不能做到統一處理。
想想如果有這么一個串口,接受數據時,它自動接收,不用主線程來做任何干預,直到串口接收完整條貞(5ms間隔算一條貞)時,通知主線程此時接受到一條貞,主線程就可以一次性將整條數據貞讀取出來,一次處理完整條貞,而不是像上面一樣分散處理。(藍牙、以太網...就是這樣做的,它們是因為有很多層協議組成的,但是串口沒有)

想想還是分享出來這個思路吧:
1、在跑裸機時代,我是這樣處理的:串口接收到一個數據,將數據存入到緩存區,就開啟一個定時器,又接到時,定時器重新定時,當這個定時器到了定時時間,也就是進入了中斷程序,說明這個消息貞結束了。然后調用回調通知主線程接受完成一貞,主線程再去讀串口緩存區。
問題:(1)消耗了硬件定時器
          (2)調用回調函數的地方,就要放在中斷函數里面,這樣就會出現萬一回調函數里面出現了很占時間的程序,就會導致中斷時間占用過長(這個學過單片機的人都知道,這是不理想的)
2、現在使用ucos操作系統,可以開辟一個小線程,來單獨處理串口接受事件:
     先講解一個小知識:等待信號量,可以設置為無限等待(只要不設置這個信號量,就會一直等待),也可以設置為超時等待(有個超時時間,如果超過了這個時間,還沒有信號量,會跳過,如果超時時間內有信號量,也會跳過)。

串口初始化函數:
  1. USART_Init();   /* 串口各種初始化,配置接收中斷模式 */
  2. ......
  3. OSSemCreate  /* 創建信號量 */
  4. OSTaskCreate /* 創建小線程 */
復制代碼


線程函數:
  1.          while(1){
  2.                 /* 等待貞的第一個數據 */
  3.                OSSemPend (&sem,0,OS_OPT_PEND_BLOCKING,&ts,&err); /* 等待信號量(無限等待,阻塞方式) */

  4.                 /* 有第一個數據后,就要開始判斷整條貞的結尾,既5ms沒有數據來*/              
  5.                 while(1){
  6.                      OSSemPend (&__modrecive_sem,5,OS_OPT_PEND_BLOCKING,&ts,&err); /* 5ms 的延時等待 */

  7.                      if(OS_ERR_TIMEOUT == err){  /* 超時,既5ms內還沒有信號 */
  8.                          Mb_recive_callback();    /* 調用回調函數,通知主線程數據接收完全 */
  9.                          break;
  10.                      }
  11.                }
  12.          }
復制代碼


串口接收中斷函數:
  1. recive_buffer[recive_buffer_count++] = USART_ReceiveData(); /* 將接收到的數據存入緩存區 */
  2. OSSemPost (&__modrecive_sem, OS_OPT_POST_1, &err);     /* 發送消息,既通知上面的線程的等待消息 */
復制代碼


至此,就如果我們將這個思路封裝成一個庫,也就是只要調用串口初始化函數,并且傳入回調函數,我們就可以相當方便的使用串口了,不需要查詢,不需要判斷,不需要一直處理,只要在回調函數里面,將數據一次性提取出來,統一處理就OK了,這樣是不是很爽呢?呵呵
可能有的人會這樣想,就是ucos里面還有軟件定時器,可以接收到一個數據,馬上開啟定時器,或者重新啟動定時器,這樣當定時時間到,就會調用回調函數通知主線程。這種想法是對的,但是開啟定時器這個功能是要在中斷函數里面開啟,但是,ucos的開啟定時器函數是不能在中斷函數里面調用的。
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|辽宁快乐12遗漏预测 ( 鄂ICP備09003585號-2 )

GMT+8, 2019-11-17 05:46 , Processed in 0.045064 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2018 Comsenz Inc.

快速回復 辽宁快乐12遗漏预测 返回列表