在C++循环中使用字符串数组在 PIC I/O 引脚之间切换
Using a string array in a C++ loop to switch between PIC I/O pins
关于如何使用字符串数组元素作为函数的一部分(参数(的任何提示?
我的阵列是(继续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);
}
- 如何在 setup() 函数中使用数字引脚转动电机?
- 如何获取引脚 4 的值,以便也发送到从站并使用 I2C 显示?
- 直接显示 - 无法使用设置模式设置静止引脚
- 如何从 C 文件将引脚排列与 esp8266 一起使用?
- 如何在嵌入式平台中管理不同引脚输出板的代码,以实现更好的HAL管理
- Arduino Nano - 为什么我的引脚表现得如此?
- 使用硬件 RX 引脚作为 arduino 的中断引脚
- C++ 编译时检查微控制器引脚是否已从其他源文件初始化
- OneWire arduino 库,具有后期引脚定义
- 英特尔引脚:如何生成对象转储ish代码
- 如何从单独的PC控制Raspberry Pi的GPIO引脚
- 如何在Beanglebone黑色内核上启用RTS和CTS引脚4.1.15-Ti-RT-R43
- 英特尔引脚:检测运行过程
- 尝试使用引脚工具从堆栈中打印寄存器的值
- 如何为多个模拟引脚编写功能?(阿杜伊诺)
- QT 中的蓝牙 UUID 和引脚请求
- 使用"英特尔引脚"时跟踪不匹配的CALL和RET指令数
- 引脚类似工具,用于编译时注入检测代码
- C++和引脚工具 - IF语句非常奇怪的双变量问题
- 在C++循环中使用字符串数组在 PIC I/O 引脚之间切换