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

分享一个我在用基于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 手机版