[Cortex-M0技术交流] RyanHsiung学习第三贴, 串口通信协议 移植!

[复制链接]
 楼主| Ryanhsiung 发表于 2011-10-14 16:58 | 显示全部楼层 |阅读模式
本帖最后由 Ryanhsiung 于 2011-10-14 17:05 编辑

听说大叔正准备定串口的通信协议,今天我就移植了一个我现在正在用的!注:非商业用途 本程序可随意使用!商业则必须经过本人的同意!!
protocol:
//接收:  0x02 +address + length + command+ data0..n ++ crc8sum
  
  (n>=0)
//发送: 0x02 +address + length +status + (command+ data0..n )+ crc8sum
  (n>=0)
大家也可使用9位地址模式,将0x02去除直接,ADDRESS用9位地址传送,剩下的用9位数据传送。
本程序功能:
   通过串口接收命令,解析command: 为0 点亮LED1,为1关闭LED1.
下面是流程图!



  1. 收码:
  2. void UART0_Int_Handle (uint32_t u32IntStatus)
  3. {
  4.   if(u32IntStatus & DRVUART_RDAINT)                                 // 如果是接收中断
  5.         {
  6.           if(UART0->ISR.RDA_IF==1)                                                 // 如果是串口0接收中断,标志会自动清0
  7.             {
  8.                   static uint8_t receive_temp=0;                                // 临时接收变量        静态 存取速度快
  9.                   receive_temp = UART0->DATA;                                // 单字节中断,不用函数了 DrvUART_Read(UART_PORT0,&a_RS232_RecData[RS232_RecCount],1);
  10.                   if(1 == Flag_Serial_IsRecStatus)                        // 若没有开始,继续等待开始标识符(SERIAL_START_FLAG)
  11.                     {
  12.                           a_Serial_RecData[Serial_RecCount]  = receive_temp;         // 接收字符
  13.                           switch(Serial_RecCount)
  14.                                   {
  15.                                        
  16.                                         case 0:           // 正常不会有0
  17.                                           {
  18.                                                 Serial_ReStartReceive();
  19.                                           }break;
  20.                                         case 1:           //检测地址是否正确  0就不用检测了
  21.                                           {
  22.                                                 if((Serial_Address != receive_temp)&&(SERIAL_BROADCAST_ADDRESS!= receive_temp))
  23.                                                 {
  24.                                                         Serial_ReStartReceive();
  25.                                                 }
  26.                                           }break;
  27.                                          case 2:           //记录长度
  28.                                           {
  29.                                                   if((receive_temp>SERIAL_MIN_REC_NUM)&&(receive_temp<SERIAL_MAX_REC_NUM)) //判断长度是否法
  30.                                                  {
  31.                                                     Serial_RecLenth        = receive_temp;
  32.                                                    }
  33.                                                  else
  34.                                                   {
  35.                                                     Serial_ReStartReceive();
  36.                                                   }
  37.                                           }break;
  38.                                         default:  //接收内容
  39.                                           {
  40.                                                 if(Serial_RecLenth == Serial_RecCount  )
  41.                                                   {
  42.                                                    Flag_Serial_ReceiveOK = 1;
  43.                                                         Serial_RecCount = 0;
  44.                                                         UART0->IER.RDA_IEN = 0        ;                        //先不接收,否则可能出错,即还没把数据取出,新的数据就占住了位置                                                  
  45.                                                           Timer0_En(ENABLE_DIS);                                //接收完成 T0关
  46.                                                         return;                                                                //最后一个不计算校验合
  47.                                                   }       
  48.                                           }break;                                                                                          // 这里用
  49.                                   }       
  50.                                 Serial_RecSum = CRC_GetCRC8(Serial_RecSum,receive_temp);// 计算CRC,这样就不用最后一起计算                                          
  51.                             if( Serial_RecCount++ >= (SERIAL_MAX_REC_NUM-1) )                // 检查接收是否要溢出了
  52.                                   {
  53.                                    Serial_ReStartReceive();                                                                   // 并丢掉先前的数据,从新开始
  54.                                   }
  55.                         }
  56.                         else
  57.                            if( SERIAL_START_FLAG == receive_temp )
  58.                                 {//Start to receive
  59.                                   Timer0_En(ENABLE_EN);                        //使能T0
  60.                                    Serial_RecCount = 1;                                //个数
  61.                                   Flag_Serial_IsRecStatus =1;
  62.                                   a_Serial_RecData[0] = Serial_RecSum = SERIAL_START_FLAG ;
  63.                                   Serial_RecSum = 0x0e        ;                        // 固定值所以不用CRC_GetCRC8(0x00,SERIAL_START_FLAG); 直接接赋值

  64.                                 }
  65.                 }
  66.         }
  67. }                                       


以下是解码代码
  1. void Serial_Decode(void)
  2. {
  3.         if( 1 == Flag_Serial_ReceiveOK )
  4.           {
  5.                   Flag_Serial_ReceiveOK =0;
  6.                 if( Serial_RecSum == a_Serial_RecData[Serial_RecLenth]        )  //
  7.                   {// 校验合正确,进入下一步
  8.                           switch(a_Serial_RecData[3])
  9.                           {
  10.                                 case 0:                        //灯1亮
  11.                                 {
  12.                                   LED_Control(D_PIN_LED1,D_LED_ON) ;
  13.                                 }break;                                                                                  
  14.                                 case 1:                        //灯1灭
  15.                                 {
  16.                                   LED_Control(D_PIN_LED1,D_LED_OFF) ;
  17.                                 }break;
  18.                                 default:
  19.                                 {                       
  20.                                         Serial_AckToPC(0xa0);                                                   // 接收成功,解析失败
  21.                                           Serial_ReStartReceive();                                              // 解析完毕 打开中断 重新准备接收
  22.                                         return;
  23.                                 };
  24.                           }
  25.                         Serial_AckToPC(0xaa);                                                                   // 接收成功,解析成功
  26.                           Serial_ReStartReceive();                                                              // 解析完毕 打开中断 重新准备接收
  27.                   }
  28.                   else
  29.                   {
  30.                     Serial_AckToPC(0x00);                                                                        // 可以进行报错,或者不报,485多主机情况下 最好不要发
  31.                           Serial_ReStartReceive();                                                                //  打开中断 重新准备接收
  32.                   }
  33.           }
  34. }               

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
plc_avr 发表于 2011-10-15 06:41 | 显示全部楼层
这个好,说明详细,顶!
Swallow_0322 发表于 2011-10-15 07:21 | 显示全部楼层
顶!
 楼主| Ryanhsiung 发表于 2011-10-15 08:08 | 显示全部楼层
2# plc_avr   这个是现在用的通信协议移植过来的,先前校验 是“和校验”变更为“CRC8校验"了!
  很多东西都是先前已经有的
x181084431 发表于 2011-10-16 21:13 | 显示全部楼层
很全,谢谢楼主分享
sylexuefan 发表于 2011-11-3 15:42 | 显示全部楼层
谢谢楼主分享
weshiluwei6 发表于 2011-11-4 09:58 | 显示全部楼层
有价值  支持
hotpower 发表于 2011-11-4 10:55 | 显示全部楼层
注意,hotwc3玩具里有TI的CRC8即PEC,你可以做验算工具。
 楼主| Ryanhsiung 发表于 2011-11-4 11:01 | 显示全部楼层
8# hotpower 公司是联通的网络,上不去大叔那几个网站,可以看到标题后面就停住了!
hotpower 发表于 2011-11-4 12:36 | 显示全部楼层
在hotisp包了有
chy117 发表于 2011-11-15 10:21 | 显示全部楼层
mcs8098 发表于 2011-12-20 12:48 | 显示全部楼层
:loveliness:
乡村男孩 发表于 2012-1-5 10:53 | 显示全部楼层
这个帖子好
wang282376975 发表于 2012-2-3 00:01 | 显示全部楼层
真的很好,很受益
nomorehest 发表于 2012-2-3 11:11 | 显示全部楼层
非常不错, 学习了, 顶起来.
xyz549040622 发表于 2012-2-4 13:52 | 显示全部楼层
学习了!
菜鸟+新手 发表于 2012-9-3 12:15 | 显示全部楼层
学习了,正在搞这个
alaic123 发表于 2012-11-19 11:19 | 显示全部楼层
好东西 学习中
cgd 发表于 2012-11-30 11:37 | 显示全部楼层
顶,下来看看。
honeybaby 发表于 2014-3-14 10:05 | 显示全部楼层
非常感谢。谢谢了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:嵌入式技术专家
简介:道阻且长,行则将至!

64

主题

4653

帖子

14

粉丝
快速回复 在线客服 返回列表 返回顶部