2015-04-22 65 views
0

对不起,蹩脚的标题我不知道如何问什么即时通讯寻找。这是我的问题。我有一个msp430处理器连接到一堆收发器。我有单独的离散输出去去选择每个收发器。正常我定义选择每个芯片的这样将一个表达式分配给一个typedef结构体变量

#define enable_port_rx P1OUT &= ~BIT2 
#define disable_port_rx P1OUT |= BIT2 
#define enable_port_tx P1OUT |= BIT1 
#define disable_port_tx P1OUT &= ~BIT1 

我有,我放在一个阵列,这样我可以,虽然他们有迭代循环每个收发器结构。

extern motors m[10]; 
typedef struct 
{ 
    unsigned char address; 
    unsigned int value; 
    unsigned int xdata[10]; 
} motors; 

我希望能够从结构体中启用/禁用rx/tx。 我想做这样的事情。

m[0].enable_tx = P1OUT |= BIT1; 
m[0].disable_tx = P1OUT &= ~BIT1; 
m[1].enable_tx = P3OUT |= BIT2; 
m[1].disable_tx = P3OUT &= ~BIT2; 

,这样我可以给他们打电话时,我需要他们..

m[0].disable_tx; //disable tx 
m[1].disable_tx; //disable tx 

我想下面这样的事情会工作。那是我将指针保存到寄存器和需要的位,以便在需要时访问它们。但这不起作用。

//inside strut 
volatile unsigned char *rxPxOUT; 
unsigned char rxBITx; 
volatile unsigned char *txPxOUT; 
unsigned char txBITx; 

//setup 
m[0].txPxOUT=&P1OUT; 
m[0].txBITx = BIT1; 

//function call 
&m[0].txPxOUT &= ~m[0].txBITx; 

在此先感谢

+1

做匿名函数的其他手段,不是名为'enable_tx'的成员。然后? –

+0

@SouravGhosh这是OP的问题。他想知道如何添加[结构中的函数](http://stackoverflow.com/questions/17052443/c-function-inside-struct) – Eregrith

回答

1

我显然不能测试它自己,但我认为,唯一的错误是

&m[0].txPxOUT &= ~m[0].txBITx; 

这应该是

*m[0].txPxOUT &= ~m[0].txBITx; 

编辑:您可以把代码放到这样的成员函数中:

typedef struct 
{ 
    .... 
    void disable_tx(); 
} motors; 

void motors::disable_tx() 
{ 
    *txPxOUT &= ~txBITx; 
} 

,并调用它是这样的:

m[0].disable_tx(); 
+0

是的,这是我的问题..我仍然希望找到一个更优雅解决方案..但这确实奏效。非常感谢,指出这一点 – gezzuzz

+0

@gezzuzz我很高兴它的工作,我用更优雅的解决方案更新了答案。 – alain

0

您可以添加函数指针到您的结构,然后给他们打电话。

extern motors m[10]; 
typedef struct 
{ 
    unsigned char address; 
    unsigned int value; 
    unsigned int xdata[10]; 

    void (*disable_tx)(void); 
} motors; 

[...] 

void disable_tx_1(void) 
{ 
    P1OUT &= ~BIT1; 
} 

[...] 

m[0].disable_tx = disable_tx_1 

[...] 

m[0].disable_tx(); 

[...] 

如果你想有像在你的问题中拉姆达风格的功能,你可以看看GCC anonymous functions或`motors`在C.

+0

而不是创建每个人的命名函数..我怎么能通过一个匿名函数。像\t m [0] .disable_tx =(void){P1OUT&=〜BIT1;}; – gezzuzz

+0

@gezzuzz你可以看看[GCC匿名函数](http://en.wikipedia.org/wiki/Anonymous_function#C_.28non-standard_extension.29),它们不是标准C的一部分 – Eregrith

相关问题