⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.lst

📁 一个分选系统的软件:用SmallRtos操作系统
💻 LST
📖 第 1 页 / 共 2 页
字号:
 161          ** 函数名称: GetCharWithoutCheck
 162          ** 功能描述: 从读串口消息队列取一字节
 163          ** 输   入: 无
 164          ** 输   出: temp:从串口消息队列取的字节
 165          ** 全局变量: 无
 166          ** 调用模块: OSQPend
 167          **
 168          ** 作   者: 刘宝贵
 169          ** 日   期: 2004年4月21日
 170          **-------------------------------------------------------------------------------------------------------
 171          ** 修改人:
 172          ** 日 期:
 173          **------------------------------------------------------------------------------------------------------
 174          ********************************************************************************************************/
 175          uint8 GetCharWithoutCheck(void)
 176          {
 177   1          uint8 data temp;
 178   1          OSQPend(&temp,SerialInData,0);     /* 接收一个字节       */
C51 COMPILER V7.06   SERIAL                                                                12/21/2004 15:11:26 PAGE 4   

 179   1          return(temp);
 180   1      }  
 181          
 182          /*********************************************************************************************************
 183          ** 函数名称: TaskReceive
 184          ** 功能描述: 串口接收处理任务
 185          ** 输   入: 无
 186          ** 输   出: 无                     
 187          ** 全局变量: 无
 188          ** 调用模块: 无
 189          **
 190          ** 作   者: 刘宝贵
 191          ** 日   期: 2004年4月20日
 192          **-------------------------------------------------------------------------------------------------------
 193          ** 修改人:
 194          ** 日 期:
 195          **------------------------------------------------------------------------------------------------------
 196          ********************************************************************************************************/
 197          void TaskReceive(void)
 198          {
 199   1          uint8 code  head[4] = {0xEB,0x90,0xEB,0x90};
 200   1          OSQCreate(SerialInData,100);                 /* 建立所需要的消息队列 */
 201   1          OSQCreate(SerialOutData,200);
 202   1          while (1)
 203   1          {
 204   2              uint8 xdata state=0;
 205   2              while (1)//识别报文头
 206   2              {
 207   3                  if(head[state] == GetCharWithoutCheck())
 208   3                      state++;
 209   3                  else
 210   3                      state=0;
 211   3                  if(state==4)
 212   3                      break;
 213   3              }//while (1)//识别报文头
 214   2              rtn=RIGHT;                               /* 返回码置初值         */
 215   2              inchk = 0xeb^0x90^0xeb^0x90;             /* 初始化校验和         */
 216   2              if(Address == GetCharWithCheck())       /* 如果地址正确则继续   */
 217   2              {
 218   3                  uint8 data i;
 219   3                  uint8 xdata length;
 220   3                  cid = GetCharWithCheck();
 221   3                  length = GetCharWithCheck();
 222   3                  if (length>100)
 223   3                  {
 224   4                      length=100;
 225   4                  }
 226   3                  for (i=0;i<length;i++)                    // 接收数据区数据       
 227   3                  {
 228   4                      buf[i]=GetCharWithCheck();
 229   4                  }
 230   3                  i = GetCharWithoutCheck();
 231   3                  if (inchk != i && i!=0x55)       // 判断校验和 0x55 为不校验
 232   3                  {
 233   4                      rtn = CHKSUM_ERROR;
 234   4                  }
 235   3                  if (0x0d != GetCharWithoutCheck())        // 判断报文尾           
 236   3                  {
 237   4                      rtn = TYPE_ERROR;
 238   4                  }
 239   3                  EN_485 = 0;
 240   3                  OSWait(K_TMO,(5*OS_TICKS_PER_SEC)/1000);  //delay15ms
C51 COMPILER V7.06   SERIAL                                                                12/21/2004 15:11:26 PAGE 5   

 241   3                  if(rtn==1)//如果报文的校验和,类型正确
 242   3                  {
 243   4                      CommCounter = 0;
 244   4                      switch (cid)
 245   4                      {
 246   5                          case 0:                               // 握手命令             
 247   5                          {
 248   6                              CommSendInfo();
 249   6                          }break;
 250   5                      }//switch (cid)
 251   4                  }//if(rtn==1)//如果报文的校验和,类型正确]
 252   3                  else//如果校验和或类型不正确
 253   3                  {
 254   4                      CommSendInfo();
 255   4                  }
 256   3              }//if (Address == GetCharWithCheck())
 257   2          }//while (1)
 258   1      }//void TaskReceive(void)
 259          /*********************************************************************************************************
 260          ** 函数名称: comm
 261          ** 功能描述: 串口中断处理程序
 262          ** 输 入: 无
 263          ** 输 出: 无
 264          ** 全局变量: 无
 265          ** 调用模块: 无
 266          **
 267          ** 作 者: 刘宝贵
 268          ** 日 期: 2004年4月20日
 269          **-------------------------------------------------------------------------------------------------------
 270          ** 修改人:
 271          ** 日 期:
 272          **------------------------------------------------------------------------------------------------------
 273          ********************************************************************************************************/
 274          #if EN_OS_INT_ENTER >0 
              #pragma disable                                        /* 除非最高优先级中断,否则,必须加上这一句        
             -         */
              #endif
 277                          void comm(void) interrupt 4
 278          {
 279   1          uint8 data temp;
 280   1          if(EN_485 == 1)//EN_485==1:通信处于接收状态
 281   1          {
 282   2              if (RI0 == 1)
 283   2              {
 284   3      #if EN_OS_INT_ENTER >0
                          OS_INT_ENTER();
              #endif
 287   3                      RI0 = 0;
 288   3                  OSQIntPost(SerialInData,SBUF0);
 289   3                  OSIntExit();
 290   3                      return;
 291   3              }
 292   2          }
 293   1          else
 294   1          {
 295   2              RI0 = 0;
 296   2          }
 297   1              if (TI0 == 1)
 298   1              {
 299   2                      TI0 = 0;
 300   2                      if (OSQAccept(&temp,SerialOutData) == OS_Q_OK)
 301   2                      {
C51 COMPILER V7.06   SERIAL                                                                12/21/2004 15:11:26 PAGE 6   

 302   3                          SBUF0 = temp;
 303   3                      }
 304   2                      else
 305   2                      {
 306   3                          SerialCanSend = 1;
 307   3                  EN_485 = 1;
 308   3                      }
 309   2              }
 310   1      }
 311          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    436    ----
   CONSTANT SIZE    =      4    ----
   XDATA SIZE       =    400       2
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4       4
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -