OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3626|回复: 7

关于串口发送的代码,不太理解,求指教

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-8-21 16:19:59 | 显示全部楼层 |阅读模式
5金钱
如题,有一个demo没有注释,关于这一段代码不是很理解,求指导~
  1. void UART1_Put_Char(unsigned char DataToSend)
  2. {
  3.         TxBuffer[count] = DataToSend;  
  4.         count++;
  5.   USART_ITConfig(USART3, USART_IT_TXE, ENABLE);  
  6. }

  7. void UART1_Put_String(unsigned char *Str)
  8. {
  9.         while(*Str)
  10.         {
  11.                 if(*Str=='\r')UART1_Put_Char(0x0d);
  12.                         else if(*Str=='\n')UART1_Put_Char(0x0a);
  13.                                 else UART1_Put_Char(*Str);
  14.                 Str++;
  15.         }
  16. }
复制代码


最佳答案

查看完整内容[请看2#楼]

// 我个人理解,与以下代码等效 void UART1_Put_Char(unsigned char DataToSend) { TxBuffer[count] = DataToSend; count++; USART_ITConfig(USART3, USART_IT_TXE, ENABLE); } void UART1_Put_String(unsigned char *Str) { while(*Str) { UART1_Put_Char(*Str); Str++; } } /* 这几句代码没有用, '\r' 就是 0X0d '\n' ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2020-8-21 16:20:00 | 显示全部楼层
本帖最后由 操作系统 于 2020-8-21 19:47 编辑

// 我个人理解,与以下代码等效

void UART1_Put_Char(unsigned char DataToSend)
{
        TxBuffer[count] = DataToSend;  
        count++;
  USART_ITConfig(USART3, USART_IT_TXE, ENABLE);  
}

void UART1_Put_String(unsigned char *Str)
{
        while(*Str)
        {
                UART1_Put_Char(*Str);
                Str++;
        }
}

/*    这几句代码没有用, '\r' 就是 0X0d   '\n' 就是 0X0a
if(*Str=='\r')UART1_Put_Char(0x0d);
else if(*Str=='\n')UART1_Put_Char(0x0a);


*/
回复

使用道具 举报

2

主题

460

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4530
金钱
4530
注册时间
2018-5-14
在线时间
966 小时
发表于 2020-8-22 09:31:08 | 显示全部楼层
    if(*Str=='\r')UART1_Put_Char(0x0d);
                        else if(*Str=='\n')UART1_Put_Char(0x0a);神一样的代码 '\r'在内存里就是0x0d,'\n'在内存里就是0x0A,while(*str)是因为字符串总是以'\0'结尾的,‘\0’在内存里面是0x00,那么当发送到字符串最后时会判断到0x00从而结束循环
回复

使用道具 举报

2

主题

460

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4530
金钱
4530
注册时间
2018-5-14
在线时间
966 小时
发表于 2020-8-22 09:38:52 | 显示全部楼层
姚先起 发表于 2020-8-22 09:31
if(*Str=='\r')UART1_Put_Char(0x0d);
                        else if(*Str=='\n')UART1_Put_Char(0 ...

而且这段代码特别的不严谨,如果说我调用代码这么写 ,char *string=(char*)malloc(sizeof(char)*20);
strcpy(string,"hello world");
UART1_Put_String(string);
free(string);
最后一下free操作就出问题了,因为string原始申请的地址比如是 0x2000000A,当运行了你这代码,地址就可能到了0x20000016,这时free肯定不成功。导致内存里多出很多野指针。
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2020-8-23 14:40:07 | 显示全部楼层
姚先起 发表于 2020-8-22 09:38
而且这段代码特别的不严谨,如果说我调用代码这么写 ,char *string=(char*)malloc(sizeof(char)*20);
st ...

额,你可能把形参,实参搞混了
形参变量,实参并未变,所以地址未改变,free还是OK的
#include <stdio.h>
#include <stdlib.h>

void aa(int *c)
{
        printf("22  %p\r\n", c);
        c++;
        printf("33  %p\r\n", c);
}

int main()
{
    int *c = (int *)malloc(10*sizeof(int));
    printf("11  %p\r\n", c);
        aa(c);
        printf("44  %p\r\n", c);
    free(c);
        return 0;
}

11  0x18d1260
22  0x18d1260
33  0x18d1264
44  0x18d1260
回复

使用道具 举报

2

主题

460

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4530
金钱
4530
注册时间
2018-5-14
在线时间
966 小时
发表于 2020-8-24 08:54:11 | 显示全部楼层
a5820736 发表于 2020-8-23 14:40
额,你可能把形参,实参搞混了
形参变量,实参并未变,所以地址未改变,free还是OK的
#include

好吧,我喜欢新建一个局部指针进行操作的,因为有的时候真出了bug的话,这么问题很难找。
回复

使用道具 举报

0

主题

26

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2020-8-25
在线时间
4 小时
发表于 2020-8-27 08:48:36 | 显示全部楼层
学习了,谢谢分享
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-9-29 15:23:27 | 显示全部楼层
坐看神仙打架,学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-6 01:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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