Shell环境下的方向键输入与解析

一、方向键输入

在Shell环境下,方向键输入为3个字节,其键值对应分别为:

ASCII码
^[[A
^[[B
^[[D
^[[C

其中,

字符HEX解释
^[0x1BESC键
[0x58开方括号
A0x41大写A
B0x42大写B
C0x43大写C
D0x44大写D

二、方向键解析

解析应分三步进行:

  1. 读取^[,即0x1B
  2. 读取[,即0x58
  3. 读取A/B/C/D

三、代码实现

typedef enum
{
    CONTROL_FREE = 0,
    CONTROL_STEP_ONE,
    CONTROL_STEP_TWO,
} CONTROL_Status;

static CONTROL_Status controlFlag = CONTROL_FREE;

switch(receiveData)
    case 0x1B: // ESC
        controlFlag = CONTROL_STEP_ONE;
        break;
    default:
        switch ((uint8_t)controlFlag)
        {
        case CONTROL_STEP_TWO:
            if (receiveData == 0x41) // 方向上键
            {

                shellBackspace(shellCommandIndex);
                if (shellHistoryOffset-- <= -((shellHistoryCount > shellHistoryFlag)
                                                  ? shellHistoryCount
                                                  : shellHistoryFlag))
                {
                    shellHistoryOffset = -((shellHistoryCount > shellHistoryFlag)
                                               ? shellHistoryCount
                                               : shellHistoryFlag);
                }
                shellCommandIndex = shellStringCopy((char *)shellCommandBuff,
                                                    (const char *)shellHistoryCommand[(shellHistoryFlag + SHELL_HISTORY_MAX_NUMBER + shellHistoryOffset) % SHELL_HISTORY_MAX_NUMBER]);
                Serial.print((const char *)shellCommandBuff);
            }
            else if (receiveData == 0x42) // 方向下键
            {

                if (++shellHistoryOffset >= 0)
                {
                    shellHistoryOffset = -1;
                    break;
                }
                shellBackspace(shellCommandIndex);
                shellCommandIndex = shellStringCopy((char *)shellCommandBuff,
                                                    (const char *)shellHistoryCommand[(shellHistoryFlag + SHELL_HISTORY_MAX_NUMBER + shellHistoryOffset) % SHELL_HISTORY_MAX_NUMBER]);
                Serial.print((const char *)shellCommandBuff);
            }
            else if (receiveData == 0x43) // 方向右键
            {
                // Serial.print("right\r\n");
            }
            else if (receiveData == 0x44) // 方向左键
            {
                // Serial.print("left\r\n");
            }
            else
            {
                controlFlag = CONTROL_FREE;
                goto normal;
            }
            break;

        case CONTROL_STEP_ONE:
            if (receiveData == '[') // 0x58
            {
                controlFlag = CONTROL_STEP_TWO;
            }
            else
            {
                controlFlag = CONTROL_FREE;
                goto normal;
            }
            break;

        case CONTROL_FREE: // 正常按键处理
        normal:
            if (shellCommandIndex < SHELL_COMMAND_MAX_LENGTH - 1)
            {
                shellCommandBuff[shellCommandIndex++] = receiveData;
                Serial.write(receiveData);
            }
            else
            {
                shellCommandIndex++;
                Serial.write(receiveData);
            }
            break;
        }
        break;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值