pdshyh 发表于 2021-3-6 11:02:10

请教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:21

pdshyh 发表于 2021-3-6 13:52:35

矿坛铁粉 发表于 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:24:06

本帖最后由 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前面定义的是单个字符(不是字符串), 这个????

矿坛铁粉 发表于 2021-3-7 10:55:11

peiguoqing 发表于 2021-3-7 11:12:37

是不是强制转一下:
const char*s = (const char *)buf;
或把const char* s;
改成char* s;

iffi123 发表于 2021-3-7 12:32:29

peiguoqing 发表于 2021-3-7 11:12
是不是强制转一下:
const char*s = (const char *)buf;
或把const char* s;


如果是char buff, 可以直接赋值,这个例子,赋值时可以不类型转换(当然转换也不会报错)

pdshyh 发表于 2021-3-7 16:41:49

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个没有变化。因为有错误就没有输出结果。

pdshyh 发表于 2021-3-7 16:43:39

矿坛铁粉 发表于 2021-3-7 10:55
对于buf示例是char buf;运行后错误更多就改为char buf了
改之前是什么错误?

都没有出现x的错误,可能是运行错误。

pdshyh 发表于 2021-3-7 16:51:08

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:55:14

本帖最后由 iffi123 于 2021-3-7 16:57 编辑

pdshyh 发表于 2021-3-7 16:41
谢谢指教,STM32串口通信的USART1_printf函数等,没有c51那种底层驱动编写好理解,也没有前面示例,结构 ...

贴个原始的函数把, 不能自己改来该去的拿出来

再确保输入没有错误的情况下,再根据错误信息逐个排除,而不能私自改变原函数的功能, 比如不能把char buff随意改成char buff, 一个是字节数组变量,一个是单字节变量

pdshyh 发表于 2021-3-7 17:13:32

iffi123 发表于 2021-3-7 16:55
贴个原始的函数把, 不能自己改来该去的拿出来

再确保输入没有错误的情况下,再根据错误信息逐个排 ...

谢谢,您看是不是<STM32库开发实战指南>串口通信实例贴出来,我做的文件在附件谢谢。:handshake

矿坛铁粉 发表于 2021-3-7 17:24:51

iffi123 发表于 2021-3-7 17:34:47

本帖最后由 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警告,至于程序能否正常运行就不知道了, 以后自己检查吧!


peiguoqing 发表于 2021-3-7 17:46:37

pdshyh 发表于 2021-3-7 16:43
都没有出现x的错误,可能是运行错误。

你把build output 的错误信息,都粘贴的到帖子 里,看看哪些是警告waring,哪个是错误error
页: [1] 2
查看完整版本: 请教USART1_printf函数部分for(s=buf;*s;s++)错误修改