请教USART1_printf函数部分for(s=buf;*s;s++)错误修改
跟着<STM32库开发实战指南>串口通信实例学习,USART1_printf函数部分for(s=buf;*s;s++)运行出现错误 usart1.c(194): error:#513: a value of type "char" cannot be assigned to an entity of type "const char *"翻译#513:不能将“char”类型的值赋给“const char*类型的实体”,这个错误怎么改,请教解惑谢谢! 矿坛铁粉 发表于 2021-3-6 11:11这是编译错误不是运行错误,buf不是字符串求组或字符指针,代码贴出来看看
谢谢,是编译错误不是运行错误,第一次遇到只知道有错误就不能烧录:L 对于buf示例是char buf;运行后错误更多就改为char bu;了。
/*
*函数名:USART1_printf
*描述:格式化输出,类似于C库中的printf,但这里没有调用C库
*输入:USARTx 串口通道,这里只用到了串口1,即USART1
* -Data 要发送到串口的内容指针
* :-...其它参数
*输出:无
*返回:无
*调用:外部调用USART1_printf(USART1,"\r\n this is ademo \r\n");
* USART1_printf(USART1,"\r\n %d \r\n",i);
* USART1_printf(USART1,"\r\n %s \r\n",j);
*/
void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
const char *s;
int d;
char buf;
va_list ap;
va_start(ap,Data);
while(*Data !=0)//判断是否到达字符串结束符
{
if(*Data==0x5c)// '\'
{
switch( *++Data)
{
case 'r': //回车符
USART_SendData(USARTx,0x0d);
Data ++;
break;
case 'n': //换行符
USART_SendData(USARTx,0x0a);
Data ++;
break;
default:
Data ++;
break;
}
}
else if(*Data=='%')
{
switch( *++Data)
{
case 's': //字符串
s=va_arg(ap,const char *);
for(;*s ;s++)
{
USART_SendData(USARTx,*s);
whil(USART_GatFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}
Data ++;
break;
case 'd': //十进制
d =va_arg(ap,int);
intoa(d,buf,10);
for(s=buf;*s;s++)
{
USART_SendData(USARTx,*s);
whil(USART_GatFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}
Data ++;
break;
default:
Data ++;
break;
}
}
/* end of else if */
elseUSART_SendData(USARTx,*Data++);
whil(USART_GatFlagStatus(USARTx,USART_FLAG_TC)==RESET);
}
}
本帖最后由 iffi123 于 2021-3-6 20:41 编辑
你看前面的定义
const char *s;
char buf;
变量s是个指针,它指向常量字符(实际是8位的int)
而buf是个字符变量
2者性质不同,当然不能把buf直接赋值给s,给s赋值需要一个地址,不是变量的值, 所以应该是s=&buf;
for(s=buf;*s;s++) 循环体的意思是把buf开始的字符串一个个发送出来,直到碰到0为止, 但是buf前面定义的是单个字符(不是字符串), 这个???? 是不是强制转一下:
const char*s = (const char *)buf;
或把const char* s;
改成char* s; peiguoqing 发表于 2021-3-7 11:12
是不是强制转一下:
const char*s = (const char *)buf;
或把const char* s;
如果是char buff, 可以直接赋值,这个例子,赋值时可以不类型转换(当然转换也不会报错) iffi123 发表于 2021-3-6 20:24
你看前面的定义
const char *s;
char buf;
谢谢指教,STM32串口通信的USART1_printf函数等,没有c51那种底层驱动编写好理解,也没有前面示例,结构体函数等设置理解为像c51那种底层驱动编写好的函数把参数设定好用就行了也好理解。
char buf;..... for(s=buf;*s;s++) 部分修改为 char buf;..... for(s=buf;*s;s++) 或者char buf;..... for(s=&buf;*s;s++)都是出现3个可能是运行错误,改为 char buf;..... for(s=buf;*s;s++) 或 char buf;..... for(s=&buf;*s;s++) 都是出现1个可能是运行错误,警示基本是8个没有变化。因为有错误就没有输出结果。 矿坛铁粉 发表于 2021-3-7 10:55
对于buf示例是char buf;运行后错误更多就改为char buf了
改之前是什么错误?
都没有出现x的错误,可能是运行错误。 peiguoqing 发表于 2021-3-7 11:12
是不是强制转一下:
const char*s = (const char *)buf;
或把const char* s;
谢谢指教,把const char* s;改成char* s;错误还是有。
强制转一下:const char*s = (const char *)buf;
for(s=buf;*s;s++)
还是1个错误。 本帖最后由 iffi123 于 2021-3-7 16:57 编辑
pdshyh 发表于 2021-3-7 16:41
谢谢指教,STM32串口通信的USART1_printf函数等,没有c51那种底层驱动编写好理解,也没有前面示例,结构 ...
贴个原始的函数把, 不能自己改来该去的拿出来
再确保输入没有错误的情况下,再根据错误信息逐个排除,而不能私自改变原函数的功能, 比如不能把char buff随意改成char buff, 一个是字节数组变量,一个是单字节变量 iffi123 发表于 2021-3-7 16:55
贴个原始的函数把, 不能自己改来该去的拿出来
再确保输入没有错误的情况下,再根据错误信息逐个排 ...
谢谢,您看是不是<STM32库开发实战指南>串口通信实例贴出来,我做的文件在附件谢谢。:handshake 本帖最后由 iffi123 于 2021-3-7 18:09 编辑
pdshyh 发表于 2021-3-7 17:13
谢谢,您看是不是串口通信实例贴出来,我做的文件在附件谢谢。
学单片机要耐心啊, 学习别人的程序,拼写正确是第一步,出现提示各种未定义“declared implicitly”,为啥不先检查下?(英文不大好?)
while你还写成whil,前面已经有人给你指出过,
USART_GetFlagStatus写成USART_GatFlagStatus,
把 itoa(d,buf,10)写成 intoa(d,buf,10);
改后的usart1.c和usart1.h,在我这里编译0错误0警告,至于程序能否正常运行就不知道了, 以后自己检查吧!
pdshyh 发表于 2021-3-7 16:43
都没有出现x的错误,可能是运行错误。
你把build output 的错误信息,都粘贴的到帖子 里,看看哪些是警告waring,哪个是错误error
页:
[1]
2