【问题标题】:Using a string array in a C++ loop to switch between PIC I/O pins在 C++ 循环中使用字符串数组在 PIC I/O 引脚之间切换
【发布时间】:2023-04-06 20:48:01
【问题描述】:

关于如何使用字符串数组元素作为函数的一部分(参数)的任何提示?

我的数组是(PIC 输出端口的延续)

string Port[5] = {PORTA.0, PORTA.1, PORTA.2, PORTA.3};

我想在循环中使用它,将逻辑 0 按顺序发送到端口,这些端口在数组端口中声明

void loop() {
Port[2] = 0x00;   // sends 0 to PORTA.1
}

如何在 C++ 中做到这一点??

【问题讨论】:

  • PORTA.0PORTA.1 等是什么?它们应该是字符串吗? PIC I/O 端口?我想知道你是否问对了问题。
  • Blastfurnace,我编辑了问题
  • 好吧,您拥有的数组条目使用的是整数,而不是字符串。所以你真的需要重新编辑它以至少代表某种有意义的伪代码...... 8)
  • 在 PIC 平台上,PORTA 符号是保留字,而不是字符串或文本文字。它们实际上降级为地址和位值。所以你的请求不会起作用。
  • Thomas,有什么办法吗,我可以使用 switch() 但代码会很长

标签: c++ arrays microcontroller


【解决方案1】:

您的根本问题是您想将一组端口引脚发送到一个函数。

端口引脚不是字符串

标识符PORTA 等不是字符串。它们是 PIC 编译器的保留字。它们代表一个可寻址的位置(端口或内存映射)。

点符号PORTA.3 指的是端口的位数。

计数器示例是将值复制到“PORT_FROG.8”。 您是否尝试过使用以下内容:

  const char port_a_3[] = "PORTA.3";
  *port_a_3 = 5;

问题是最后一条语句修改了文本文字并且没有写入端口。

将端口引脚传递给函数

您需要查找传递端口位地址的语法,以及如何传递端口地址。如果没有文档或示例,事情会变得复杂。

最可移植的方法是创建一个Port 类并传递它的实例,或者您可以使用某种std::pair 来提供端口ID 和位号。

更高效的硬件设计

一个更有趣的问题:您的平台设计是否高效? 通常,您可以说服硬件人员将类似功能的行放在一起。这样,您可以通过读取整个端口而不是从不同端口读取不同位来获取它们的状态快照。

统一端口位

我强烈建议您编写一个函数,将指定的不相交位读入一个数字,另一个函数可以写入它们。在这个概念中,您将在一个单元中拥有所有状态,并且可以将该状态传递给函数。如果您需要将不相交的引脚作为一个组写入,您可以调用您的write 函数。

总结

根本要求是您希望将一组端口引脚地址传递给函数,以便它们可以读取和写入端口引脚。这在标准 C++ 中不可用,因此您必须查看 PIC 编译器文档以查看是否可行。还有其他选择,例如传递端口模型;端口和位对;将多个引脚读写到一个状态单元中的编码功能;或更改硬件以使软件更易于开发。抱歉,端口标识符不是文本文字或字符串,不能以这种方式进行操作。

编辑 1:
您可能能够传递映射到端口的结构。再次查看编译器文档。

例子:

  struct MyPort_Model
  {
     unsigned int bit_0 : 1;
     unsigned int bit_1 : 1;
     unsigned int bit_2 : 1;
     unsigned int bit_3 : 1;
  } my_port_variable @ PORTA;

另一个例子:

  struct Model_4_bit_HW_Item
  {
     unsigned int MOSI : 1;
     unsigned int MISO : 1;
     unsigned int clock : 1;
     unsigned int chip_select : 1;
     unsigned int reserved : 4;
     void read_from_port(void)
     {
       MOSI = PORTA.0;
       MISO = PORTA.1;
       clock = PORTA.2;
       reserved = PORTA.3;
     }
  };

【讨论】:

  • 你把事情澄清得很好,谢谢-我会试着告诉你结果
【解决方案2】:

您有几个选择: 你可以写一个这样的函数: 无效循环(char** argv,int argc) 您将在其中将元素的数量传递给函数。您还可以使用向量和 std::string: 无效循环(std::vector &vals) { vals[0]="foobar"; } 等等

【讨论】:

    【解决方案3】:

    希望这是一个简单的例子。该程序打印程序名称和参数。应该注意的是,如果您关心效率,最好将字符串数组作为引用传递,而不是在堆栈上传递。

    #include <string>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    static void process_strings (vector<string> strings)
    {
        vector<string>::iterator i;
    
        for (i=strings.begin(); i!=strings.end(); i++) {
            string s = *i;
    
            cout << s << endl;
        }
    }
    
    int main (const int argc, const char *const argv[])
    {
        vector<string> strings;
        int i;
    
        for (i = 0; i < argc; i++) {
            string s = string(argv[i]);
    
            strings.push_back(s);
        }
    
        process_strings(strings);
    
        exit(0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 2012-07-05
      相关资源
      最近更新 更多