你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

分享一个我在用基于STM8模拟串口模块

[复制链接]
Inc_brza 发布时间:2015-1-15 09:56
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
赞 收藏 1 评论10 发布时间:2015-1-15 09:56

举报

10个回答
Inc_brza 回答时间:2015-1-15 10:25:43
自顶                        
沐紫 回答时间:2015-1-15 10:28:52
谢谢
麟狮蕟 回答时间:2015-1-15 13:04:54
顶起。。。
ranran2014 回答时间:2015-7-28 10:44:36
我试了一下此函数,只能发不能收,是不是中断函数放错了位置?
liangaaaaaaaaa 回答时间:2015-11-18 12:43:38
ranran2014 发表于 2015-7-28 10:44
( m& f5 m) n7 N: [7 B/ p, A0 y我试了一下此函数,只能发不能收,是不是中断函数放错了位置?

* f' k! g. Z' O0 B& H& R我的不能发也不能收。请问你的发送是怎么调的
JackieLaura 回答时间:2015-11-18 14:16:34
这是GPIO模拟串口?感觉不是的。。。
stmcu.org.png
小小超 回答时间:2015-11-21 17:23:55
有硬件也不用?
那片清茶 回答时间:2015-11-24 08:28:57
楼主不错。
+ D4 |2 m& K# n$ k% R/ D
zhoupxa 回答时间:2015-11-24 08:50:19
JackieLaura 发表于 2015-11-18 14:163 G* |4 Y" p; k' e4 u
这是GPIO模拟串口?感觉不是的。。。
, }. I) n' n( M* q% H( U1 R% u
是GPIO模拟串口,楼主说明得不够详细,第一个函数UART_Interrupt给人造成了误解
Inc_brza 回答时间:2015-11-30 12:40:20
zhoupxa 发表于 2015-11-24 08:50! f$ f8 Z- i2 y+ |
是GPIO模拟串口,楼主说明得不够详细,第一个函数UART_Interrupt给人造成了误解 ...
8 [) N- G$ W+ @& B" G) F3 U( v
我觉得这并不会误解,第一,这个不是stm8的中断函数规则命令,自然不会跟stm8本身的中断硬件冲突,
% E5 v: P* s) [第二,这个的确是我的模拟串口需要运行的interrupt函数,所以,我觉得这是个人理解的问题

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版