error C2036: “void *”: 未知的大小

本文探讨了 C/C++ 中一个容易被忽视的语法特性:对未知尺寸类型的指针直接进行运算会导致编译错误。通过一个具体示例说明了解决这一问题的方法,并强调了指定数据类型的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如图:


解决办法

其实是 C/C++一个隐含的语法:“不允许对一个指向未知

尺寸类型(unknown size)的指针进行直接运算”


应该在指针前指定一个数据类型

例如

memcpy(buffer,(char*)pdata+size,len-size);


#include “Main.h” #include “stm32f10x_conf.h” #include “DataType.h” #include “NVIC.h” #include “SysTick.h” #include “RCC.h” #include “Timer.h” #include “UART1.h” #include “LED.h” #include “KeyOne.h” #include “ProcKeyOne.h” #include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> /********************************************************************************************************* 宏定义 / #define EXPRESSION_MAX_LEN 128 //长度 #define STACK_SISE 64 //栈的大小 / 内部变量 *********************************************************************************************************/ static char s_expr[EXPRESSION_MAX_LEN]={0 };//储存运算式 static float s_result=0.0f;//储存计算结果 static u8 s_has_expression=0;//是否有效运算式 static u8 s_calculated=0;//是否已计算 /********************************************************************************************************* 枚举结构体定义 / //预算优先级 typedef enum { PRIO_LOWEST=0,//最低 PRIO_ADD_SUB,//+,— PRIO_MUL_DIV,/// PRIO_HIGHEST//() }OpPriority; /* 内部函数声明 / static void InitSoftware(void); //初始化软件相关的模块 static void InitHardware(void); //初始化硬件相关的模块 static void Proc2msTask(void); //2ms处理任务 static void Proc1SecTask(void); //1s处理任务 static void clearExpression(void );//清空 static u8 AddToExpression(char c);//添加字符 static int GetPriority(char op);//获取优先级 static float Calculate(float a,float b,char op);//执行二元运算 static u8 EvaluateExpression(const charexpr,floatresult);//计算结果 /** 内部函数声明 / static void InitSoftware(void); //初始化软件相关的模块 static void InitHardware(void); //初始化硬件相关的模块 static void Proc2msTask(void); //2ms处理任务 static void Proc1SecTask(void); //1s处理任务 static void clearExpression(void );//清空 static u8 AddToExpression(char c);//添加字符 static int GetPriority(char op);//获取优先级 static float Calculate(float a,float b,char op);//执行二元运算 static u8 EvaluateExpression(const charexpr,floatresult);//计算结果 /** 内部函数实现 / / 函数名称:InitSoftware 函数功能:所有的软件相关的模块初始化函数都放在此函数中 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: / static void InitSoftware(void) { clearExpression();//初始化清空表达式 } / 函数名称:clearExpression 函数功能:清空 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: / static void clearExpression(void ) { memset (s_expr ,0,EXPRESSION_MAX_LEN ); s_has_expression =0; s_calculated =0; s_result =0.0f; } / 函数名称:AddToExpression 函数功能:添加字符 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ static u8 AddToExpression(char c) { u16 len =strlen (s_expr ); if(len >=EXPRESSION_MAX_LEN -1) { return 0; } if ((c >= ‘0’ && c <= ‘9’) || c == ‘+’ || c == ‘-’ || c == ‘*’ || c == ‘/’ || c == ‘(’ || c == ‘)’ || c == ‘.’) { s_expr[len] = c; s_has_expression = 1; s_calculated = 0; // 新输入后需要重新计算 return 1; } return 0; } /********************************************************************************************************* 函数名称:GetPriority 函数功能:获取优先级 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: / static int GetPriority(char op){ switch (op) { case’+': case ‘_’: return PRIO_ADD_SUB ; case '': case ‘/’: return PRIO_MUL_DIV ; case ‘(’: case ‘)’: return PRIO_HIGHEST ; default : return PRIO_LOWEST; } } /* 函数名称:Calcuate 函数功能:二元计算 输入参数:a,b,op 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *******************************************************************************************************/ static float Calculate(float a,float b,char op) { switch (op) { case ‘+’: return a+b; case ‘-’: return a-b; case '': return ab; case ‘/’: if(b==0) { printf ("error:除数不为0\n"); return 0.0f; } // return (float )((int)(a/b));//取整 default : return 0.0f; } } /********************************************************************************************************* 函数名称:EvaluateExpression 函数功能:计算结果 输入参数:expr result 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *******************************************************************************************************/ static u8 EvaluateExpression(const charexpr,floatresult) { float num_stack[STACK_SISE ];//数字栈 char op_stack[STACK_SISE];//运算符栈 int num_top=-1,op_top=-1;//栈顶 float num=0.0f; float decimal_factor=0.1f;//小数因子 u8 negative=0;//是否为负 if(!expr ||!result ) return 1; while (*expr ) { if(*expr ==' ') { expr++; continue; } if((*expr >='0'&&*expr<='9')||*expr=='.') { if(*expr=='.') { if(decimal_factor){ return 1;} num+=(*expr-'0')*decimal_factor; decimal_factor*=0.1f; expr ++; } else { // 处理负号 if (*expr == '-' && (expr || *(expr-1) == '(' || *(expr-1) == '+' || *(expr-1) == '-' || *(expr-1) == '*' || *(expr-1) == '/')) { negative = 1; expr++; continue; } //入栈 if (num_top < STACK_SISE- 1) { num_stack[++num_top] = negative ? ((-1)*num) : num; num = 0.0f; decimal_factor = 0.1f; negative = 0; } else { return 1; // 栈溢出 } // 处理右括号 if (*expr == ')') { float a,b; char op; while (op_top >= 0 && op_stack[op_top] != '(') { if (num_top < 1) return 1; // 操作数不足 b = num_stack[num_top--]; a = num_stack[num_top--]; op = op_stack[op_top--]; num_stack[++num_top] = Calculate(a, b, op); } if (op_top < 0) return 1; // 括号不匹配 op_top--; // 弹出左括号 expr++; } // 处理其他运算符 else { float b ,a; char op; while (op_top >= 0 && op_stack[op_top] != '(' && GetPriority(op_stack[op_top]) >= GetPriority(*expr)) { if (num_top < 1) return 1; // 操作数不足 b = num_stack[num_top--]; a = num_stack[num_top--]; op = op_stack[op_top--]; num_stack[++num_top] = Calculate(a, b, op); } if (op_top < STACK_SISE- 1) op_stack[++op_top] = *expr; else return 1; // 栈溢出 expr++; } } } // 处理剩余的数字 if (num_top < STACK_SISE- 1) { num_stack[++num_top] = negative ? ((-1)*num) : num; } else { return 1; // 栈溢出 } // 处理剩余的运算符 while (op_top >= 0) { float b,a; char op; if (op_stack[op_top] == ‘(’) return 1; // 括号不匹配 if (num_top < 1) return 1; // 操作数不足 b = num_stack[num_top--]; a = num_stack[num_top--]; op = op_stack[op_top--]; num_stack[++num_top] = Calculate(a, b, op); } if (num_top != 0) return 1; // 表达式错误 result = num_stack[0]; return 0; } return 0; } /******************************************************************************************************** 函数名称:ProcKeyDownKey1 函数功能: 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: / void ProcKeyDownKey1(void) { if (s_has_expression) { u8 ret = EvaluateExpression(s_expr, &s_result); if (ret == 0) { s_calculated = 1; printf(“\r\n计算完成,结果为: %.2f\r\n”, s_result); printf(“按KEY2发送结果,按KEY3清空\r\n”); } else { printf(“\r\n表达式错误,请重新输入\r\n”); s_calculated = 0; } } else { printf(“\r\n请先输入运算式\r\n”); } } / 函数名称:ProcKeyUpKey1 函数功能:处理按键弹起的事件,即按键弹起的响应函数 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ void ProcKeyUpKey1(void) { } /********************************************************************************************************* 函数名称:ProcKeyDownKey2 函数功能:处理按键按下的事件,即按键按下的响应函数 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: / void ProcKeyDownKey2(void) { if (s_calculated && s_has_expression) { char result_str[32]; sprintf(result_str, “\r\n计算结果: %.2f\r\n”, s_result); WriteUART1((u8)result_str, strlen(result_str)); } else if (s_has_expression) { printf(“\r\n请先按KEY1计算结果\r\n”); } else { printf(“\r\n请输入运算式\r\n”); } }/* 函数名称:ProcKeyUpKey2 函数功能:处理按键弹起的事件,即按键弹起的响应函数 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ void ProcKeyUpKey2(void) { } /********************************************************************************************************* 函数名称:ProcKeyDownKey1 函数功能:处理按键按下的事件,即按键按下的响应函数 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: / void ProcKeyDownKey3(void) { clearExpression(); printf(“\r\n已清空运算式,请重新输入\r\n”); } / 函数名称:ProcKeyUpKey3 函数功能:处理按键弹起的事件,即按键弹起的响应函数 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ void ProcKeyUpKey3(void) { }/********************************************************************************************************* 函数名称:main 函数功能:主函数 输入参数:void 输出参数:void 返 回 值:int 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ int main(void) { InitSoftware(); //初始化软件相关函数 InitHardware(); //初始化硬件相关函数 printf(“Init System has been finished.\r\n” ); //打印系统状态 while(1) { Proc2msTask(); //2ms处理任务 Proc1SecTask(); //1s处理任务 }//在keyone.c中 /********************************************************************************************************* 包含头文件 *********************************************************************************************************/ #include “KeyOne.h” #include “stm32f10x_conf.h” #include “Timer.h” /********************************************************************************************************* 宏定义 / / 枚举结构体定义 *********************************************************************************************************/ /********************************************************************************************************* 内部变量 / //按键按下时的电压,0xFF表示按下为高电平,0x00表示按下为低电平 static u8 s_arrKeyDownLevel[KEY_NAME_MAX]; //使用前要在InitKeyOne函数中进行初始化 / 内部函数声明 *********************************************************************************************************/ static void ConfigKeyOneGPIO(void);//配置按键的GPIO static void ConfigKeyOneGPIO(void ) { GPIO_InitTypeDef GPIO_InitStructure; //GPIO_InitStructure用于存放GPIO的参数 //使用RCC相关时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );//使能GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE );//使能GPIOC的时钟 //配置PC1 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1 ; //设置引脚 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //设置输入类型 GPIO_Init(GPIOC,&GPIO_InitStructure); //根据参数初始化GPIO //配置PC2 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2 ; //设置引脚 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //设置输入类型 GPIO_Init(GPIOC,&GPIO_InitStructure); //根据参数初始化GPIO //配置PA0 GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 ; //设置引脚 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; //设置输入类型 GPIO_Init(GPIOA,&GPIO_InitStructure); //根据参数初始化GPIO } /********************************************************************************************************* API函数实现 / / 函数名称: 函数功能: 输入参数: 输出参数: 返 回 值: 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ void InitKeyOne(void ) {ConfigKeyOneGPIO (); //配置按键的GPIO s_arrKeyDownLevel[KEY_NAME_KEY1]=KEY_DOWN_LEVEL_KEY1; //按键KEY1按下时为低电平 s_arrKeyDownLevel[KEY_NAME_KEY2]=KEY_DOWN_LEVEL_KEY2; //按键KEY2按下时为低电平 s_arrKeyDownLevel[KEY_NAME_KEY3]=KEY_DOWN_LEVEL_KEY3; //按键KEY3按下时为低电平 } /********************************************************************************************************* 函数名称:ScanKeyOne 函数功能:按键扫描,每10ms调用一次 输入参数:keyName-按键名,OnKeyOneUp-按键弹起响应函数指针,OnKeyOneDown-按键按下响应函数的指针 输出参数:viod 返 回 值:viod 创建日期:2018年01月01日 void ScanKeyOne(u8 keyName,void(*OnKeyOneUp)(void),void(*OnKeyOneDown)(void)) { static u8 s_arrKeyVal[KEY_NAME_MAX]; //定义一个u8类型的数组,用于存放按键的数值 static u8 s_arrKeyFlag[KEY_NAME_MAX]; //定义一个u8类型的数组,用于存放按键的标志位 s_arrKeyVal[keyName]=s_arrKeyVal[keyName] << 1; //左移一位 switch(keyName) { case KEY_NAME_KEY1: s_arrKeyVal[keyName]=s_arrKeyVal[keyName]|KEY1;//按下/弹起时,KEY1为0/1 break; case KEY_NAME_KEY2: s_arrKeyVal[keyName]=s_arrKeyVal[keyName]|KEY2;//按下/弹起时,KEY2为0/1 break; case KEY_NAME_KEY3: s_arrKeyVal[keyName]=s_arrKeyVal[keyName]|KEY3;//按下/弹起时,KEY3为0/1 break; default: break; } //按下标志位的值为TRUE时,判断是否有按键有效按下 if(s_arrKeyVal[keyName]==s_arrKeyDownLevel[keyName]&& s_arrKeyFlag[keyName]==TRUE) { (*OnKeyOneDown)(); //执行按键按下的响应函数 s_arrKeyFlag[keyName]=FALSE; //表示按键处于按下状态,按键标志位的值更改为FALSE } //按键标志位的值为FALSE时,判断是否有按键有效弹起 else if(s_arrKeyVal[keyName]==(u8)(~s_arrKeyDownLevel[keyName])&&s_arrKeyFlag[keyName]==FALSE) { (OnKeyOneUp)(); //执行按键弹起的响应函数 s_arrKeyFlag[keyName]=TRUE; //表示按键处于按下状态,按键标志位的值更改为TRUE } } /******************************************************************************************************** 包含头文件 *********************************************************************************************************/ #include “UART1.h” #include “stm32f10x_conf.h” #include “Queue.h” /********************************************************************************************************* 宏定义 *********************************************************************************************************/ /********************************************************************************************************* 枚举结构体定义 *********************************************************************************************************/ //串口发送状态 typedef enum { UART_STATE_OFF, //串口未发送数据 UART_STATE_ON, //串口正在发送数据 UART_STATE_MAX }EnumUARTState; /********************************************************************************************************* 内部变量 *********************************************************************************************************/ static StructCirQue s_structUARTSendCirQue; //发送串口循环队列 static StructCirQue s_structUARTRecCirQue; //接收串口循环队列 static u8 s_arrSendBuf[UART1_BUF_SIZE]; //发送串口循环队列的缓冲区 static u8 s_arrRecBuf[UART1_BUF_SIZE]; //接收串口循环队列的缓冲区 static u8 s_iUARTTxSts; //串口发送数据状态 /********************************************************************************************************* 内部函数声明 *********************************************************************************************************/ static void InitUARTBuf(void); //初始化串口缓冲区,包括发送缓冲区和接收缓冲区 static u8 WriteReceiveBuf(u8 d); //将接收到的数据写入接收缓冲区 static u8 ReadSendBuf(u8 *p); //读取发送缓冲区中的数据 static void ConfigUART(u32 bound); //配置串口相关的参数,包括GPIO、RCC、USART和NVIC static void EnableUARTTx(void); //使能串口发送,WriteUARTx中调用,每次发送数据之后需要调用 static void SendCharUsedByFputc(u16 ch); //发送字符函数,专由fputc函数调用 /********************************************************************************************************* 内部函数实现 / / 函数名称:InitUARTBuf 函数功能:初始化串口缓冲区,包括发送缓冲区和接收缓冲区 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ static void InitUARTBuf(void) { i16 i; for(i = 0; i < UART1_BUF_SIZE; i++) { s_arrSendBuf[i] = 0; s_arrRecBuf[i] = 0; } InitQueue(&s_structUARTSendCirQue, s_arrSendBuf, UART1_BUF_SIZE); InitQueue(&s_structUARTRecCirQue, s_arrRecBuf, UART1_BUF_SIZE); } /********************************************************************************************************* 函数名称:WriteReceiveBuf 函数功能:写数据到串口接收缓冲区 输入参数:d,待写入串口接收缓冲区的数据 输出参数:void 返 回 值:写入数据成功标志,0-不成功,1-成功 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ static u8 WriteReceiveBuf(u8 d) { u8 ok = 0; //写入数据成功标志,0-不成功,1-成功 ok = EnQueue(&s_structUARTRecCirQue, &d, 1); return ok; //返回写入数据成功标志,0-不成功,1-成功 } /********************************************************************************************************* 函数名称:ReadSendBuf 函数功能:读取串口发送缓冲区中的数据 输入参数:p,读出来的数据存放的首地址 输出参数:p,读出来的数据存放的首地址 返 回 值:读取数据成功标志,0-不成功,1-成功 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ static u8 ReadSendBuf(u8 *p) { u8 ok = 0; //读取数据成功标志,0-不成功,1-成功 ok = DeQueue(&s_structUARTSendCirQue, p, 1); return ok; //返回读取数据成功标志,0-不成功,1-成功 } /********************************************************************************************************* 函数名称:ConfigUART 函数功能:配置串口相关的参数,包括GPIO、RCC、USART和NVIC 输入参数:bound,波特率 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ static void ConfigUART(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; //GPIO_InitStructure用于存放GPIO的参数 USART_InitTypeDef USART_InitStructure; //USART_InitStructure用于存放USART的参数 NVIC_InitTypeDef NVIC_InitStructure; //NVIC_InitStructure用于存放NVIC的参数 //使能RCC相关时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //使能USART1的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIOA的时钟 //配置TX的GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //设置TX的引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //设置TX的模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置TX的I/O口输出速度 GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化TX的GPIO //配置RX的GPIO GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //设置RX的引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置RX的模式 GPIO_Init(GPIOA, &GPIO_InitStructure); //根据参数初始化RX的GPIO //配置USART的参数 USART_StructInit(&USART_InitStructure); //初始化USART_InitStructure USART_InitStructure.USART_BaudRate = bound; //设置波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //设置数据字长度 USART_InitStructure.USART_StopBits = USART_StopBits_1; //设置停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //设置奇偶校验位 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //设置模式 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //设置硬件流控制模式 USART_Init(USART1, &USART_InitStructure); //根据参数初始化//使能USART1及其中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //使能接收缓冲区非空中断 USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送缓冲区空中断 USART_Cmd(USART1, ENABLE); //使能USART1 s_iUARTTxSts = UART_STATE_OFF; //串口发送数据状态设置为未发送数据 } /********************************************************************************************************* 函数名称:EnableUARTTx 函数功能:使能串口发送,在WriteUARTx中调用,即每次发送数据之后需要调用这个函数来使能发送中断 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意:s_iUARTTxSts = UART_STATE_ON;这句话必须放在USART_ITConfig之前,否则会导致中断打开无法执行 *********************************************************************************************************/ static void EnableUARTTx(void) { s_iUARTTxSts = UART_STATE_ON; //串口发送数据状态设置为正在发送数据 USART_ITConfig(USART1, USART_IT_TXE, ENABLE); //使能发送中断 } /********************************************************************************************************* 函数名称:SendCharUsedByFputc 函数功能:发送字符函数,专由fputc函数调用 输入参数:ch,待发送的字符 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ static void SendCharUsedByFputc(u16 ch) { USART_SendData(USART1, (u8)ch); //等待发送完毕 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } /********************************************************************************************************* 函数名称:USART1_IRQHandler 函数功能:USART1中断服务函数 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ void USART1_IRQHandler(void) { u8 uData = 0; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收缓冲区非空中断 { NVIC_ClearPendingIRQ(USART1_IRQn); //清除USART1中断挂起 uData = USART_ReceiveData(USART1); //将USART1接收到的数据保存到uData WriteReceiveBuf(uData); //将接收到的数据写入接收缓冲区 } if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) == SET) //溢出错误标志为1 { USART_ClearFlag(USART1, USART_FLAG_ORE); //清除溢出错误标志 USART_ReceiveData(USART1); //读取USART_DR } if(USART_GetITStatus(USART1, USART_IT_TXE)!= RESET) //发送缓冲区空中断 { USART_ClearITPendingBit(USART1, USART_IT_TXE); //清除发送中断标志 NVIC_ClearPendingIRQ(USART1_IRQn); //清除USART1中断挂起 ReadSendBuf(&uData); //读取发送缓冲区的数据到uData USART_SendData(USART1, uData); //将uData写入USART_DR if(QueueEmpty(&s_structUARTSendCirQue)) //当发送缓冲区为空时 { /********************************************************************************************************* API函数实现 / / 函数名称:InitUART1 函数功能:初始化UART模块 输入参数:bound,波特率 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ void InitUART1(u32 bound) { InitUARTBuf(); //初始化串口缓冲区,包括发送缓冲区和接收缓冲区 ConfigUART(bound); //配置串口相关的参数,包括GPIO、RCC、USART和NVIC } /********************************************************************************************************* 函数名称:WriteUART1 函数功能:写串口,即写数据到的串口发送缓冲区 输入参数:pBuf,要写入数据的首地址,len,期望写入数据的个数 输出参数:void 返 回 值:成功写入数据的个数,不一定与形参len相等 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ u8 WriteUART1(u8 *pBuf, u8 len) { u8 wLen = 0; //实际写入数据的个数 wLen = EnQueue(&s_structUARTSendCirQue, pBuf, len); if(wLen < UART1_BUF_SIZE) { if(s_iUARTTxSts == UART_STATE_OFF) { EnableUARTTx(); } } return wLen; //返回实际写入数据的个数 } /********************************************************************************************************* 函数名称:ReadUART1 函数功能:读串口,即读取串口接收缓冲区中的数据 输入参数:pBuf,读取的数据存放的首地址,len,期望读取数据的个数 输出参数:pBuf,读取的数据存放的首地址 返 回 值:成功读取数据的个数,不一定与形参len相等 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ u8 ReadUART1(u8 *pBuf, u8 len) { u8 rLen = 0; //实际读取数据长度 rLen = DeQueue(&s_structUARTRecCirQue, pBuf, len); return rLen; //返回实际读取数据的长度 } /********************************************************************************************************* 函数名称:fputc 函数功能:重定向函数 输入参数:ch,f 输出参数:void 返 回 值:int 创建日期:2018年01月01日 注 意: ********************************************************************************************************/ int fputc(int ch, FILE f) { SendCharUsedByFputc((u8) ch); //发送字符函数,专由fputc函数调用 return ch; //返回ch } /********************************************************************************************************* 包含头文件 / #include “ProcKeyOne.h” #include “UART1.h” / 函数名称:InitProcKeyOne 函数功能:初始化ProcKryOne模块 输入参数:void 输出参数:void 返 回 值:void 创建日期:2018年01月01日 注 意: *********************************************************************************************************/ void InitProcKeyOne(void) { }以此代码为主题,定义名称不变完成简易计算机的设计
最新发布
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值