矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2655|回复: 20

请教USART1_printf函数部分for(s=buf;*s;s++)错误修改

[复制链接]
     
发表于 2021-3-6 11:02:10 | 显示全部楼层 |阅读模式
跟着<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 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-3-6 13:52:35 | 显示全部楼层
矿坛铁粉 发表于 2021-3-6 11:11
这是编译错误不是运行错误,buf不是字符串求组或字符指针,代码贴出来看看

谢谢,是编译错误不是运行错误,第一次遇到只知道有错误就不能烧录 对于buf示例是char buf[16];运行后错误更多就改为char bu;了。
/*
*函数名:USART1_printf
*描述  :格式化输出,类似于C库中的printf,但这里没有调用C库
*输入  :USARTx 串口通道,这里只用到了串口1,即USART1
*        -Data 要发送到串口的内容指针
*      :-...  其它参数
*输出  :无
*返回  :无       
*调用  :外部调用USART1_printf(USART1,"\r\n this is a  demo \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 */
                                else  USART_SendData(USARTx,*Data++);
                                whil(USART_GatFlagStatus(USARTx,USART_FLAG_TC)==RESET);
                        }
                       
                       
                }
回复 支持 反对

使用道具 举报

     
发表于 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 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 2021-3-7 11:12:37 | 显示全部楼层
是不是强制转一下:
const char*  s = (const char *)buf;
或把  const char* s;
改成  char* s;
回复 支持 反对

使用道具 举报

     
发表于 2021-3-7 12:32:29 | 显示全部楼层
peiguoqing 发表于 2021-3-7 11:12
是不是强制转一下:
const char*  s = (const char *)buf;
或把  const char* s;

如果是char buff[10], 可以直接赋值,这个例子,赋值时可以不类型转换(当然转换也不会报错)
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 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[16];..... for(s=buf;*s;s++) 或者char buf;..... for(s=&buf;*s;s++)都是出现3个可能是运行错误,改为 char buf;..... for(s=buf;*s;s++) 或 char buf[16];..... for(s=&buf;*s;s++) 都是出现1个可能是运行错误,警示基本是8个没有变化。因为有错误就没有输出结果。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-3-7 16:43:39 | 显示全部楼层
矿坛铁粉 发表于 2021-3-7 10:55
对于buf示例是char buf[16];运行后错误更多就改为char buf了
改之前是什么错误?

都没有出现x的错误,可能是运行错误。
微信图片_20210307161300.png
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 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个错误。
回复 支持 反对

使用道具 举报

     
发表于 2021-3-7 16:55:14 | 显示全部楼层
本帖最后由 iffi123 于 2021-3-7 16:57 编辑
pdshyh 发表于 2021-3-7 16:41
谢谢指教,STM32串口通信的USART1_printf函数等,没有c51那种底层驱动编写好理解,也没有前面示例,结构 ...


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

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

使用道具 举报

     
 楼主| 发表于 2021-3-7 17:13:32 | 显示全部楼层
iffi123 发表于 2021-3-7 16:55
贴个原始的函数把, 不能自己改来该去的拿出来

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

谢谢,您看是不是<STM32库开发实战指南>串口通信实例贴出来,我做的文件在附件谢谢。
092548x03f9jgqsim0qm9y.png
092539i1fl4n618kg59mnp.png
092536emn6x3ccjinzzctu.png
092556yk5f96qm5kkj6pjq.png

USER.rar

23 KB, 下载次数: 18

回复 支持 反对

使用道具 举报

     
发表于 2021-3-7 17:24:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

     
发表于 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警告,至于程序能否正常运行就不知道了, 以后自己检查吧!
usart1.rar (2.39 KB, 下载次数: 11)

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2021-3-7 17:46:37 | 显示全部楼层
pdshyh 发表于 2021-3-7 16:43
都没有出现x的错误,可能是运行错误。

你把build output 的错误信息,都粘贴的到帖子 里,看看哪些是警告waring,哪个是错误error
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-4-28 09:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表