在C ++循环中使用字符串数组在PIC I / O引脚之间切换

时间:2014-09-15 21:20:40

标签: c++ arrays microcontroller

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

我的阵列(继续PIC输出端口)

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

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

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

如何在C ++中实现?

3 个答案:

答案 0 :(得分: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;
     }
  };

答案 1 :(得分:0)

这里有几个选项: 你可以写一个这样的函数:     void loop(char ** argv,int argc) 你将元素的数量传递给函数的地方。你也可以使用vector和std :: string:     void Loop(std :: vector& vals)     {         瓦尔斯[0] = “取得foobar”;     } 等

答案 2 :(得分:0)

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

#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);
}