国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

串口速率,我拿什么識別你?

發布時間:2014-9-22 14:39    發布者:看門狗
關鍵詞: UART , 串口 , 通信協議
作者:jobs

    UART串口,作為單片機最常用的通訊接口已經深入每一個嵌入式工程師的腦海。UART串口有著簡單、實用的特性,嵌入式工程師常常用來將其作為調試系統的重要工具。UART串口的配置參數有很多,但是最常用,且需要修改的參數只有通訊波特速率這一個。可是這僅有的一個參數又常常給我們帶來許多困擾。那么,我們對于串口波特速率該如何識別呢?筆者在這里介紹三種識別串口速率的方法,供大家參考。

  UART(Universal Asynchronous serial Receiver and Transmitter)異步串行接收/發送接口,是嵌入式系統里最為重要的接口之一,它不僅用于板級芯片之間的通訊,而且應用于實現系統之間的通信和系統調度中。UART作為異步串口通信協議的一種,工作原理是將傳輸數據的每個字符一位接一位地傳輸,其字符數據幀格式如下圖所示:


  圖1 UART字符數據幀格式

  從上面圖中的幀格式可以看出,UART數據幀由1個開始同步位,1個數據字,1個結束停止位,以及可選的校驗位組成。由于UART為異步通訊,因此,其按位發送時必須嚴格遵守設定的波特率,而接收方也必須在相同的波特率下才能正確解析發送的字符數據。于是,接收方正確識別、配置波特率就相當關鍵了。下面筆者根據實際經驗介紹三種識別串口波特率的方法:

  窮舉法

  理論上,發送波特率可以設定為任意的值,但是平時我們使用的串口速率只有這么幾種數值,如圖2所示:


圖2 常用串口波特速率

  既然知道了常用串口速率,于是我們就可以一個一個試,總會有一個是成功。當然前提是我們知道主機發送的內容是什么,否則如何才能知道串口速率正確匹配呢!這里必須注意,在設定波特率與實際波特率成倍數的情況下,是可以讀出來數據——當然,數據是錯誤的。

  示波器

  示波器被秒為電子工程師的“眼睛”,我們可以就用這雙眼睛來“看”出串口發送數據的波特率。這里我們先排除掉高端的帶有數字邏輯分析功能的示波器,因為,這樣的示波器已經遠超筆者的IQ了,不是我們本篇討論的內容。

  上一部分,我們講述了波形的幀格式,這里我們就利用波形,發送一個特殊的字符0x55(1010 1010B)。從理論上面分析,這個波形應該會產生一個按位翻轉的波形效果。圖3是筆者使用示波器采集下來的截圖:


  圖3 9600bps發送0x55波形圖

  看到圖3所示的波形圖,再加上理論分析,我們知道波形是按位翻轉,于是我們使用示波器的指針功能(cursor)來直接查看波特率。如圖3左上角的測量結果顯示,每位翻轉的頻率為9.615KHz,與我們設定的頻率9600kbps基本相符,可以確定此發送頻率為9600bps。

