包含一个具有两位数值的字符

时间:2015-09-08 08:27:11

标签: c pic mplab

以下代码显示,检查硬件上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时出现问题,它会给出错误的结果。

1 个答案:

答案 0 :(得分:0)

如果输入始终采用相同的格式,则使用起来很简单,例如strtok将输入拆分为两部分,然后使用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);