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

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

[复制链接]
Inc_brza 发布时间:2015-1-15 09:56
1、串口通信的格式:起始位(1)------数据位(8位/7位)-------校验位(0/1)--------停止位(1)
      因为我们很少用到校验位,所以,校验位可有可无
2、波特率, 意思是每秒发送多少个bit,单位是 bit/s, 我们常用bps来表示, 例如 9600bps, 4800bps, 2400bps

中断调用函数
void Uart_Interrupt(void)
{
        uint8_t i;

        if(1 == flag_rxd_finish)
        {
                flag_rxd_finish = 0;
                flag_rxd_txd = 0;
                for(i = 0;i < TxXKCnt; i++)
                {
                        UartTxBuff = UartRxBuff;
                }
        }

        if(1 == flag_rxd_txd)         // 为1,接收
        {
                Uart_Rx_Byte();
        }
        else                                        // 为0,发送
        {
                Uart_Tx_Byte();
        }
}



接收函数
  • 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;
  •         }
  • }


发送函数


  • 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;
  •     }
  • }










收藏 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
我试了一下此函数,只能发不能收,是不是中断函数放错了位置?

我的不能发也不能收。请问你的发送是怎么调的
JackieLaura 回答时间:2015-11-18 14:16:34
这是GPIO模拟串口?感觉不是的。。。
stmcu.org.png
小小超 回答时间:2015-11-21 17:23:55
有硬件也不用?
那片清茶 回答时间:2015-11-24 08:28:57
楼主不错。
zhoupxa 回答时间:2015-11-24 08:50:19
JackieLaura 发表于 2015-11-18 14:16
这是GPIO模拟串口?感觉不是的。。。

是GPIO模拟串口,楼主说明得不够详细,第一个函数UART_Interrupt给人造成了误解
Inc_brza 回答时间:2015-11-30 12:40:20
zhoupxa 发表于 2015-11-24 08:50
是GPIO模拟串口,楼主说明得不够详细,第一个函数UART_Interrupt给人造成了误解 ...

我觉得这并不会误解,第一,这个不是stm8的中断函数规则命令,自然不会跟stm8本身的中断硬件冲突,
第二,这个的确是我的模拟串口需要运行的interrupt函数,所以,我觉得这是个人理解的问题
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版