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

Using a string array in a C++ loop to switch between PIC I/O pins

本文关键字:引脚 之间 数组 循环 C++ 字符串 PIC      更新时间:2023-10-16

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

我的阵列是(继续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等不是字符串。 它们是 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;
     }
  };

这里有几个选项:你可以像这样编写一个函数: void loop(char** argv, int argc(将元素计数传递给函数的位置。你也可以使用向量和 std::string: void Loop(std::vector &vals( { vals[0]="foobar"; }等。

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

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