【发布时间】:2018-02-18 17:10:52
【问题描述】:
我想用 C 编写一个小模块,用它们我可以发送和接收 CAN 帧。我的目标是编写一个 100% 可移植、无字节序且独立于编译器的代码。
按照我的代码中的一个小例子。 如果我错了,请给我写信,如果您有更好的建议。
int CAN_FRAME[8] = {1,5,8,15,50,56,78,12};
/* RX Defines */
#define __CONVERT_TO_16BIT(HI_B,LOW_B) (( HI_B << 8 ) | (LOW_B & 0x00FF))
#define __SIG1_MASK 0b00110000
#define __SIG2_MASK 0b00000011
#define __SIG3_MASK 0b00011011
#define __GET_CAN_SIGNAL(POINTER,OFFSET,MASK) ((*(POINTER+OFFSET))&(MASK))
#define GET_LOW_BYTE(VALUE) (unsigned char)(VALUE & 0xFF)
#define GET_HIGH_BYTE(VALUE) (unsigned char)(VALUE >> 8)
/* TX Defines*/
#define PACK_SIGNAL_IN_BYTE(BYTE,VALUE,POS,BITMASK) *BYTE |= (unsigned char) ((VALUE << POS)&(BITMASK))
int main(void)
{
/* RX Simulation*/
int *p = (int*) &CAN_FRAME;
int signal1 = __GET_CAN_SIGNAL(p,4,__SIG1_MASK);
int signal2 = __GET_CAN_SIGNAL(p,6,__SIG2_MASK);
int signal3 = __CONVERT_TO_16BIT(__GET_CAN_SIGNAL(p,7,__SIG3_MASK),__GET_CAN_SIGNAL(p,6,__SIG3_MASK));
/* Test hi/low defines */
short num =0b0101010100000001;
unsigned char low = GET_LOW_BYTE(num);
unsigned char high = GET_LOW_BYTE(num);
/* TX Simulation. Write only one byte*/
CAN_FRAME[2] = 0;
PACK_SIGNAL_IN_BYTE((CAN_FRAME+2),1,0,0x01);
PACK_SIGNAL_IN_BYTE((CAN_FRAME+2),1,1,0x02);
/* send frame*/
return 0;
}
【问题讨论】:
-
那些宏定义可以使用更多的括号。
-
以
__开头的名称保留用于实现。 -
0b现在是 C 的一部分吗?这是 C11 吗? -
我投票结束这个问题,因为它要求进行代码审查:codereview.stackexchange.com
-
这是什么
int *p = (int*) &CAN_FRAME;?为什么不直接做int *p = CAN_FRAME;?
标签: c embedded portability