发 帖  
原厂入驻New

【大联大世平 NXP i.MX RT1064开发板试用体验】5-简介+coslink协议设计及python实现上位机软件 终结篇

2020-11-23 20:55:58  275 开发板试用
分享
0
本帖最后由 jf_00240724 于 2020-11-23 21:24 编辑

  • 简介
    这里将介绍coslink具体协议设计及软件架构。以及python实现上位机软件。
  • RT1064开发板有足够的RAM和ROM,但仍然有必要将状态机的资源使用保持在最低限度。
    HW.PNG
  • Coslink 数据格式:
    First Byte
    Second Byte
    Third Byte
    Fourth Byte …
    End – 1 Byte
    End Byte
    Start Bit
    Length of data segment
    CDM-ID
    Data segment
    Checksum
    End Flag
    0xAA
    0xxx
    0xxx
    0xxx
    0xxx
    ‘/n’
    CDM-ID:
    -心跳(0x55):
    每1秒发送一次,应在3秒内从主机接收到相同的消息,否则报告连接失败错误并向主机发送超时连接。使用stm_heartbeat_1second_delay延迟1秒发送,stm_heartbeat_3second_lost_delay来检测心跳的响应。
    -请求重新发送(0x00):
    当检测到错误的校验和时,向主机发送重新发送请求命令
    -按键(0x01):
    当目标检测到密钥打开时,目标向主机发送此命令
    -确认键(0x02):
    当主机收到按键时,主机向目标发送此命令
    -主机的连接丢失(0x03):
    当超过3秒无法接收主机响应时,目标向主机发送此命令以通知连接丢失。
    校验和:
    -发送方加起始位+数据段长度+CMD id+所有数据段,将每一位的结果倒置,得到低位字节为校验和接收机加起始位+数据段长度+命令id+所有数据段+校验和+1,如果结果为0,则数据正确,否则错误。如果错误,发送重新发送请求并报告错误的校验和。
  • 软件系统设计
    SW.PNG
    状态迁移表:
Current state
Condition
Next state
Action
Transition
S1
C1
S2
action_1
t1
S1
C2
S1
action_4
t4
S1
C3
S1
action_1
t1
S1
C4
S1
action_4
t4
S2
C1
S2
action_1
t1
S2
C2
S3
action_2
t2
S2
C3
S3
action_3
t33
S2
C4
S1
action_4
t4
S3
C3
S2
action_3
t3
S3
C4
S1
action_4
t4
S3
C1
S3
action_3
t33
S3
C2
S3
action_3
t33


备注:

S1:InitialState




C1:build connect




action_1:LED1 off,LED2 on
S2:connect ok state


C2:key on






action_2:send Key-on to host
S3:wait host's response of key state
C3:receive host's response of key
action_3:LED1 blinking 3 times






C4:disconnect




action_4:LED1 blinking,LED2 off

5. 主要代码:
  1. while (1)
  2.         {
  3.                 static u16 cnt = 0;
  4.                 static u8 buf[FRAME_SIZE], a_byte;
  5.                 bool ret_t = FALSE;
  6.                 Data_Frame pData_Frame_t;
  7.                 check_timer();
  8.                 if(stm_connect_send_heartbeat_delay == 0)
  9.                 {
  10.                         send_CMD_data(ID_HEARTBEAT);
  11.                         stm_connect_send_heartbeat_delay = 10;// 1000ms
  12.                 }
  13.                 if(Get_Key1_Press() == TRUE)
  14.                 {
  15.                         if(g_condition_demo.key_c_can_be_change_flg == TRUE)
  16.                         {
  17.                                 g_condition_demo.cond= CONDITION_2;
  18.                                 g_condition_demo.changed_flg  = TRUE;
  19.                         }
  20.                 }
  21.                 else
  22.                 {
  23.                         //read ringbuffer
  24.                         while(g_fifo_Rx.empty_flg == FALSE)
  25.                         {          /* Do something with buf... */        
  26.                                 //assert(buf == cnt);   
  27.                                 ret_t = read_fifo(&g_fifo_Rx,&a_byte);
  28.                                 buf[cnt++] = a_byte;
  29.                                 if((a_byte == 0x0A)&&(ret_t == TRUE))// it's a frame data
  30.                                 {
  31.                                         if(check_data_whole(buf,&pData_Frame_t,FRAME_SIZE))
  32.                                                 if(check_data_vaild(&pData_Frame_t))// check checksum is correct
  33.                                                 {
  34.                                                         if(pData_Frame_t.id == ID_HEARTBEAT)
  35.                                                         {
  36.                                                                 if(g_condition_demo.heartbeat_build_can_be_change_flg == TRUE)
  37.                                                                 {
  38.                                                                         stm_lost_heartbeat_3s_delay = 3;
  39.                                                                         g_condition_demo.cond= CONDITION_1;
  40.                                                                         g_condition_demo.changed_flg  = TRUE;
  41.                                                                 }
  42.                                                       cnt = 0;
  43.                                                                 break;
  44.                                                         }
  45.                                                         else if(pData_Frame_t.id == ID_COMFIRM_KEY)
  46.                                                         {
  47.                                                                 if(g_condition_demo.confirmed_response_c_can_be_change_flg == TRUE)
  48.                                                                 {
  49.                                                                         g_condition_demo.cond= CONDITION_3;
  50.                                                                         g_condition_demo.changed_flg  = TRUE;
  51.                                                                 }
  52.                                                       cnt = 0;
  53.                                                                 break;
  54.                                                         }
  55.                                                         else if(pData_Frame_t.id == ID_RESEND_REQUEST)
  56.                                                         {        
  57.                                                                 send_CMD_data(ID_HEARTBEAT);
  58.                                                                 stm_connect_send_heartbeat_delay = 10;// 1000ms
  59.                                                       cnt = 0;
  60.                                                                 break;
  61.                                                         }
  62.                                                         else{
  63.                                                                 SEGGER_RTT_printf(0,"invaild ID\r\n");
  64.                                                                 break;
  65.                                                         }
  66.                                                 }
  67.                                                 else
  68.                                                 {//send re-send command to Host & stop send heartbeat                                
  69.                                                         send_CMD_data(ID_RESEND_REQUEST);
  70.                                                         break;
  71.                                                 }
  72.                                 }
  73.                                 else
  74.                                 {

  75.                                 }
  76.                                 //printf("%d Read: %d\n", cnt,buf);  
  77.                         }
  78.                 }
  79.                 if(g_condition_demo.changed_flg  == TRUE)
  80.                 {
  81.                         state_machine_step(&g_state_machine,g_condition_demo.cond);
  82.                         g_condition_demo.changed_flg  = FALSE;
  83.                 }
  84.                
  85.         }
