This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR5994:C++中的 UART ISR

Guru**** 2576215 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/866515/msp430fr5994-uart-isr-in-c

器件型号:MSP430FR5994

您好!

我正在尝试在 C++上的某个类中包含 UART 的 ISR、但在执行 _bis_SR_register (GIE)时、它似乎进入了一个无限陷阱、并且显示没有 ISR、  

这是我的主函数。 我的类协调器头文件如下所示、它包含 ISR。 是否有其他方法可以使用 C++实现 ISR?

#include "Coordinator.h"

int main (空)

  WDTCTL = WDTPW | WDTHOLD;          //停止看门狗

  initGPIO(); //初始化 GPIO 引脚

  initClockTo8MHz();//初始化时钟

  inituart();//初始化 UART 通信

  协调人协调员=协调人();

  _bis_SR_register (GIE);   // 中断被启用

  while (1){

    coordinator.process();//连续读取解析缓冲区,一旦"$"被读取,将开始在 packetbuffer 中存储字符,直到"/n"个字符,然后运行 NMEAParse 函数

  }

类协调器

公共:

  枚举串行端口{

    ARES、

    GPS、

    调制解调器

  };

  协调员();

  void process();

  Virtual ~Coordinator();

专用:

  CircularBuffer mGPSBuffer;

  void send (uint16数据、串行端口串行端口);

#pragma vector=USCI_A1_vector

_interrupt void USCI_A1_ISR (void)

 switch (__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))

 {

  USCI_NONE 案例:中断;

  USCI_UART_UCRXIFG 案例:

    if (mGPSBuffer.overflow){  //如果写入缓冲区位于读取缓冲区后面,则中断以防止覆盖尚未读取的数据

      中断;

    }

    否则{

      字符字节= UCA1RXBUF;

      mGPSBuffer.PUSH (字节);

    }

   中断;

  案例 USCI_UART_UCTXIFG:中断;

  案例 USCI_UART_UCSTTIFG:中断;

  案例 USCI_UART_UCTXCPTIFG:中断;

 }

};

#endif /* Coordinator_H_*

#include "Coordinator.h"
int main (void){  WDTCTL = WDTPW | WDTHOLD;          //停止看门狗  initGPIO(); //初始化 GPIO 引脚  initClockTo8MHz;//初始化时钟  initUART ();//初始化 UART 通信
  协调器协调器=协调器();  __bis_SR_register (GIE);   // 中断被启用
  while (1){     coordinator.process();//连续读取解析缓冲区,一旦"$"被读取,将开始在 packetbuffer 中存储字符,直到"/n"个字符,然后运行 NMEAParse 函数  }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ISR 看起来也属于您的类定义范围、因此您需要将其带到类之外、遗憾的是 ISR 不在类中工作。

    由于在 C++中进行名称改编、您可能需要使用以下代码对 ISR 进行换行:

    extern "C"{

    //此处输入您的代码

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、谢谢、但是现在当我把它放在我的主函数下时、我收到一个错误、表示 ISR 中的方法未定义。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    mGPSBuffer 是类中的私有成员。 您将需要在 main 中实例化的对象上调用 mGPSBuffer、但您将无法从 ISR 访问该对象、因为它是私有的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、我认为我对它进行了调整、但它仍然为我提供了误差。 我能否将 mGPSBuffer 公开。 还有一种通过 ISR 访问类成员的方法。

    /*
    * Coordinator.h
    *
    *创建日期:2019年12月12日
    *作者:实验
    *

    #ifndef Coordinator_H_
    #define Coordinator_H_

    #include
    #include
    #include

    #include "CircularBuffer.h"
    #include "localTypes.h"
    #include "packet.h"

    类协调器

    公共:
    枚举串行端口{
    ARES、
    GPS、
    调制解调器
    };

    协调员();

    void process();

    Virtual ~Coordinator();
    CircularBuffer mGPSBuffer;

    专用:

    void send (uint16数据、串行端口串行端口);

    };
    #endif /* Coordinator_H_*

    #include "Coordinator.h"

    int main (空)

    WDTCTL = WDTPW | WDTHOLD;//停止看门狗
    initGPIO();//初始化 GPIO 引脚
    initClockTo8MHz();//初始化时钟
    inituart();//初始化 UART 通信

    协调人协调员=协调人();

    CircularBuffer mGPSBuffer = CircularBuffer();

    _bis_SR_register (GIE);//中断被启用

    while (1){
    coordinator.process();//连续读取解析缓冲区,一旦"$"被读取,将开始在 packetbuffer 中存储字符,直到"/n"个字符,然后运行 NMEAParse 函数

    #pragma vector=USCI_A1_vector
    _interrupt void USCI_A1_ISR (void)

    switch (__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))

    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    if (mGPSBuffer.overflow){//如果写入缓冲区位于读取缓冲区后面,则中断以防止覆盖尚未读取的数据
    中断;

    否则{
    字符字节= UCA1RXBUF;
    mGPSBuffer.PUSH (字节);

    中断;
    案例 USCI_UART_UCTXIFG:中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:中断;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您现在遇到的问题是 mGPSBuffer 的作用范围仅在 main()中。 您需要在全局范围内声明它、以便可以从 ISR 访问它。