Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4263201
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-06-25 15:34:46

工程代码:最终版: 11_usart1中断接收_最终版.rar  

上位机: 串口调试器
 COMME DEBUGER.rar  

实现功能: 上位机输入比如:#00123456# 表示我们要传给 M3的值是00123456,但是传输的是 assic码,我们对每次传输 的值进行操作,得到最后的val

串口调试器说明:
    发送: “按16进制显示或发送” 没有选上
    接收: “按16进制显示” 没有选上

当发送 123456 时,按下 发送 这个键 其实是这样一个过程:
    1.首先发送 1 ,然后中断, M3接收
    2. 然后发送 2, 中断, M3接收
    3. 如此循环

  1. int main()
  2. {    
  3.     RCC_Configuration();
  4.     delay_init();
  5.     LED_Init();
  6.     USART1_GPIO_Configuration();
  7.     USART1_Configuration();
  8.     USART1_NVIC_Configuration();

  9.     while(1);
  10.     return 0;
  11. }

  12. /*串口协议
  13.  最大发送 99MHZ
  14.  如:
  15.  #12345678# //没有考虑效率,仅仅实现功能
  16.  一共 10 位
  17. */
  18. void USART1_IRQHandler(void)
  19. {
  20.     u8 j =0;
  21.     u8 flag = 0; //数据转换标志

  22.     static u16 dat[10];//最大发送
  23.     static u8 i = 0;
  24.     static u32 val = 0;//val值可以全局,控制频率等

  25.     /*中断接收*/
  26.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//判断是不是接收中断
  27.     {
  28.         dat[i] = USART_ReceiveData(USART1);    
  29.         USART_ClearITPendingBit(USART1, USART_IT_RXNE);     //清标记

  30.         i++;
  31.         if(i == 10)    //循环接收 10 个字符
  32.         {    
  33.             i = 0;
  34.             flag = 1;
  35.         }
  36.     }

  37.     if(flag == 1) //进行数据转换
  38.     {
  39.         flag = 0;
  40.         for(j = 0; j < 10; j++)
  41.         {    
  42.             USART_SendData(USART1,dat[j]);      //将接收到的数据发送到上位机
  43.             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  44.         }

  45.      //假如 发送的第一个是 #
  46.         if(dat[0] == 35) //#符号 对应asicc码35
  47.         {
  48.             USART_SendData(USART1,65);//A符号 对应asicc码65     //将接收到的数据发送到上位机
  49.             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  50.         }

  51.         /*进行 数据转换*/
  52.         for(j = 1; j < 9; j++)
  53.         {
  54.             dat[j] = dat[j] & 0xf;
  55.         }
  56.         val = dat[1]*10000000 + dat[2]*1000000 + dat[3]*100000 + dat[4]*10000\
  57.             + dat[5]*1000 + dat[6]*100 + dat[7]*10 + dat[8];
  58.         if(val == 12345678)//验证发送的是不是 12345678
  59.         {
  60.             USART_SendData(USART1,66);//B符号 对应asicc码65     //将接收到的数据发送到上位机
  61.             while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);    
  62.         }                         
  63.     }
  64. }







   


阅读(1993) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~