通信模块usart接收的封装

usart初始化

void usart_init(void)
{
  /* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);
    /* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0, 115200U);
   usart_parity_config(USART0, USART_PM_NONE);
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
  //usart_hardware_flow_rts_config(USART0, USART_RTS_ENABLE);
  //usart_hardware_flow_cts_config(USART0, USART_CTS_ENABLE);
  usart_data_first_config(USART0,USART_MSBF_LSB);
  usart_wakeup_mode_config(USART0,USART_WUM_RBNE);
  nvic_irq_enable(USART0_IRQn,0);
    usart_enable(USART0);
  usart_interrupt_enable(USART0, USART_INT_RBNE);
  usart_interrupt_enable(USART0, USART_INT_IDLE);
  usart_receiver_timeout_enable (USART0);
}

usart接收中断

void USART0_IRQHandler(void)
{
#if 1
 if(SET == usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE))
 {  
  recv_ch = usart_data_receive(USART0);
  receiver[receiver_num]=recv_ch;
  receiver_num++; 
  //usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE_ORERR);
//  if(strstr(receiver,"ERROR"))
//  {
//   memset(receiver,0,sizeof(receiver));
//   recevie_flag = 2;
//   receiver_num=0;
//  }
//判断接收计数是否超过上限
  if(receiver_num>=200)
  {
   memset(receiver,0,sizeof(receiver));
   recevie_flag = 2;
   receiver_num=0;
  }
 }
 //空闲中断
  else if(usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE) != RESET)
 {
  usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE);
  recevie_flag=1;
  temp_num=receiver_num;
  receiver_num=0;
 }
 // 是接收非空中断和溢出错误标志
 if(SET == usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE_ORERR))
 {
  usart_interrupt_flag_clear(USART0, USART_INT_FLAG_RBNE_ORERR);
  usart_flag_clear(USART0,USART_FLAG_ORERR);
 }
#endif
}

重点封装函数

void SendCmd(char* cmd, char* result, int timeOut)
{
 uint8_t i = 0;
 memset(receiver, 0, sizeof(receiver)); //发送数据之前,先清空接收数组,数据在串口中接收。
 receiver_num = 0;
 delay_1ms(timeOut);   
 for(i = 0;i < 5; i++)
 {                                      //延迟等待
   if(strstr(receiver,result)) //比较两个指针里面的数据是否一样,判断是否有预期的结果  和预期结果相同,表示指令设置成功,跳出
   {  
      //清空标志
           receiver_num=0;
     memset(receiver, 0, sizeof(receiver));
     break;
   }
   else
   {
     receiver_num = 0;
     memset(receiver, 0, sizeof(receiver));
     printf("%s",cmd);   //用串口把cmd命令写给gsm
     delay_1ms(timeOut);
   }
 }
}

main.c例子

  SendCmd("AT\r\n", "OK", 100);
  SendCmd("ATE0\r\n", "OK", 250);//关回显
  SendCmd("AT+CPIN\?\r\n", "OK", 250);
  SendCmd("AT+CGATT\?\r\n","1", 250);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
USART控制PWM输出是通过串行通信协议来控制产生PWM信号。PWM(Pulse Width Modulation,脉冲宽度调制)是一种调节信号占空比的方法,通过改变脉冲的高电平的宽度来控制输出信号的电平。 在USART控制PWM输出中,首先需要通过USART模块进行串行通信的配置。USART是一种用于串行通信的接口,可以实现与外部设备的数据传输。配置USART时,需要设置波特率、数据位数、校验位和停止位等参数,以确保通信的可靠性。 接下来,将PWM输出所需的频率和占空比数据通过USART发送给目标设备。通过USART的发送功能,可以将频率和占空比数据发送给控制PWM输出的设备。这些数据可以是预先定义好的或者由用户输入。发送的数据可以使用特定的协议进行封装,以便接收设备能够正确解析。 接收设备接收到通过USART发送的频率和占空比数据后,根据数据设定PWM输出的频率和占空比。接收设备需要解析接收到的数据,并从中提取频率和占空比的数值。然后,利用PWM模块设置频率和占空比的参数,以产生所需的PWM信号。 通过USART控制PWM输出可以实现远程控制和数据传输。通过与外部设备的通信,可以根据实际需求动态调整PWM输出的频率和占空比,实现对输出信号的精确控制。这对于一些需要频率和占空比变化的应用场景非常重要,比如电机速度控制和LED灯的亮度调节等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Quieeeet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值