1、串口通信的格式:起始位(1)------数据位(8位/7位)-------校验位(0/1)--------停止位(1)
/ j6 I1 g* h/ f: N 因为我们很少用到校验位,所以,校验位可有可无! [' k& ]! Z* V- y; o$ P9 f
2、波特率, 意思是每秒发送多少个bit,单位是 bit/s, 我们常用bps来表示, 例如 9600bps, 4800bps, 2400bps* W% T* A9 n' {: ] A5 J( F
& D& U/ z" I3 g
中断调用函数& X* ?8 v3 M) ^/ @. K
void Uart_Interrupt(void)+ y0 \7 ?9 B3 v' [
{
8 h+ _ Z* }: |# b! j1 n0 |2 _ uint8_t i;4 s9 r& \. D9 z5 C- f" x
u: j9 Y# a. ~1 _9 Z if(1 == flag_rxd_finish)$ ?6 j. `% @* K: \7 f9 H
{
" _9 d8 B$ Q: \ o flag_rxd_finish = 0;. `6 t" u0 f s$ p
flag_rxd_txd = 0;
0 @# c* _1 t# W4 U. j for(i = 0;i < TxXKCnt; i++)
0 g" a7 c. H5 m) [6 p$ t$ H+ M {' W+ k; q& K( n: v& _4 \4 P
UartTxBuff = UartRxBuff;6 H, {2 G8 ^, r9 e6 J8 p
}0 S5 F3 @! q& O1 f
}
8 g7 E: @% {/ [9 A
: x! G3 n. n. O2 d6 \4 ?& }5 m, Y& M if(1 == flag_rxd_txd) // 为1,接收
- [+ p+ t' z( D n2 i$ j {' w6 f( B- k8 s
Uart_Rx_Byte();
' u. _2 K! H3 s5 i( N7 I }. C, e8 S, e+ i5 P7 h% T: Y+ D+ Q2 K
else // 为0,发送
- T) l) V& N$ ^ {; R- m2 {) J4 |# M, ]' X; O
Uart_Tx_Byte();
: t0 p3 D }4 p p }
3 `, L) q* t$ ?! s. ?}6 J/ {( Q+ q" h2 E$ Q
& I3 d' U9 u. a ?, ^; h) b
- X# z& R3 V: M8 _6 q接收函数( G5 C; F5 S, U- P
- static void Uart_Rx_Byte(void)
- {
- static uint8_t RxBitNum; //接收位计数
- static uint8_t OverTime; //接收超时计时器
- static uint8_t RxByteBuff; //一字节数据接收缓存
- if(1 == Uart_RXD_Status())
- {
- OverTime++;
- }
- else
- {
- OverTime = 0;
- }
- if(OverTime > 44)
- {
- OverTime = 0;
- RxByteIndex = 0;
- RxBitNum = 0;
- }
- if((1 == Uart_RXD_Status()) && (0 == RxBitNum))
- {
- RxSampFreq = 0;
- }
- else
- {
- RxSampFreq++;
- }
- if(1 == RxSampFreq)
- {
- if(0 == RxBitNum)
- {
- if(0 == Uart_RXD_Status())
- {
- RxByteBuff = 0;
- RxBitNum++;
- }
- }
- else if((RxBitNum > 0) && (RxBitNum < 9))
- {
- if(1 == Uart_RXD_Status())
- {
- RxByteBuff = RxByteBuff | (1 << (RxBitNum - 1));
- }
- RxBitNum++;
- }
- else if(9 == RxBitNum)
- {
- if(1 == Uart_RXD_Status())
- {
- RxBitNum = 0;
- if(0x0d != RxByteBuff && 0x0a != RxByteBuff)
- {
- UartRxBuff[RxByteIndex] = RxByteBuff;
- RxByteIndex++;
- if(RxByteIndex > 63)
- {
- RxByteIndex = 0;
- }
- }
- else
- {
- TxXKCnt = RxByteIndex;
- RxByteIndex = 0;
- flag_rxd_finish = 1;
- }
- }
- }
- else
- {
- RxBitNum = 0;
- }
- }
- else if(RxSampFreq > 3)
- {
- RxSampFreq = 0;
- }
- }( \, H: |; i6 C) l. p
3 N( i! C2 \ X8 u
$ `$ q. n- G% u$ J$ I% E8 a发送函数" j, B; R( Y, ]- L1 l9 F; c
! ~$ t. Z( p" S v9 X- e2 ]
. `4 N# i& ^4 _- V( V
- static void Uart_Tx_Byte(void)
- {
- static bool SendFinish = 1; //发送完成标志
- static u8 TxSampFreq = 0; //发送计数 采样4次
- static u8 BitNum = 0; //位计数
- static u8 ByteLock; //发送字节锁定(防止在发送途中 发送数字被改变)
- static u8 TxIndex = 0; //当前发送索引
- if(SendFinish)
- {
- SendFinish = 0;
- RxSampFreq = 0;
- BitNum = 0;
- if(TxIndex < TxXKCnt) //控制发送的字节
- {
- ByteLock = UartTxBuff[TxIndex];
- TxIndex++;
- RxByteIndex = 0;
- }
- else if(TxIndex == TxXKCnt)
- {
- ByteLock = '\n';
- TxIndex++;
- RxByteIndex = 0;
- }
- else
- {
- flag_rxd_txd = 1;
- SendFinish = 0;
- TxIndex = 0;
- }
- }
- if(++TxSampFreq > 3)
- {
- if(BitNum == 0) //起始位
- {
- Uart_TXD_Out_LOW();
- BitNum++;
- }
- else if((BitNum >0) && (BitNum < 9)) //数据位
- {
- if(0x01 & (ByteLock >> (BitNum-1))) //先发低位
- {
- Uart_TXD_Out_HIGH();
- }
- else
- {
- Uart_TXD_Out_LOW();
- }
- BitNum++;
- }
- else if(BitNum == 9) //结束码
- {
- Uart_TXD_Out_HIGH();
- SendFinish = 1;
- BitNum = 0;
- }
- TxSampFreq = 0;
- }
- }$ A9 K/ H9 b. Z& _9 I9 h$ |- `1 ~2 \
& g. p' r* `6 w3 \9 Q5 P
6 l3 [, X& n/ |; j1 f0 m" O
% I9 @0 `) r% H2 G3 J# ^
: w- ~1 ^, l4 y+ | B7 O. }7 _# i% c9 T$ v8 `: v* {" ^, y( n
0 X5 x |, `8 @" T
- |9 M0 K: G2 l2 Y' d! T! E) L8 v) x& p8 O5 h$ W
! [3 }8 r- Q& r* w( W$ |% \. ?) a0 o9 h1 |4 A
|
我的不能发也不能收。请问你的发送是怎么调的
是GPIO模拟串口,楼主说明得不够详细,第一个函数UART_Interrupt给人造成了误解
我觉得这并不会误解,第一,这个不是stm8的中断函数规则命令,自然不会跟stm8本身的中断硬件冲突,
第二,这个的确是我的模拟串口需要运行的interrupt函数,所以,我觉得这是个人理解的问题