准备好写程序了
先是用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; }