包含一个字符和两位数的值

Include one character with two digit value

下面的代码显示,检查硬件上 PORTB 的数字输出。那个 PORTB 有 UI1-UI12。 不短路时,值为1。

因此,如果没有短路,当我在超级终端中编写 UI5-UI7 时,它将显示 0x03(二进制 111 位)

这里是代码:

void decode(unsigned char* msg) {

    AD1PCFGL = 0xFFFF; //set all analog pin to digital
    int y, z, x;
    unsigned char* lala[50];

    if (strstr(msg, "UI") == msg) {//UI[2]-UI[6]

            x = msg[2] - '0'; // char to integer
            y = msg[6] - '0'; // char to integer

            //UI[2]-UI[6]
            int start = x - 1; //get offset, start from zero  
            int end = y; // end
            int pinValue; // each pin value
            int output_value=0; // result
            int j = 0, i; // j, start from 0

            for (i = start; i < end; i++) {
                pinValue = ((PORTB & (1 << i)) > 0 )?1:0; // get current pin value from RB3, RB4, RB5, RB6, RB7->UI4, UI5, UI6, UI7, UI8
                output_value |= (pinValue << j++);
            }
            sprintf(lala, "0x%X \r\n", output_value); //%02x(hex),%X(HEX) 
            sendString(lala);// send to Hyper-Terminal

        }
}

如何将msg[2]和msg[6]包含为两位数? 因为从上面的代码来看,我在写UI10-UI12的时候出现了问题,给出了错误的结果。

如果输入始终采用相同的格式,则使用起来很简单,例如strtok to split the input into the two parts, and then use strtol 将数字转换为整数。

也许是这样的:

char *start_string = strtok(msg, "-");
char *end_string = strtok(NULL, "-");

int start = strtol(start_string + 2, NULL, 10);
int end = strtol(end_string + 2, NULL, 10);