普通IO口模拟串口通信- 串口通信协议
-
6 ~( Y; A$ e- x; `. d
 - //IO模拟串口初始化 1 void IRrec_Init(){
* M w8 q3 \ h8 x- E8 U3 P$ b: E - 2
; L& ~; M6 Z: T2 [; | - 3
- b& w% @) f9 y - 4 EXTI_InitTypeDef EXTI_InitStructure;
7 V2 |4 W0 w5 [+ K3 |/ Q+ [ - 5 NVIC_InitTypeDef NVIC_InitStructure;) K% b2 g( y/ I1 l
- 6 GPIO_InitTypeDef GPIO_InitStructure;* D& m5 n% y" m
- 7 - _9 F+ `4 K9 [! q' {
- 8 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能GPIOC时钟
* A+ {. x5 t4 @; R( ~% \0 Q - 9
5 A5 M2 |. w3 {6 W) t. t6 z6 S3 j - 10
; _, r5 q& C8 a3 d- d - 11 //IR TX C9 使能' j8 N' N: w8 [) w/ L
- 12 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
6 w: Q, f; @! ~/ v - 13 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 3 a: |- z9 W! P& s: C* M3 b
- 14 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; % ?) K+ t+ e! n* Y
- 15 GPIO_Init(GPIOC, &GPIO_InitStructure);
) g R/ {9 \+ _; ?, m2 \ - 16 GPIO_SetBits(GPIOC, GPIO_Pin_9);// 引脚拉高3 b% F9 B- H0 O% n1 Y& s
- 17 * r6 b6 d6 Z9 L O9 U9 a8 J
- 18
' [ S' Q7 w' N/ M7 u. ^ l - 19 //IR RX C8+ u1 m' F. @' N3 T- Y7 t0 s" r7 q
- 20 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
1 R2 |0 {$ F4 F/ z+ K2 d3 p2 g - 21 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;( ^* h5 T) D6 V3 g! o
- 22 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;7 V$ W5 G3 U9 o
- 23 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 i$ O" C& d6 y
- 24 GPIO_Init(GPIOC, &GPIO_InitStructure);$ c# e+ R; q& T5 d4 `+ e
- 25 GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);
+ f. \; [/ q9 r% m4 D! E - 26
4 I: F. V- z2 x7 \5 m1 T- b, ? - 27 EXTI_InitStructure.EXTI_Line=EXTI_Line8;: {0 y: D0 X; g! N( Z, q$ d) b
- 28 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
0 T# U. M5 W! m- t$ ?; s2 s- m0 N' W - 29 EXTI_InitStructure.EXTI_Trigger=
. f8 ]6 q2 |3 I7 n' ~ - 30 EXTI_Trigger_Rising_Falling;
1 J. ~# s; Z7 \# r# x0 A - 31 EXTI_InitStructure.EXTI_LineCmd=ENABLE;' I8 _: k5 l/ x, n
- 32 EXTI_Init(&EXTI_InitStructure);
! ~% t" M3 p' c) e/ w. _: U2 q - 33
5 h }5 |. o- c& z - 34 NVIC_InitStructure.NVIC_IRQChannel=EXTI9_5_IRQn;2 w ^/ @& N, U" p3 O) r
- 35 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
' c5 _& E n% s6 M8 R& r - 36 NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
2 t5 }( m( i) h; D* l - 37 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;/ O& u0 }. N8 `2 ?" Y
- 38 NVIC_Init(&NVIC_InitStructure);
- p3 p7 n$ N' y8 A1 f0 w; Y - 39
; ~5 W) e, w, {" X# C0 I, n Z - 40 }
复制代码- void IR_SendByte(u8 val)//发送bit位
5 d, G L I: |1 f7 U/ e - {( [1 ~6 e/ X8 y
- u16 i;4 g# i+ I. r* T2 K q) r' m* d/ _
( E- Z9 v0 K: u+ C+ ?% g- IRSEND=0;//拉低 开始传输
7 B' T$ s! [& ?( H3 @" P - SysTick_Delay_Us(53);//波特率根据延时在设置 19200波特率
4 q3 H4 ~# O, {$ ]7 m% G$ H
: f) Y0 W& Z% m4 k; Z D- for(i=0;i<8;i++)
# c) u5 Q; W8 G4 ?6 ]8 p' J' N - {& o+ f' `4 U7 }% H
- if(val&0x1)! g$ r4 G( B+ d, T2 }4 a
- {. O3 [* w5 W% i8 b1 h: t/ [$ }: |8 V, p
- IRSEND=1;; a; o; s5 q6 W& ~/ T: c
- }
" ^& v- c: u# [( z- }. \ G - else0 N$ _( E' j* K
- {2 ^2 T' r7 u/ |" O r8 o2 l
- IRSEND=0;
9 M! A, Q4 t# y - }$ N3 s5 K) }% c1 V5 F
; O$ \0 }0 Y8 v" c0 L% X$ N* T- val>>=1;9 F0 S9 V/ K4 Z, {
- SysTick_Delay_Us(53);
1 S) N. \1 f S2 q7 c - }- `* u' d7 P( W& I( v, d7 s: d& J
4 Z3 P/ s4 l3 L6 a* ^- IRSEND=1;
! W- c8 ^! T3 F B2 I - SysTick_Delay_Us(53);( v9 y& ~ P! z2 q
- }0 Y9 w' p6 {. F5 z* u# x( M
. b! u( i `6 A+ P6 E" K, Y
R2 T n5 z0 m" H! V- void IR_SendStr(u8*st,u16 len){//在这填入16位数据即可* g" C1 {* Y1 V
- int i=0;8 d, m! b9 E. L3 K
- while ((len--)!=0)
1 w" h* P8 i; P1 v" h - {
: b3 I. g$ C( V* ~' P" [8 R1 U - IR_SendByte(st[i]);0 i# `4 e1 `- V `# j
- i++;
6 C% l1 y- y4 Y" _( E# z' M" ` - }* T' s9 j1 Q( n8 U
- 1 t$ D# J& {) b. [9 F
- }
复制代码- u8 IRREC_RX_BUF[64]={0}; //接收缓冲,最大64个字节.
0 b7 i7 _! w+ a1 l* O m* Q - //接收到的数据长度( b3 k0 V$ N* d0 M! h7 v3 [6 j
- u8 IRREC_RX_CNT=0;9 k2 b, d" a' Q8 x9 f$ L! a0 f
" V; f2 `& c& B% ^+ Y; B2 k( q- char rebit=stopbit;//记录接收一个字节的二进制位所处何种位置3 g5 ~$ p1 i6 {2 {8 A+ c0 R
- u8 Recev[8]={0};//记录接收的一个字节的二进制流
) B1 q( k7 c& s; D9 g6 G+ B
+ M& m! v. A( |! q- static volatile unsigned long long m_rx_previous_time = 0;//上一次进入中断时间& [3 J) o5 j ]1 k! l* ^
- static volatile unsigned char m_rx_begin_f = 0;//开始一个字节的接收标志 0-无数据开始接收 1-有数据开始接收/ x$ B5 y% T I% i9 B/ U A# v
- void EXTI9_5_IRQHandler(void){
" P- K2 [; D8 ~3 V+ }
5 J" u& ~" \7 k2 y' A. T# J- if(EXTI_GetITStatus(EXTI_Line8)!=RESET): }8 K( R' Z/ L! H% ?/ z4 Z( X
- {
2 B0 K! Y# M9 c9 ]' E8 h6 k! i( Z: Q - unsigned char skip_index = 0;2 ~5 r* M# T$ j& O5 c/ }9 M) H7 j
- unsigned char i = 0;; r9 C/ v% g/ _" N6 ~/ s" l: C: a
- unsigned char temp_bin = 0;//用于记录二进制值- U& \8 `9 ]9 j) _4 Z+ E5 [
- unsigned long long current_time = sys_micros();//记下此刻时间
- V$ ^2 [" k4 j' h+ Q5 w+ j - unsigned short interval_time = current_time - m_rx_previous_time;//计算一个状态持续的时长
- P7 n2 V. S6 z" v3 t3 J - m_rx_previous_time = current_time;//为下次计算时长做准备
1 r. q8 z1 K" q5 k* I+ C) z
9 l- S( D5 _ }# k/ A |- //当前未开始一个字节的接收且此时为下降沿
* ]$ y9 h' K/ k6 V% e+ h0 D a - if(rebit == 10)//10 当数据不合法时或者结束传输时 rebit值设为10
6 p; ?/ {3 @- u# P8 y5 ~ - {! `; g. Z2 S( i5 s5 i: W
- if(!PCin(8))//下降沿
; d: s1 l5 j: X - {
3 Z2 y7 n" k' W - rebit = 0;//记下开始接收7 o0 W$ R9 B+ Y$ h8 d. \
- m_rx_begin_f = 1;
5 y7 [4 G0 z% m' t# ~ - debug_led(1,LED_TOGGLE);
2 c0 Z0 |" z' n - }
k1 h8 }# Q# Q - }3 M( N; e. J" j3 i: O' C1 i
- //已经开始接收
0 Q6 y, q( Z! }' J9 R( U - else
5 d0 h3 `. a! O9 L& Y0 Z - {
+ ~ J$ x. A. A( H# T. Q7 e - //上一状态为起始位- O# o$ i2 X+ ?
- if(!rebit)//起始位0
" k0 `' y, I! w9 b- n - {+ ]6 j1 V. E- J' H! e e
- //计算二进制数据的个数
' W1 q# i, q. ^8 g5 ?" K. i! ]6 P0 {7 e - skip_index = (interval_time/50)-1;2 h% {+ X( [* o4 M6 Z
- # x# g2 P4 `- a. v( ^$ S3 {0 J
- //个数合法
* v: J8 x4 ]" V - if(skip_index <= 9)
. ~ D0 s; O( _9 y& o0 _ - {
( k( Y" @8 L# _# _7 l/ b - //根据状态保持时间更新接收值" W4 L- r% D) p' y1 |
- for(i = 0;i < skip_index;i++)
* Z% w$ P/ c8 j6 h. ` - {7 |6 z4 M' H; L$ O# f7 j: D
- Recev[i] = 0;. o: o: z z2 F9 p- ~2 g
- & b+ e6 [( F4 w! B) M9 }4 W& @
- }% |3 U+ H% `" A3 Y U
* q$ G$ c' M* L- //更新接收二进制位的下标 h' s) X8 @/ v: o& C
- rebit = skip_index;
/ f6 N3 J6 [- Y6 [8 t( O - ! N/ p j' ~% A: B
- }
% P( P' d' H, b, `/ x - //不合法-重新接收) y0 Y; v9 v* m6 W( t# |
- else# L1 ]0 r7 F( G7 b7 _4 r% w* { J
- {
: C5 Q! ?+ U# `2 B - rebit = 10;. B; j* m! M/ X8 v* ~4 R
- m_rx_begin_f = 0;8 M$ ~) J$ V' x6 e% [
; r" Z- w3 y' o0 V& U- & ?* z U) r8 B$ d4 D2 h
- }- |( q( A6 ]3 Z! Y) |
- }. P$ B/ ]: u* [1 C: s# R
- //上一状态为数据位4 ]( ~( P: e/ s/ S$ ^$ V( y+ _
- else
/ C0 W5 D5 J1 j$ G- T+ ~ - {; g# a$ b! k) W6 n: {8 g4 H0 x+ d
- //计算二进制数据的个数
/ v/ `. [( ]' _& ?6 i - skip_index = interval_time/50;% U D2 w; v, H
1 `) }+ o8 Z* K/ f2 q- //数据不合法-重新接收
' c+ L) p* i9 T: r* } - if((skip_index+rebit) > 9)//所处位置+数据个数 判断数据是否超10 合法判断7 B, s$ e3 a9 \) B
- {
7 n) S) ]9 F( N% J& n6 T - //printf("skip_index %d rebit=%d \r\n",skip_index,rebit);
- y! X- U* O3 z. _9 P& t [+ A - rebit = 10;" j0 O+ n8 `$ a) N2 n
- m_rx_begin_f = 0;
4 `; p+ q: t/ n) Y5 N9 L: m$ | - debug_led(3,LED_TOGGLE);) j! K6 ]! i8 Q9 v8 J2 K" O
- }
- i: u& b: M: A* m9 Z - //数据合法. ]9 P% |0 R6 Y# b6 p
- else2 n% z# D X8 T' R" B* _
- {" N& f+ B H* U8 N# Y& {
- //当前为高电平, y; _2 l Q+ a) C( @) I4 |0 T
- if(PCin(8))
, D) p& v0 p! T& p- e - {
- s4 v& ~3 c6 u - temp_bin = 1;//0
# O/ A) q$ z! ~$ Y& ] - }
+ X# Q$ k& c9 x6 Q4 V' b6 n; H - else( D* y. u3 K2 }: B" B5 O8 A6 e
- {, x( z8 \, ]2 N/ m
- temp_bin = 0;//1 change4 l" [0 q! f, I# [
- }/ Q. ]2 w c1 P9 f
- debug_led(2,LED_TOGGLE);
5 }& _+ u0 Z7 s% Z: I - for(i = 0;i < skip_index ;i++)//根据几个数据 给予相应的位
1 {8 t2 u, G. Q! v, X8 G0 G1 j" k - {( H1 W& T7 f/ V& J \ B: Y0 E% v
- Recev[rebit+i+1] = temp_bin;//change +1( u [9 j* B2 ^3 h
- rebit++;! y. b2 f" }3 r4 Y5 h. F. y
) J W1 T" v4 z8 T# \. }' P- }
; \% G; K" x8 B5 U' x - }4 e R8 r ^4 z( M2 E! ^! R: g
9 n# g2 \+ Z( G% P- //数据已接收至结束位+ N( `3 J. P* e" x. b, r
- if(rebit >= 8 )//=8>?* P) D( \2 X y1 |
- {, H1 L" R" j" \( c. { j8 N# j
- if(IRREC_RX_CNT < 64)
. V& G' a& k& O1 U& M - {
4 s, c$ ]$ U [8 h: x' P$ X - IRREC_RX_BUF[IRREC_RX_CNT++] = (Recev[7] << 7) |(Recev[6] << 6)| (Recev[5] << 5)| (Recev[4] << 4)| (Recev[3] << 3) |(Recev[2] << 2) |(Recev[1] << 1) |Recev[0];7 t4 E& O# H8 W9 e$ W7 m0 c2 T
- " V T: ~2 g' l. s# B) u+ ~5 o" C6 N
- }
+ j* K y6 r( E; r. O, F - rebit = 10;+ Z' a' q; i( s4 ^9 U# W `
- m_rx_begin_f = 0;
* i4 M# d9 V5 T; m* I0 V% G - ( j) F/ |! D/ W; n. M- L7 j5 G; F
- ; L3 T, @9 I( J- \& D( \
- }
3 F% R4 z9 B0 S$ r/ p - $ y! B! ~4 p* A' A. g) V( r
- }$ z0 K+ t4 m3 x
- }
1 d% b( l8 ]7 D5 V" [) Y
& o/ ^5 w# ]3 X2 g- 4 L: k9 c7 U7 p
- #endif$ p, s7 r1 u0 q6 {3 m# m: s+ t/ c. p
- EXTI_ClearITPendingBit(EXTI_Line8);//清除中断挂起标志位
* T) E) m, z* c/ \0 b+ w; S
& f3 M/ a1 O1 F) H! m8 H- } ~' A4 @, q2 R! T1 q, S
: Z3 ` [: U! C- b$ k Q' @, @* R9 V- }
复制代码
. A% b& c8 ]* E5 f |