当前位置: 首页 > news >正文

玩转单片机之智能车小露——通过UART为单片机增加TTY终端

单片机只能使用按键与程序进行交互吗?有时候限于单片机有限的引脚,没有多余的IO口设计按键以实现不同的功能,这时候怎么办?
最简单的是使用UART与PC进行通信,这样PC上的键盘就可以变成控制单片机最灵活的工具。本文实现稍复杂但是炫酷的UART通信交互功能,类似于电脑Shell程序,通过字符串传递命令和参数,比如可以这样(默认实现测试命令):
串口发送:echo hello,world!
串口接收:hello,world!

串口初始化及命令字符串接收

直接使用单片机ISP串口,波特率设置稍高一些避免通信时间过长。
SystickCallbackUART1函数负责检测通信数据流是否结束,并打上结束标记。

void TTYInit(void){GPIO_InitTypeDef gpio;COMx_InitDefine com1;gpio.Pin = GPIO_Pin_0|GPIO_Pin_1;gpio.Mode = GPIO_PullUp;GPIO_Inilize(GPIO_P3,&gpio);com1.UART_Mode = UART_8bit_BRTx;com1.UART_BRT_Use = BRT_Timer1;com1.UART_BaudRate = 115200ul;com1.UART_RxEnable = ENABLE;com1.BaudRateDouble = DISABLE;UART_Configuration(UART1,&com1);NVIC_UART1_Init(ENABLE,Priority_1);UART1_SW(UART1_SW_P30_P31);
}//UART1 systick callback(10ms)
void SystickCallbackUART1(void){if(--COM1.RX_TimeOut < 1){RX1_Buffer[COM1.RX_Cnt] = '\0';COM1.RX_Cnt = 0;			//UART1 timeout reset RX_CntTTYsig = TRUE;}
}

串口命令行参数分割与解析

串口命令行默认格式为:cmd arg0 arg1 arg2 arg3 arg4各参数以空格区分,支持1个命令加最多5个参数,TTYArgPhase函数负责分割这些字符串命令和参数。

unsigned char *pTTYCmd;
unsigned char *pTTYArg[5];//tty 命令行解析与参数分割
unsigned char TTYArgPhase(void){unsigned char i = 0;char *str = RX1_Buffer;if(*str == ' ' || *str == '\0')return FALSE;pTTYCmd = str;while(*str != '\0' || i > 4){str++;if(*str == ' '){*str = '\0';pTTYArg[i++] = ++str;}}return TRUE;
}

命令解析并转换为函数调用

在定时器(500ms)中判断是否有新的命令,并解析命令并转调真正的功能函数并根据函数传递正确的参数类型。

unsigned char TTYsig,TTYInfork;void TTYFork(void){TTYsig = FALSE;if(TTYArgPhase() == FALSE)return;if(strcmp(pTTYCmd,"echos") == 0 && pTTYArg[0] != NULL)TTYEchoString(pTTYArg[0]);if(strcmp(pTTYCmd,"echon") == 0 && pTTYArg[0] != NULL)TTYEchoNumber(atoi(pTTYArg[0]));if(strcmp(pTTYCmd,"echot") == 0)TTYEchoTime();// TODO: 在此处添加用户代码if(strcmp(pTTYCmd,"exit") == 0){TTYechot = FALSE;}*pTTYCmd = NULL;		//目前由输入者确保参数正确性*pTTYArg[0] = NULL;*pTTYArg[1] = NULL;*pTTYArg[2] = NULL;*pTTYArg[3] = NULL;*pTTYArg[4] = NULL;
}//Systick callback 500s
void SystickCallbackTTY(void){if(TTYsig == TRUE)TTYFork();
}

可命令行执行函数的设计

命令行可执行函数可以设计为两类,一类是单次执行的,执行完成后即可退出,如echosechon
另一类需要执行运行,直到命令行收到退出命令exit后退出,如echot,真正的动作仍然需要在特定的定时函数里执行。

unsigned char TTYechot;//tty 字符回显函数
void TTYEchoString(char *str){printf(str);
}//tty 数字回显函数
void TTYEchoNumber(int num){printf("%hd",num);
}//tty 循环显示开机运行时间
void TTYEchoTime(void){TTYechot = TRUE;		//接收"exit"后复位
}//Systick callback 1s
void SystickCallbackTTYEchot(void){if(TTYechot == TRUE)printf("Running time(s):%ld",systick);
}

实战例程:七彩呼吸灯控制

以 玩转单片机之智能车小露——七彩LED呼吸灯 为例,编写命令行控制函数还不是手到擒来?

//颜色字符串转换为整形
unsigned char ctoi(char *str){if(strcmp(str,"red") == 0)return BLED_COLOR_RED;if(strcmp(str,"orange") == 0)return BLED_COLOR_ORANGE;if(strcmp(str,"yellow") == 0)return BLED_COLOR_YELLOW;if(strcmp(str,"green") == 0)return BLED_COLOR_GREEN;if(strcmp(str,"cyan") == 0)return BLED_COLOR_CYAN;if(strcmp(str,"blue") == 0)return BLED_COLOR_BLUE;if(strcmp(str,"purple") == 0)return BLED_COLOR_PURPLE;if(strcmp(str,"white") == 0)return BLED_COLOR_WHITE;return BLED_COLOR_OFF;
}//模式字符串转换为整形
unsigned char mtoi(char *str){if(strcmp(str,"single") == 0)return BLED_MODE_SINGLE;if(strcmp(str,"color") == 0)return BLED_MODE_COLOR;return BLED_MODE_OFF;
}void TTYFork(void){。。。if(strcmp(pTTYCmd,"bledon") == 0 && pTTYArg[0] != NULL)BLEDTurnOn(ctoi(pTTYArg[0]));if(strcmp(pTTYCmd,"bleddisplaycolor") == 0 && pTTYArg[0] != NULL && pTTYArg[1] != NULL && pTTYArg[2] != NULL)BLEDDisplayColor((unsigned char)atoi(pTTYArg[0]),(unsigned char)atoi(pTTYArg[1]),(unsigned char)atoi(pTTYArg[2]));if(strcmp(pTTYCmd,"bledbreath") == 0 && pTTYArg[0] != NULL && pTTYArg[1] != NULL)BLEDBreath(mtoi(pTTYArg[0]),ctoi(pTTYArg[1]));if(strcmp(pTTYCmd,"bledoff") == 0)BLEDTurnOff();。。。
}
  • 本文采用的单片机为STC32G系列,感兴趣的朋友可以参考测试,或去Gitee上下载例程。
  • 下载地址:https://gitee.com/loganxiang/lgxsmartcar ,参考tty.h/tty.c。
http://www.hskmm.com/?act=detail&tid=38960

相关文章:

  • mysql数据库学习之用户权限管理(四) - 实践
  • 2025超纯水推荐品牌,哪个品牌口碑好?
  • 五笔练习
  • cnbook主题风格美化 —— 01(未完成)
  • 2025 年热镀锌方管立柱制造厂家最新推荐榜,技术实力与市场口碑深度解析佛山/顺德/广州薄壁/异形/Q235厂家推荐
  • 【嵌入式】IIC和SPI的比较
  • session、cookie、token的区别
  • AppSec与事件响应的融合实践
  • 权威调研榜单:电磁加热器厂家TOP3榜单好评深度解析
  • CSP-S模拟39 ( 2025多校冲刺CSP模拟赛8 )
  • 2025年市面上双曲铝单板品牌、行业内双曲铝单板厂家、市场双曲铝单板产品、目前双曲铝单板供应商、口碑好的双曲铝单板公司排行榜
  • 2025市面上双曲铝单板品牌、行业内双曲铝单板厂家、市场双曲铝单板产品、口碑好的双曲铝单板厂家、2025年双曲铝单板供应商权威排名
  • 2025市面上双曲铝单板品牌、行业内双曲铝单板生产厂家、市场双曲铝单板供应厂家、目前双曲铝单板实力厂家、口碑好的双曲铝单板公司排行榜
  • 2025 年调直机厂家最新推荐排行榜权威发布:聚焦伺服 / 高速 / 铁线 / 扁铁机型,揭秘行业优质企业
  • 2025年10月导电炭黑厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析
  • 全新的图形化AI编程软件——aily blockly公测来咯
  • CF1984E
  • 2025年市面上美国留学品牌、口碑好的美国留学产品、2025年美国留学渠道商、评价高的美国留学服务商、美国留学品牌推荐榜综合评测
  • 2025年市面上美国留学品牌、2025年美国留学品牌、口碑好的美国留学品牌、热门的美国留学品牌、美国留学品牌推荐榜深度评测
  • gu
  • 2025 年导电炭黑厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析
  • docker 端口映射
  • L07_2
  • C语言基础补全
  • 「学习笔记」PHP 基础
  • 2025 建筑陶粒厂家最新推荐榜:回填 / 粘土 / 滤料 / 混凝土等多品类优选,实力企业权威测评推荐!
  • 251025
  • 2025 年最新地磅制造厂家推荐排行榜:聚焦品质创新服务,助力企业精准选优质地磅汽车衡 / 大型 / 可移动 / 100 吨 / SCS 型 / 自动称重地磅推荐
  • 关于我:新的开始,新的记录
  • 关于 NoiLinux 系统和 CodeBlocks 的考场使用