OpenEdv-开源电子网

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

串口通信试验

[复制链接]

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
发表于 2017-1-8 17:42:22 | 显示全部楼层 |阅读模式
1金钱
我想把串口1的实验程序改编一下想试验一下串口2是不是能用,但是在串口1的基础上改编成串口2的程序用不了,出现不了我想要的实验现象,不知道这个问题怎么解决,麻烦大家帮我看看是怎么回事(我是把串口1的程序基础上改成串口2 的实验程序)

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
949
金钱
949
注册时间
2016-3-21
在线时间
114 小时
发表于 2017-1-8 18:08:01 | 显示全部楼层
回复

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
 楼主| 发表于 2017-1-8 21:29:42 | 显示全部楼层

void uart_init(u32 bound){

  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

       
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
       
       
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);


        USART_InitStructure.USART_BaudRate = bound;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        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);
       
  USART_Cmd(USART2, ENABLE);  //ê1Äü′®¿ú1
       
        //USART_ClearFlag(USART2, USART_FLAG_TC);
       
#if EN_USART2_RX       
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

       
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;               
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                       
        NVIC_Init(&NVIC_InitStructure);       
#endif
       
}


这是我写的串口2的程序但是现在运行不出来,可以给我看看是怎么回事吗?
回复

使用道具 举报

10

主题

83

帖子

0

精华

高级会员

Rank: 4

积分
949
金钱
949
注册时间
2016-3-21
在线时间
114 小时
发表于 2017-1-9 10:56:15 | 显示全部楼层
485还是232?原子的板子 还是自己的板子?
回复

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
 楼主| 发表于 2017-1-9 15:35:42 | 显示全部楼层
触电丶 发表于 2017-1-9 10:56
485还是232?原子的板子 还是自己的板子?

Stm32F407的板子,是源子的板子,我现在处于学习阶段,可以说我就是一个新手,刚开始接触单片机
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-1-9 16:06:08 | 显示全部楼层
串口2不行的,原子的407串口2接在SP485上,这个要流控,
回复

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
 楼主| 发表于 2017-1-9 16:12:54 | 显示全部楼层
enan 发表于 2017-1-9 16:06
串口2不行的,原子的407串口2接在SP485上,这个要流控,

你能给我解释一下吗?我没有太明白,意思是不是串口2到6都不能用啊?
回复

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
 楼主| 发表于 2017-1-9 16:13:53 | 显示全部楼层
qing8548329 发表于 2017-1-9 16:12
你能给我解释一下吗?我没有太明白,意思是不是串口2到6都不能用啊?

所有的串口我都试过了,只有1的好用,其他的都没有输出
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-1-9 16:22:09 | 显示全部楼层
qing8548329 发表于 2017-1-9 16:12
你能给我解释一下吗?我没有太明白,意思是不是串口2到6都不能用啊?

他那串口2貌似又连485又连232,有个跳线要跳,P9那个跳线,如果跳线在485就需要多初始化一个IO去控制流控
回复

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
 楼主| 发表于 2017-1-9 16:51:01 | 显示全部楼层
enan 发表于 2017-1-9 16:22
他那串口2貌似又连485又连232,有个跳线要跳,P9那个跳线,如果跳线在485就需要多初始化一个IO去控制流控

那我要是不用485,把跳线帽换在上面两个可以吗?
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-1-9 16:59:03 | 显示全部楼层
qing8548329 发表于 2017-1-9 16:51
那我要是不用485,把跳线帽换在上面两个可以吗?

换在上面就是232呀
回复

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
 楼主| 发表于 2017-1-9 17:02:36 | 显示全部楼层
enan 发表于 2017-1-9 16:59
换在上面就是232呀

对呀,就是相串口1 一样了,这样可以实现通信吗?
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-1-9 17:09:50 | 显示全部楼层
#include "usart2.h"

u8 USART2_Rec_Over_Flag = 0;
u16 USART2_Recv_Len = 0;
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN] = {0};