芯片自識別法

  UART串口常常用來做為固件升級使用的接口,因此,其波特率要根據上位機的實際情況而定。如果環境較差時,就需要使用低波特率的通訊。這時,自動波特率識別的方法就誕生了。下面我們以TI Stellaris里bootloader里的串口波特率自動識別源程序為例進行分析:

  int UARTAutoBaud(unsigned long *pulRatio){

  long lPulse, lValidPulses, lTemp, lTotal;

  volatile long lDelay;

  // 配置systick,將其值設定為最大值;

  HWREG(NVIC_ST_RELOAD) = 0xffffffff;

  HWREG(NVIC_ST_CTRL) = NVIC_ST_CTRL_CLK_SRC | NVIC_ST_CTRL_ENABLE;

  // 打開引腳的邊沿觸發中斷

  HWREG(GPIO_PORTA_BASE + GPIO_O_IBE) = UART_RX;

  // 使能UART RXD引腳邊沿觸發中斷

  HWREG(NVIC_EN0) = 1;

  // 采集引腳邊沿中斷,兩個字節的邊沿

  while(g_ulTickIndex < MIN_EDGE_COUNT)

  {

  }

  // 計算systick采樣下來的值,對溢出進行處理

  for(lPulse = 0; lPulse < (MIN_EDGE_COUNT - 1); lPulse++){

  lTemp = (((long)g_pulDataBuffer[lPulse] -

  (long)g_pulDataBuffer[lPulse + 1]) & 0x00ffffff);

  g_pulDataBuffer[lPulse] = lTemp;

  }

  // 此循環計算兩個連續脈沖之間的寬度

  for(lPulse = 0; lPulse < (MIN_EDGE_COUNT - 1); lPulse++){

  // 精確計算兩個連續脈沖之間的寬度

  lTemp = (long)g_pulDataBuffer[lPulse];

  lTemp -= (long)g_pulDataBuffer[lPulse + 1];

  if(lTemp < 0) {

  lTemp *= -1;

  }

  // 驗證兩個邊沿的脈寬是否正確,其算法如下:

  // abs(Pulse[n] - Pulse[n + 1]) < Pulse[n + 1] / PULSE_DETECTION_MULT

  // 或者

  // PULSE_DETECTION_MULT * abs(Pulse[n] - Pulse[n + 1]) < Pulse[n + 1]

  if((lTemp * PULSE_DETECTION_MULT) < (long)g_pulDataBuffer[lPulse + 1]) {

  lTotal += (long)g_pulDataBuffer[lPulse];

  lValidPulses++;

  }

  else{

  lValidPulses = 0;

  lTotal = 0;

  }

  // 7個有效脈沖,就可以計算UART串口速率

  if(lValidPulses == 7) {

  // 將最后一個脈沖加入計數器,并計算波特率

  lTotal += (long)g_pulDataBuffer[lPulse];

  *pulRatio = lTotal >> 1;

  // 返回成功標識

  return(0);

  }

  }

  // 檢測失敗

  return(-1);

  }

  UART串口有著這樣或者那樣的優點,但新興的USB接口的USB DFU功能可以更加有效替代串口來完成固件升級;性能優越的CAN總線,其硬件價格不斷下降,而且CAN總線的MAC接口更多集成在最新MCU芯片上;CAN2.0B接口正在擠壓著UART接口器件的市場;對于我們普通民眾,現在新型號電腦已經沒有DB9串口座。在殘酷的現實下,多年后也許只有我們電子工程師才會記得曾經的簡單、實用的UART串口。
本文地址:http://m.qingdxww.cn/thread-133000-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區

相關在線工具

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 四虎最新紧急更新地址| 97公开超碰在线视频| 在线91精品亚洲网站精品成人| 在线青青视频| 99热只有精品| 国产超碰AV人人做人人爽| 很很射影院| 久久水蜜桃亚洲AV无码精品偷窥| 欧美亚洲视频在线二区| 亚洲 欧美 制服 校园 动漫| 精品无码无人网站免费视频| 欧美国产精品主播一区| 小骚妇BBBXXX| 中国农村真实bbwbbwbbw| 一级成人毛片| 婷婷色伊人| 欧美无毛| 欧美日韩国产不卡在线观看| 啪啪导航| 欧美性生活一级| 日韩欧美黄色| 午夜影视免费观看| 视频在线欧美| 午夜性福| 羞羞色院91网站| 艳妇乳肉豪妇荡乳a∨| 最新福利片v国产片| 国产成人 免费观看| 麻生希第一部快播| 性按摩AAAAAAA片| 欧美三级aaa| 亚洲黄色中文字幕| 欧美综合在线视频| 天天天天天天天操| 视频二区 素人 欧美 日韩| 亚洲免费网站| 中国人视频网在线观看| 国产精品.XX视频.XXTV| 免费一区在线观看| 杨幂视频1分11未删减在线观看| 日韩小视频在线|