分支資料監測終端(啟動)

DLluop發表於2020-09-26

文章目錄


前言

延時保證煙感等TC_BUS裝置斷電重啟,需要5秒延時


tcbus 煙溫一體感測器 2秒閃一下是沒註冊成功 6秒閃是註冊成功了 需要重啟分支終端 按感測器規約(資料傳輸時擴大10倍)

TCBUS

初始化程式碼如下(示例):

INT8U read_TCBUS_state(void)
{
    INT8U data;
    data = 0xFF;                             //mcu端接收tcbus的引腳
    if(PLIB_PORTS_PinGet( PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_3))
    {
        data = 0x01;
    }
    else
    {
        data = 0x00;
    }
    return data;
}

串列埠軟體下發報文,沒有回傳的異常現象:
在這裡插入圖片描述
接收的不全:
在這裡插入圖片描述
在這裡插入圖片描述
表示只接收到六位快取,原理可能是:1、傳送端報文就丟失了。2、接收端丟失。
1、嘗試再開一路COM口(用RS232轉485)監視485口傳送端報文的完整性:
在這裡插入圖片描述
2、因此進一步判斷應該就是接收端出現問題:
2.1 可能是接收端 報文位元組間延時閾值 導致的接收不完整
2.2 可能是485串列埠 半雙工資料傳輸 可能是傳輸方向驟變導致的

recv_int = read(50);//一位元組一位元組的讀串列埠數值 結合下面函式分析
// 50ms的時間內一直讀data = drv_uart3_read();
// 過了50ms如果還是沒有資料就直接return -1退出,data的值仍為-1
INT16S if_rs485_read ( INT16U time_out )
{
    INT16S data;
    INT32U time_begin;
    time_begin = tpos_time_10ms();
    do{
        data = drv_uart3_read();
        if(data == -1)
        {
            if(time_out <= tpos_elapsed_10ms(time_begin))
//如果 串列埠讀取資料的時間 大於 設定的time_out 則程式結束 查一下就走  
            {
                return -1;
            }
        tpos_yield();
        }
    }while(-1 == data);
   return data;
}
if(recv_int == -1)
{
 if (recv_params->elmt.pos == 0) 
    {
     if (tpos_elapsed_10ms(recv_params->elmt.time_start) > first_timeout_10ms) //return 0;            //首位元組超時1s
        {init_recv_params(recv_params,max_size);
                return TRUE;
        }
    }
 else//報文接收在中間位置停頓了 (片段丟失)就會到這裡
    {
      if ((RECV_FRAME_UNKNOWN == resp_type) || (RECV_FRAME_UNKNOWN_CHECK == resp_type))//接收未知格式時,字元間延時變長些,目前只有搜表會使用未知格式接收
      {
        if (tpos_elapsed_10ms(recv_params->elmt.time_start) > byte_timeout_10ms) //return pos; //字元間延時不能超過200ms(byte_timeout_10ms值為5有時候會導致沒有應答幀)
          {         
             mem_set(temp_buf,0x00,100);
             temp_len=0;
             recv_params->elmt.ctrl_flag = DISTRIBUTED_RECV_CTRL_PRECESS_FRME;
            return TRUE;
          }
       }
        else
      {
          if (tpos_elapsed_10ms(recv_params->elmt.time_start) > byte_timeout_10ms) //return 0;             //字元間延時不能超過50ms
           {
               init_recv_params(recv_params,max_size);
               return TRUE;
          }
      }
  }
        return FALSE;
}

最後發現是這個終端裝置對於38400的波特率不是非常匹配,採用9600以後沒出現過此類問題。

相關文章