准备好写程序了
先是用C语言写,我主要是做一个串口来接收command,然后解析它的参数,然后根据不同的命令控制I2C设备pcf8574。
比如有直接写,读+或+写, 读+异或+写,读+与+写。共四条指令。因为有多个i2c设备所有每个命令后面跟上参数指定不同的设备id即slave地址。另外还需要一个参数来指令port的值。
首先我写了一个命令解析函数。它仅接受四条指令并分析命令后的两个参数,可以接受二进制,十进制(默认),十六进制。
分别的格式是:
cmd1 port data
setp b0101 b10101010; 二进制表示。
setp 3 182 ;十进制表示。
setp x1 xFF; 十六进制表示。
uint16 getcmd()
{
uint8 ch = 0, bp = 0, flag;
uint16 cmd = 0;
while ((ch = getc()) && !isbreak(ch)) {
if (isspace(ch) && bp &&
isspace(buffer[bp - 1]))
continue;
buffer[bp++ % BSX] = ch;
///<
if (!bp)
bp = BSX;
}
///<
while (bp) {
ch = buffer[(bp - 1) % BSX];
if (!isspace(ch))
break;
--bp;
}
///< Dosn't handles empty command.
if (!bp)
return ERR_EMPTY_INPUT;
///< add a space.
buffer[bp % BSX] = 0x20;
/// 1)
break;
}
///< Checks WDT.
wdt_set();
///< The length of name must at least 4 chars.
if (bp < 4 || flag < 2)
return ERR_INVALID_FORMAT;
while (bp--) {
ch = buffer[bp % BSX];
///< Converts lowercase to uppercase.
if (ch > 0x60)
ch -= 0x20;
if (ch > 0x5a)
return ERR_ILLEGAL_FUNCTION;
if (!cmd) {
if (ch != 0x50)
return ERR_ILLEGAL_FUNCTION;
cmd |= 0x01;
continue;
}
if (cmd >> 9)
break;
cmd <<= 8;
cmd |= ch;
}
switch (cmd) {
case 0x5445:
if (ch != 0x53)
return ERR_ILLEGAL_FUNCTION;
flag = 0;
break;
case 0x4c52:
if (ch != 0x58)
return ERR_ILLEGAL_FUNCTION;
flag = 0x10;
case 0x524f:
if (ch != 0x58)
return ERR_ILLEGAL_FUNCTION;
flag = 0x20;
break;
case 0x444e:
if (ch != 0x41)
return ERR_ILLEGAL_FUNCTION;
flag = 0x30;
break;
default:
return ERR_ILLEGAL_FUNCTION;
}
cmd = flag << 8;
for (; ; bp++) {
ch = buffer[bp % BSX];
if (isspace(ch)) {
ch = buffer[++bp % BSX];
flag = 10;
if (isnum(ch))
///< Processes dec numbers.
--bp;
else if (ch == 0x42 || ch == 0x62)
///< Processes binary numbers.
flag = 0x02;
else if (ch == 0x58 || ch == 0x78)
/// 0x60)
ch -= 0x20;
ch -= 0x07;
}
}
ch -= 0x30;
if (cmd & 0xff) {
ch = (cmd & 0xff) * flag + ch;
cmd ^= (cmd & 0xff);
}
cmd |= ch;
ch = buffer[++bp % BSX];
}
if (cmd & 0x8000)
break;
///< pcf8574 only three address pins are valid.
if (cmd & 0xf8)
return ERR_DEVICE_ADDRESS_OUT_RANGE;
cmd |= ((cmd & 0x07) << 8);
cmd ^= (cmd & 0xff);
cmd |= 0x8000;
--bp;
}
}
return cmd;
}
我要赚赏金