//初始化IO 串口2
//bound:波特率
void uart2_init(u32 bound)
{
   //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

        //串口3对应引脚复用映射
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2
       
        //USART2端口配置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2与GPIOA3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //速度50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
        GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA2,PA3

   //USART2 初始化设置
        USART_InitStructure.USART_BaudRate = bound;//波特率设置
        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); //初始化串口2
       
  USART_Cmd(USART2, ENABLE);  //使能串口2
       
        USART_ClearFlag(USART2, USART_FLAG_TC);
       

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

        //Usart2 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口2中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
}

//通用定时器3 中断初始化
//arr:自动重装值。  psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器 3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //①使能TIM3 时钟
   
   TIM_TimeBaseInitStructure.TIM_Period = arr;    //自动重装载值
  TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
  TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;   
   
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//  ②初始化定时器 TIM3
   
  TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //③允许定时器 3 更新中断
  TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位  
   
  NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3 中断
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级 1
  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //响应优先级 3
  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  NVIC_Init(&NVIC_InitStructure);//  ④初始化 NVIC   

//TIM_Cmd(TIM3,ENABLE); //⑤使能定时器 3   
}


//串口2中断函数
void USART2_IRQHandler(void)
{
        u8 Res;
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //判断RXNE接收中断标志是否等于0
        {
                Res = USART_ReceiveData(USART2);           //读数据
                if(USART2_Recv_Len<USART2_MAX_RECV_LEN)           //判断是否还能接收数据
                {
                        TIM_SetCounter(TIM3, 0);                //将定时器3的计数清0,又从0开始计数
                        if(USART2_Rec_Over_Flag == 0)TIM3_Set(1);        //如果没接收完数据就打开定时器3
                        USART2_RX_BUF[USART2_Recv_Len++] = Res;//把数据放入数组,注意住程序中处理完数据别忘了把USART2_Rec_Over_Flag置0
                }else{USART2_Rec_Over_Flag = 1;}
        }
}

//定时器打开关闭函数,实参1为开,0为关
void TIM3_Set(u8 sta)
{
        if(sta)
        {
                TIM_SetCounter(TIM3, 0);  //计数器3计数清零
                TIM_Cmd(TIM3, ENABLE);    //使能计数器
        }else{TIM_Cmd(TIM3, DISABLE);}  //失能计数器
}


//定时器3中断用于把接收完成标志USART2_Rec_Over_Flag置1
void TIM3_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //是否发生计数器2中断
                {
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清楚计数器中断
                        USART2_Rec_Over_Flag = 1;   //接收完成标志置1,注意主程序中处理完数据要把他置0
                        TIM3_Set(0);       //关闭定时器3
                }
}


/**********************************************************
*
*1,要发送的数组
*2,要发送的长度
**********************************************************/
void Usart2_Send_Data(u8 *buf,u16 len)
{
        u16 t;
          for(t=0;t<len;t++)                //循环发送数据
        {                  
                while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);        //等待发送完成
                USART_SendData(USART2,buf[t]);
        }         
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);                       

}
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-1-9 17:11:01 | 显示全部楼层
上面是我串口2的代码,其中使用了定时器3判断一帧数据是否接受完成
回复

使用道具 举报

37

主题

146

帖子

0

精华

高级会员

Rank: 4

积分
836
金钱
836
注册时间
2016-12-22
在线时间
165 小时
 楼主| 发表于 2017-1-9 17:13:59 | 显示全部楼层
enan 发表于 2017-1-9 17:11
上面是我串口2的代码,其中使用了定时器3判断一帧数据是否接受完成

加个定时器就可以解决485的问题吗?不需要换跳线帽的位置就可以了吧
回复

使用道具 举报

11

主题

216

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1124
金钱
1124
注册时间
2015-2-27
在线时间
485 小时
发表于 2017-1-9 17:18:06 | 显示全部楼层
这个定时器是来判断一帧数据有没有接受完,跟485没有关系,比如9600波特率一个字节传输大概需要1ms左右,我每接受到1个字节开定时器定3.5ms,接收到数据3.5ms后还没有接受到下一个数据就判断一帧数据接收完成,这是MODBUS协议要求的,你也可用不用
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 18:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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