OpenEdv-开源电子网

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

485通讯实验代码的两个疑问

[复制链接]

22

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2017-9-18
在线时间
42 小时
发表于 2018-4-16 12:37:44 | 显示全部楼层 |阅读模式
1金钱
void RS485_Init(u32 bound)
{  
    GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOG, ENABLE);//使能GPIOA,G时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                                 //PG9端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOG, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;        //PA2
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,ENABLE);//复位串口2
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART2,DISABLE);//停止复位

       
#ifdef EN_USART2_RX                          //如果使能了接收
        USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//8位数据长度
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;///奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式

        USART_Init(USART2, &USART_InitStructure); ; //初始化串口

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //使能串口2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先占优先级2级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级2级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

       USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断

       USART_Cmd(USART2, ENABLE);                    //使能串口


#endif

RS485_TX_EN=0;                        //默认为接收模式



}

void RS485_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=RS485_RX_CNT;
        u8 i=0;
        *len=0;                                //默认为0
        delay_ms(10);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
        if(rxlen==RS485_RX_CNT&&rxlen)//接收到了数据,且接收完成了
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=RS485_RX_BUF;       
                }               
                *len=RS485_RX_CNT;        //记录本次数据长度
                RS485_RX_CNT=0;                //清零
        }
}


1.蓝色部分,我觉得这里#ifdef和#endif之间应该只有中断的设置与开启,不应该包含串口的初始化和使能吧?要不然没定义串口读功能,串口写功能不也不能用了吗?
2.红色部分,我如果把*len改成len,就会报错variable "len" was set but never used。为什么这里一定要用指针作为入口参数才不报错?而且收到数据长度作为函数返还值不是更合理吗?

最佳答案

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

1.是的 2.*len改成len,那么这个参数有什么用?本来就是为了传递len出去的。RS485_RX_CNT应该在其他地方修改了。
普通人要怎么努力,才能超越勤奋的天才啊
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

199

帖子

0

精华

高级会员

Rank: 4

积分
711
金钱
711
注册时间
2017-5-20
在线时间
96 小时
发表于 2018-4-16 12:37:45 | 显示全部楼层
1.是的
2.*len改成len,那么这个参数有什么用?本来就是为了传递len出去的。RS485_RX_CNT应该在其他地方修改了。
回复

使用道具 举报

22

主题

73

帖子

0

精华

初级会员

Rank: 2

积分
164
金钱
164
注册时间
2017-9-18
在线时间
42 小时
 楼主| 发表于 2018-4-16 15:31:54 | 显示全部楼层
本帖最后由 aswsd 于 2018-4-16 15:36 编辑

谢谢回答,对于问题2我看了你的回答后又搜索了下,这里想实现的功能应该是在函数内部修改一个外部变量的值,
如果把它的值当作参数传递进去,函数内部变量只是复制了一份外部变量的值,无法通过修改内部变量来改变外部变量
必须以指针传递的方式来传入参数,这样就能在函数内部用“*len”的方式来改变外部变量值了
普通人要怎么努力,才能超越勤奋的天才啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 17:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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