DYyanfa 2024-04-18 20:03 采纳率: 31.3%
浏览 2

串口接收到指令对应引脚没有变化

STC8G1K08单片机调试中遇到如下问题:现在需要通过串口接收激光灯开关指令,如接收到D7 00 01就将PWR_ON_LASER拉高,即打开激光灯,现在通过串口发送D7 00 01指令,PWR_ON_LASER引脚没有被拉高。


#define  _UART_C

#include "Uart.h"
#include "config.h"
#include "string.h"
//波特率配置为9600
#define FOSC        11059200UL   //UL:无符号长整形
#define BRT         (65536 - FOSC / 9600 / 4)   //定时器速度1T

bit busy;  //0表示不忙,1忙
char wptr;    //写指针
char rptr;  //读指针
char received_data;
char buffer[16]= {0};
//unsigned char RxdByte = 0;//-echo验证定义的变量
sbit PWR_ON_LASER = P1^2;

    
void Check_Laser()
{
    if (buffer[(wptr - 3) & 0x0f] == 0xD7 &&
        buffer[(wptr - 2) & 0x0f] == 0x00 &&
        buffer[(wptr - 1) & 0x0f] == 0x01)&&
    
        {
            PWR_ON_LASER = 1; //收到指令"CMD"打开激光
        }
        
    else if(buffer[(wptr - 3) & 0x0f] == 0xD7 &&
        buffer[(wptr - 2) & 0x0f] == 0x00 &&
        buffer[(wptr - 1) & 0x0f] == 0x02)
        {
            PWR_ON_LASER = 0;//收到指令"CMD"关闭激光
        }
}

void UartIsr() interrupt 4
{
    if(TI)   //判断TI标志位,为1表示数据发送完毕
    {
        TI = 0; //清零TI标志位
        busy = 0;         //串口不忙
    }
    if(RI)   //判断RI标志位,接收数据完毕执行下面代码
    {
        RI = 0; 
//        RxdByte = SBUF; 
//        SBUF = RxdByte;// -echo验证
        received_data = SBUF; //读取串口缓冲区的数据
        buffer[wptr++] = received_data; //将接收到的数据存储到缓冲区
        wptr &= 0x0f;   //限制wptr值在0~15范围
    }
}

void UartInit()
{
    SCON = 0x50; //允许串口接收
    P_SW1 = 0x40;  //将串口1切换到P3.6和3.7引脚
    T2L = BRT;
    T2H = BRT >> 8;  //BRT低8位存放在T2L中,高8位存放在T2H
    AUXR = 0x15; //定时器2开始计数,时钟不分频
    wptr = 0x00;
    rptr = 0x00;
    busy = 0;
}

void UartSend(char dat)
{
    while(busy);
    busy = 1;
    SBUF = dat;
}

void UartSendStr(char *p)
{
    while (*p)
    {
        UartSend(*p++);
    }
}
  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-04-18 21:15
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    首先,让我们来分析一下你的代码和问题。根据你的描述,当串口接收到特定指令时,应该控制 PWR_ON_LASER
    引脚的电平,但在实际操作中没有发生预期的变化。接下来,我将提供解决方案。

    问题分析:

    1. 串口接收部分是否正常工作?
    • 在串口接收中,通过 UartIsr 函数中的中断来处理接收到的数据,并将其存储在 buffer 缓冲区中。在这一部分中,需要确保串口接收和数据存储都正常运行。
    1. 指令解析部分是否正确?
    • Check_Laser 函数负责解析接收到的指令,并根据指令内容控制 PWR_ON_LASER 引脚的电平。在这一部分,需要确保指令解析的逻辑正确,并且能够正确识别接收到的指令。
    1. 引脚控制部分是否正确?
    • 通过 PWR_ON_LASER 引脚控制激光灯的开关。在这一部分,需要确保引脚控制的逻辑正确,且引脚配置正确。

      解决方案:

    1. 检查串口接收部分:
    • 确保串口初始化正确,波特率设置正确。
    • 检查中断是否正常触发,接收到的数据是否被正确存储在缓冲区中。
    1. 检查指令解析部分:
    • 确保 Check_Laser 函数中的条件判断逻辑正确,能够正确识别接收到的指令。
    • 检查指令解析的部分是否存在逻辑错误或拼写错误。
    1. 检查引脚控制部分:
    • 确保 PWR_ON_LASER 引脚的配置正确,包括引脚初始化和引脚方向设置。
    • 确保引脚控制的逻辑正确,即在收到特定指令时,引脚能够正确地被拉高或拉低。

      代码修改建议:

    1. 修正指令解析部分的逻辑错误:
      cCopy code
      void Check_Laser() {
      if (buffer[(wptr - 3) & 0x0f] == 0xD7 &&
      buffer[(wptr - 2) & 0x0f] == 0x00 &&
      buffer[(wptr - 1) & 0x0f] == 0x01) {
      PWR_ON_LASER = 1; // 收到指令打开激光
      } else if (buffer[(wptr - 3) & 0x0f] == 0xD7 &&
      buffer[(wptr - 2) & 0x0f] == 0x00 &&
      buffer[(wptr - 1) & 0x0f] == 0x02) {
      PWR_ON_LASER = 0; // 收到指令关闭激光
      }
      }
      
    • 修正了多余的括号。
    • 确保在接收到指令时正确地修改 PWR_ON_LASER 引脚的电平。
    1. **检查引脚配置和控制:

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    评论

报告相同问题?

问题事件

  • 创建了问题 4月18日

悬赏问题

  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照
  • ¥15 求高通平台Softsim调试经验
  • ¥15 canal如何实现将mysql多张表(月表)采集入库到目标表中(一张表)?
  • ¥15 wpf ScrollViewer实现冻结左侧宽度w范围内的视图
  • ¥15 栅极驱动低侧烧毁MOSFET
  • ¥30 写segy数据时出错3
  • ¥100 linux下qt运行QCefView demo报错
  • ¥50 F1C100S下的红外解码IR_RX驱动问题
  • ¥20 基于matlab的航迹融合 航迹关联 航迹插补