复制代码
6. python实现上位机软件
  1. '''
  2. this python shell is serial server for Coslink protocol  
  3. '''

  4. import serial # install cmd: python -m pip install pyserial --user(python -m pip install --upgrade pip --user)
  5. from datetime import datetime
  6. from threading import Timer

  7. send_1000ms_arrive_flg = False
  8. heartbeat_received_flg = False
  9. def sendKeepConnectTimer(inc):
  10.     global send_1000ms_arrive_flg
  11.     print(datetime.now().stRFtime("%Y-%m-%d %H:%M:%S"))
  12.     send_1000ms_arrive_flg = True
  13.     t = Timer(inc,sendKeepConnectTimer,(inc,))
  14.     t.start()
  15. def checksum(data_r):
  16.         #n_position = data_r.list('\n')
  17.         #in_checksum = data_r[n_position-1]
  18.         sum = 0
  19.         for i in data_r:
  20.                 sum = sum+i
  21.         sum = sum - 9  #  -10+1        
  22.         print(sum)
  23.         if(sum%256 == 0):
  24.                 return True
  25.         else:
  26.                 return False

  27. def run(svr_status):
  28.         global connect_status, send_1000ms_arrive_flg,heartbeat_received_flg
  29.         
  30.         first_start_timer_flg = True
  31.         arr_ID_resend= [170,1,0,0,84,10]
  32.         arr_ID_KeyResponse= [170,1,2,0,82,10]
  33.         seri = serial.Serial()
  34.         seri.baudrate = 115200
  35.         seri.port = 'COM18'
  36.         print("Serial Server Application")
  37.         print("SCN:DAA31028AAA Build Time:2020-11-11 23:00")
  38.         print("waiting for open serial ...")

  39.         #seri.parity = 'ODD'
  40.         while True:
  41.                 try:
  42.                         seri.open()
  43.                         print('serial open open successfully ')
  44.                         if(first_start_timer_flg):
  45.                                 first_start_timer_flg = False
  46.                                 sendKeepConnectTimer(3)
  47.                         while seri.isOpen():
  48.                                 try:
  49.                                         #print("waiting for connect data ...")
  50.                                         if seri.inWaiting():
  51.                                                 data_r = seri.readline()
  52.                                                 #print('reveive type of data:',type(data_r))
  53.                                                 print('reveive hex data:',data_r)
  54.                                                 #print('reveive hex data[2]:%x',data_r[2])
  55.                                                 if(checksum(data_r) == True):
  56.                                                         if(data_r[2] == 3):
  57.                                                                 print('ERROR:!!!The connect is not built or lost !!!')
  58.                                                         elif(data_r[2] == 85):
  59.                                                                 heartbeat_received_flg = True
  60.                                                                 print('send heartbeat',data_r)
  61.                                                                 seri.write(data_r) #send heartbeat
  62.                                                         elif(data_r[2] == 1):
  63.                                                                 print('send KeyResponse',arr_ID_KeyResponse)
  64.                                                                 seri.write(arr_ID_KeyResponse) #send _KeyResponse
  65.                                                 else:
  66.                                                         print('receive wrong checksum,so send re-send resquest',arr_ID_resend)
  67.                                                         seri.write(arr_ID_resend)
  68.                                         else:
  69.                                                 if(send_1000ms_arrive_flg == True):
  70.                                                         send_1000ms_arrive_flg = False
  71.                                                         #print('time arrive more than 1000ms!!!')
  72.                                                         if(heartbeat_received_flg == True):
  73.                                                                 heartbeat_received_flg = False
  74.                                                         else:
  75.                                                                 print('ERROR:!!!clent heartbeat package is lost for more than 3000ms!!!')
  76.                                                 #print('serial no data...')
  77.                                 except:
  78.                                         print("seri except & disconnect\r\n")
  79.                                         break
  80.                                 #else:
  81.                                         #handle data
  82.                                         #print("handle data\r\n")

  83.                         #seri.close()
  84.                 except:
  85.                         seri.close()#pass
  86.                         if(send_1000ms_arrive_flg == True):
  87.                                 send_1000ms_arrive_flg = False
  88.                                 print('Open Uart failed!!!')
  89.                         #break
  90.                 else:        
  91.                         if(send_1000ms_arrive_flg == True):
  92.                                 send_1000ms_arrive_flg = False
  93.                                 print('Open Uart failed!!!')
  94.                  
  95. if __name__ == "__main__":
  96.         #sendKeepConnectTimer(5)=
  97.         #data_test=[170,1,85,15,240,10]
  98.         
  99.     run(0)
复制代码







评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表