找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1933|回复: 3
收起左侧

请教STM8l的串口通信问题

[复制链接]
ID:685842 发表于 2020-9-6 20:36 | 显示全部楼层 |阅读模式
10黑币
程序在调试状态一步一步执行发送字符串都能正常的发送,但全速运行时发送1和0以外的字符时,就出现错误了
求求大佬帮忙找找原因  或者给个解决思路     不胜感激
#include <stm8l15x.h>
#include "led.h"
#include "delay.h"
#include "scip.h"

char REData;

void main()
{
  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);
  LED_Init();
  USART1_Init(9600);
  while(1);
}


INTERRUPT_HANDLER(USART1_RX_TIM5_CC_IRQHandler,28)
{
  u8 i;
  u8 str[6]={69,82,82,79,82,0};
    if(USART_GetITStatus(USART1,USART_IT_RXNE)==SET)  //判断是否接收到数据
    {
      REData=USART_ReceiveData8(USART1);              //接收USART1的数据
      if(REData=='0'||REData=='1')
      {
        USART_SendData8(USART1,REData);               //将接收到的数据发送出去      }
      else
      {
        for(i=0;i<6;i++)
        {
          USART_SendData8(USART1,str[i]);              //错误
        }
      }

      USART_ClearITPendingBit(USART1,USART_IT_RXNE);//清除中断标志位
    }
}

//串口初始化配置
#include <stm8l15x.h>
#include "scip.h"

void USART1_Init(u16 BaudRate)
{
  disableInterrupts();   //关闭系统总中断
  CLK_PeripheralClockConfig(CLK_Peripheral_USART1,ENABLE);
  USART_Init(USART1,BaudRate,USART_WordLength_8b,USART_StopBits_1 ,USART_Parity_No,(USART_Mode_Rx |USART_Mode_Tx));
  USART_ITConfig(USART1, USART_IT_RXNE , ENABLE);
  USART_Cmd(USART1,ENABLE);
  enableInterrupts();   //使能系统总中断
}

全速运行

全速运行

单步运行

单步运行

最佳答案

查看完整内容

1、使用单片机串口往上发送数据时,一定要检测与发送相关的标志位,比如TXE(发送数据寄存器空)、TC(发送完成)等,若不检测等待这些标志位,连续发送时就会出现问题; 2、所以,若单片机串口间隔较长时间发送单字节,是不会有啥问题的,比如你这段响应‘0’和‘1’的程序; if(REData=='0'||REData=='1') { USART_SendData8(USART1,REData); //将接收到的数据发送出去 } 3、但是连续发送时就会 ...
回复

使用道具 举报

ID:383721 发表于 2020-9-6 20:36 | 显示全部楼层
1、使用单片机串口往上发送数据时,一定要检测与发送相关的标志位,比如TXE(发送数据寄存器空)、TC(发送完成)等,若不检测等待这些标志位,连续发送时就会出现问题;
2、所以,若单片机串口间隔较长时间发送单字节,是不会有啥问题的,比如你这段响应‘0’和‘1’的程序;
if(REData=='0'||REData=='1')
{
     USART_SendData8(USART1,REData);               //将接收到的数据发送出去      
}
3、但是连续发送时就会出现问题,比如你发送字符串那段程序,加一句标志位检测就可以了;
else
{
     for(i=0;i<6;i++)
     {
          USART_SendData8(USART1,str[i]);              //错误
          while(USART_GetFlagStatus(XXX)==XXX);        //加入发送标志位检测
     }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:739545 发表于 2020-9-7 11:44 | 显示全部楼层
把“hex显示”旁边的钩去掉
回复

使用道具 举报

ID:685842 发表于 2020-9-7 18:21 | 显示全部楼层
采蘑菇的小宋 发表于 2020-9-7 13:33
1、使用单片机串口往上发送数据时,一定要检测与发送相关的标志位,比如TXE(发送数据寄存器空)、TC(发送 ...

原来错误在这    我就说为什么单步调试时能发送成功,全速运行的时候就出错    感谢大佬的回答      
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表