- 7樓 Re: 飛思卡爾: 平板型設計 7寸飛思卡爾智能本實機亮相
- 你要做的只是按nmea_tokenizer_init解析出來,再按下面那一段把它更新所代表的變量即可。看一下就明白了啊。 這個是拿到一個NMEA語句之后進行解析的,解析成一個一個的token. 123 static int 124 nmea_tokenizer_init( NmeaTokenizer* t, const char* p, const char* end ) 125 { 126 int count = 0; 127 char* q; 128 129 // the initial '$' is optional 130 if (p < end && p[0] == '$') 131 p += 1; 132 133 // remove trailing newline 134 if (end > p && end[-1] == '\n') { 135 end -= 1; 136 if (end > p && end[-1] == '\r') 137 end -= 1; 138 } 139 140 // get rid of checksum at the end of the sentecne 141 if (end >= p+3 && end[-3] == '*') { 142 end -= 3; 143 } 144 145 while (p < end) { 146 const char* q = p; 147 148 q = memchr(p, ',', end-p); 149 if (q == NULL) 150 q = end; 151 152 if (count < MAX_NMEA_TOKENS) { 153 t->tokens[count].p = p; 154 t->tokens[count].end = q; 155 count += 1; 156 } 157 158 if (q < end) 159 q += 1; 160 161 p = q; 162 } 163 164 t->count = count; 165 return count; 166 }
- 作者:劉峰 2010-1-13 14:03:00
- 6樓 Re: 飛思卡爾: 平板型設計 7寸飛思卡爾智能本實機亮相
- 用飛思卡爾DZ60做的串口程序,C語言
串口程序調通
串口功能是接收NMEA數據
經過解析后只留下&GPGGA………………*的數據
然后串口發送
現在串口程序調試完成,但是數據解析不會做,希望高手能提供個解析的代碼。
- 作者:吳瑞 2010-1-13 14:03:00
- 5樓 Re: 飛思卡爾: 平板型設計 7寸飛思卡爾智能本實機亮相
- *** SCI0SR1 - SCI 0 Status Register 1; 0x000000CC ***/
typedef union {
byte Byte;
struct {
byte PF :1; /* Parity Error Flag */ 奇偶錯誤標志位
byte FE :1; /* Framing Error Flag */ 幀錯誤標志位
byte NF :1; /* Noise Flag */ 噪聲標志位?
byte OR :1; /* Overrun Flag */ 溢出回頭(環形緩沖區時)標志位
byte IDLE :1; /* Idle Line Flag */ 空閑標志位?
byte RDRF :1; /* Receive Data Register Full Flag */接收寄存器滿標志位
byte TC :1; /* Transmit Complete Flag */傳輸結束位
byte TDRE :1; /* Transmit Data Register Empty Flag */發送寄存器空標志位
} Bits;
} SCI0SR1STR;
一個共同體的定義,可以使用BYTE字節訪問,也可以使用Bits一位一位的訪問。
extern volatile SCI0SR1STR _SCI0SR1 @(REG_BASE + 0x000000CC);
定義一個SCI0SR1STR類型的變量,變量名為_SCI0SR1,并且這個變量對應的地址在(REG_BASE + 0x000000CC),其中REG_BASE是其它地方或系統定義的一個寄存器的基址,0x0CC是相對偏移量。
下面幾行就是定義宏來簡化各種方式下的訪問變量:
#define SCI0SR1 _SCI0SR1.Byte 整個變量字節
#define SCI0SR1_PF _SCI0SR1.Bits.PF 變量里的PF位
#define SCI0SR1_FE _SCI0SR1.Bits.FE 變量里的FE位
#define SCI0SR1_NF _SCI0SR1.Bits.NF 變量里的NF位
#define SCI0SR1_OR _SCI0SR1.Bits.OR 變量里的OR位
#define SCI0SR1_IDLE _SCI0SR1.Bits.IDLE 變量里的IDLE位
#define SCI0SR1_RDRF _SCI0SR1.Bits.RDRF 變量里的RDRF位
#define SCI0SR1_TC _SCI0SR1.Bits.TC 變量里的TC位
#define SCI0SR1_TDRE _SCI0SR1.Bits.TDRE 變量里的TDRE位
有上述定義直接使用SCI0SR1_TC等去訪問變量或變量的某一位了。
下面幾行是定義掩碼,用來用你關心的某位取出
#define SCI0SR1_PF_MASK 1 變量里的PF位
#define SCI0SR1_FE_MASK 2 變量里的FE位
#define SCI0SR1_NF_MASK 4 變量里的NF位
#define SCI0SR1_OR_MASK 8 變量里的OR位
#define SCI0SR1_IDLE_MASK 16 變量里的IDLE位
#define SCI0SR1_RDRF_MASK 32 變量里的RDRF位
#define SCI0SR1_TC_MASK 64 變量里的TC位
#define SCI0SR1_TDRE_MASK 128 變量里的TDRE位
有了這些掩碼,你要從保存的狀態變量t取某一位出來直接(t&SCI0_OR_MASK)就可以判斷是否Overrun了,想把那位置1的話,直接SCI0SR |= SCI0SR_IDLE_MASK; 想把那位清0的話,直接SCI0SR &= (~SCI0SR_IDLE_MASK)。
- 作者:蕓 2010-1-13 13:33:00
- 4樓 Re: 飛思卡爾: 平板型設計 7寸飛思卡爾智能本實機亮相
- /*** SCI0SR1 - SCI 0 Status Register 1; 0x000000CC ***/
typedef union {
byte Byte;
struct {
byte PF :1; /* Parity Error Flag */
byte FE :1; /* Framing Error Flag */
byte NF :1; /* Noise Flag */
byte OR :1; /* Overrun Flag */
byte IDLE :1; /* Idle Line Flag */
byte RDRF :1; /* Receive Data Register Full Flag */
byte TC :1; /* Transmit Complete Flag */
byte TDRE :1; /* Transmit Data Register Empty Flag */
} Bits;
} SCI0SR1STR;
extern volatile SCI0SR1STR _SCI0SR1 @(REG_BASE + 0x000000CC);
#define SCI0SR1 _SCI0SR1.Byte
#define SCI0SR1_PF _SCI0SR1.Bits.PF
#define SCI0SR1_FE _SCI0SR1.Bits.FE
#define SCI0SR1_NF _SCI0SR1.Bits.NF
#define SCI0SR1_OR _SCI0SR1.Bits.OR
#define SCI0SR1_IDLE _SCI0SR1.Bits.IDLE
#define SCI0SR1_RDRF _SCI0SR1.Bits.RDRF
#define SCI0SR1_TC _SCI0SR1.Bits.TC
#define SCI0SR1_TDRE _SCI0SR1.Bits.TDRE
#define SCI0SR1_PF_MASK 1
#define SCI0SR1_FE_MASK 2
#define SCI0SR1_NF_MASK 4
#define SCI0SR1_OR_MASK 8
#define SCI0SR1_IDLE_MASK 16
#define SCI0SR1_RDRF_MASK 32
#define SCI0SR1_TC_MASK 64
#define SCI0SR1_TDRE_MASK 128
中每句話的意思,
特別是extern volatile SCI0SR1STR _SCI0SR1 @(REG_BASE + 0x000000CC);這句有什么用,代表什么意思
- 作者:周 2010-1-13 13:20:00
- 3樓 Re: 飛思卡爾: 平板型設計 7寸飛思卡爾智能本實機亮相
- 首先光電管是真空的,你所說的飛思卡爾比賽用的光電管采用了真空電子技術。
真空電子技術是研究帶電粒子在真空或氣體中運動時與場和物質相互作用的一項科學和技術。真空電子器件利用靜電控制、電子群聚激勵高頻場、氣體放電的高通導能力、電子束掃描、攝像和顯示等原理,在電子儀器和設備中起著整流、振蕩、放大、調制、檢波、頻率控制和光電變換等作用。高速電子束和離子束的有效波長比可見光波長短得多,因而電子束和離子束具有較高的分辨率,可用于觀察微細結構和作為探索來獲得表面信息 。 在高真空條件下,應用電子束和離子束能進行無污染的加工和焊接。適應真空電子工作環境的材料和工藝,是真空電子學的技術基礎。帶電粒子與電磁場的互作用,電子、離子與表面互作用,電子發射、氣體放電和電子光學等方面的理論,形成真空電子學的理論基礎。真空電子技術領域包括光電管、微波電子管、電子束、電真空器件等。
關于光電二極管
1. 概述
光電二極管和普通二極管一樣,也是由一個PN結組成的半導體器件,也具有單方向導電特性。但是,在電路中不是用它作整流元件,而是通過它把光信號轉換成電信號。那么,它是怎樣把光信號轉換成電信號的呢?大家知道,普通二極管在反向電壓作用在處于截止狀態,只能流過微弱的反向電流,光電二極管在設計和制作時盡量使PN結的面積相對較大,以便接收入射光。光電二極管是在反向電壓作用在工作的,沒有光照時,反向電流極其微弱,叫暗電流;有光照時,反向電流迅速增大到幾十微安,稱為光電流。光的強度約大,反向電流也約大。光的變化引起光電二極管電流變化,這就可以把光信號轉換成電信號,成為光電傳感器件。 2.類型 光電二極管有4種類型:即PN結型(也稱PD)、PIN結型、雪崩型和肖特基結型。用得最多的是用硅材料制成的PN結型,它的價格也最便宜。其他幾種響應速度高,主要用于光纖通信及計算機信息傳輸。這里僅介紹硅P-N結光電二極管。 3.檢測方法
① 電阻測量法
用萬用表1k擋。光電二極管正向電阻約10kΩ左右。在無光照情況下,反向電阻為∞時,這管子是好的(反向電阻不是∞時說明漏電流大);有光照時,反向電阻隨光照強度增加而減小,阻值可達到幾kΩ或1kΩ以下,則管子是好的;若反向電阻都是∞或為零,則管子是壞的。
②電壓測量法
用萬用表1V檔。用紅表筆接光電二極管“+”極,黑表筆接“―”極,在光照下,其電壓與光照強度成比例,一般可達0.2―0.4V。
③短路電流測量法
用萬用表50μA檔。用紅表筆接光電二極管“+”極,黑表筆接“―”極,在白熾燈下(不能用日光燈),隨著光照增強,其電流增加是好的,短路電流可達數十至數百μA。
在實際工作中,有時需要區別是紅外發光二極管,還是紅外光電二極管(或者是光電三極管)。其方法是:若管子都是透明樹脂封裝,則可以從管芯安裝外來區別。紅外發光二極管管芯下有一個淺盤,而光電二極管和光電三極管則沒有;若管子尺寸過小或黑色樹脂封裝的,則可用萬用表(置1k擋) 來測量電阻。用手捏住管子(不讓管子受光照),正向電阻為20-40kΩ,而反向電阻大于200kΩ的是紅外發光二極管;正反向電阻都接近∞的是光電三極管;正向電阻在10k左右,反向電阻接近∞的是光電二極管。
- 作者:許丹丹 2010-1-13 13:20:00
首頁 | 前頁 | 后頁 | 尾頁 | 分頁 1/1 [1] |
-
·尊重網上道德,遵守中華人民共和國的各項有關法律法規
·承擔一切因您的行為而直接或間接導致的民事或刑事法律責任
·本站管理人員有權保留或刪除其管轄留言中的任意內容
·本站有權在網站內轉載或引用您的評論
·參與本評論即表明您已經閱讀并接受上述條款