一种串口控制台(命令行)的实现
来源:互联网 发布:印欧语系 知乎 编辑:程序博客网 时间:2024/06/04 23:22
本串口控制台代码移植自鼎尚的LPC1788开发板程序,目标板是普中科技PZ6806L 单片机为stm32F103ZE。
源代码地址:http://download.csdn.net/download/wwddgod/9991282
移植过程如下:
步骤一:实现几个串口接收及发送的函数
#define SHELL_RCV_BUFFER_LEN 128
uint8_t g_shellRcvBuffer[SHELL_RCV_BUFFER_LEN];
uint32_t g_shellRcvBufferLen = 0;
uint8_t g_flagUart = 0;
unsigned long UART_snd(unsigned char * data, unsigned long len)
{
int32_t i, next;
if (len == 0)
{
len = 100;
}
USART_Cmd(USART1,DISABLE);
for (i = 0; i < len; i++)
{
next = g_uartTxBufferTail + 1;
if (next >= UART_Tx_BUFFER_LEN)
{
next = 0;
}
if (next == g_uartTxBufferHead)
{
break;
}
g_uartTxBuffer[g_uartTxBufferTail] = data[i];
g_uartTxBufferTail = next;
}
if (USART_GetFlagStatus(USART1,USART_FLAG_TXE)==SET)
{
USART_SendData(USART1, g_uartTxBuffer[g_uartTxBufferHead]);
g_uartTxBufferHead++;
if (g_uartTxBufferHead >= UART_Tx_BUFFER_LEN)
{
g_uartTxBufferHead = 0;
}
}
USART_Cmd(USART1,ENABLE);
return i;
}
__inline void uartRead(void)
{
uint8_t buffer;
buffer = USART_ReceiveData(USART1);
g_shellRcvBuffer[g_shellRcvBufferLen++] = buffer;
}
__inline void uartWrite(void)
{
uint16_t i;
if(g_uartTxBufferHead != g_uartTxBufferTail)
{
USART_SendData(USART1,g_uartTxBuffer[g_uartTxBufferHead]);
g_uartTxBufferHead++;
if (g_uartTxBufferHead >= UART_Tx_BUFFER_LEN)
{
g_uartTxBufferHead = 0;
}
}
}
extern unsigned int g_ms,gj_ms;
void USART1_IRQHandler(void)
{
static u8 k;
static unsigned int j_ms = 0;
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)
{
uartRead();
gj_ms = g_ms;
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}else if(USART_GetITStatus(USART1,USART_IT_TC)!=Bit_RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_TC);
uartWrite();
}
}
步骤二:添加shellTask.c 及shell.h
注意串口初始化时需要开启接收不为空中断 及 发送完成中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ITConfig(USART1,USART_IT_TC,ENABLE);
步骤三:在一个循环内实现函数 shellRcv(g_shellRcvBuffer, g_shellRcvBufferLen);如
while(1)
{
delay_ms(1);
g_ms +=1;
if(g_ms-gj_ms>3 && gj_ms !=0)
{
g_flagUart = 1;
gj_ms = 0;
}
if(g_flagUart == 1)
{
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
if (g_shellRcvBufferLen)
{
shellRcv(g_shellRcvBuffer, g_shellRcvBufferLen);
g_shellRcvBufferLen = 0;
}
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
g_flagUart = 0;
}
}
步骤四:使用shellRegCmd("dir", cmdDir, "dir list"); 注册命令: “dir” 为命令 cmdDir 对应的函数名 “dir list”为help显示的命令帮助信息
步骤五:shellSnd("->", 2); 可显示输出信息
- 一种串口控制台(命令行)的实现
- 一种STM32的串口控制台的实现(非常实用)
- 一种STM32的串口控制台的实现(非常实用)
- .Net Remoting 实现简易的"命令行控制台"聊天室
- ARM7通过串口实现液晶显示的一种方法(C语言)
- 一种灵活的方式实现win32串口通讯
- 串口波特率自动检测的一种工程实现:分段特征值匹配
- 命令行映射为内部函数调用的一种实现技巧
- 将LINUX的控制台定向到串口终端(转载)
- X Window 和控制台(命令行模式)的切换
- 串口控制台
- babun(一种window下的命令行工具)安装篇
- Net Remoting 实现简易的"命令行控制台"聊天室 选择自 playyuer 的 Blog
- 在控制台获得键盘输入的一种方法
- 从控制台输入的一种简单方法
- 一种更改控制台窗口大小的方法
- 有关串口获得控制台的问题
- linux下串口控制台的设置
- [Linux] Linux命令之pstree
- Bootstrap 怎么安装?and图片轮播
- 小小的第一步
- 最前沿的科学, 寻找最聪明的你—“宏基因组”公众号编辑招募
- 用U盘启动盘给Dell服务器装系统找不到RAID阵列解决办法
- 一种串口控制台(命令行)的实现
- 老生常谈:==与equals的区别
- Java的IO总结
- JZOJ5381. 【NOIP2017提高A组模拟9.21】传送蛋糕
- 异步方法的编写与使用
- 430单片机时钟系统与复位系统的配置(2)
- SQL查询的艺术学习笔记--存储过程与函数
- sublime 包安装及快捷键
- java主类结构-----包声明