MBCross.c 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /********************************************************************************
  2. * File Name: MBCross.c
  3. * Function Describe: 用于与主板通讯
  4. * Explain:
  5. * Writer:SLW
  6. * Date:
  7. ********************************************************************************/
  8. #define THIS_FILE_ID 10
  9. #include "includes.h"
  10. sendTestdat_t sutTestData;
  11. /****************************************************************************
  12. DecodecFromMB
  13. 将主板(RS485)发过来的数据pData解码到pSendTest中
  14. pData格式:
  15. 起始码(2Byte)+数据长度(1Byte)+国家(1Byte)+省份(1Byte)+地区(1Byte)+ 船东(1Byte)+GPRS开/关(1Byte)+北斗开/关(1Byte)
  16. +渔船号码(13Byte)+地址码(1Byte)+类型(1Byte)+状态码(1Byte)+防盗码(5Byte)+预留位(4Byte)+校验码(2Byte)
  17. 例子:
  18. AA BB len 01 02 03 04 05 06 01020304050607080900010203070809 xx yy zz 1122334455 66778899 DD 55
  19. 返回:
  20. 1-- 解析成功
  21. 0-- 解析失败
  22. *****************************************************************************/
  23. int DecodecFromMB(unsigned char *pData,sendTestdat_t *pSendTest)
  24. {
  25. char buf[20];
  26. int i,j;
  27. int flag=0;
  28. int len=pData[2];
  29. if(len<22)return 0;
  30. //if(pData[0]!=0xAA || pData[1]!=0xBB || pData[len-2]!=0xDD ||pData[len-1]!=0x55){
  31. if(pData[len-2]!=0xDD ||pData[len-1]!=0x55){//pData[0] pData[1] 在进入本函数的时候已经检查了
  32. SlwTrace(DEBUG,"Decodec From MB Error!\r\n");
  33. return 0;
  34. }
  35. SlwTrace(DEBUG,"Decodec From MB OK!\r\n");
  36. tsk_lock ();//涉及到全局变量在不同任务中共享,就要加任务锁,避免修改全局变量未完成时切换到别的任务去调用全局变量,从而导致数据完整性问题。
  37. j=0;
  38. //红外总使能状态
  39. if(pSendTest->Infrared!=pData[20])flag=1;
  40. pSendTest->Infrared=pData[20];
  41. //摄像头总使能状态
  42. if(pSendTest->Camera!=pData[21])flag=1;
  43. pSendTest->Camera=pData[21];
  44. len=len-2;
  45. if(len>TC_DATA_MAX_LEN)len=TC_DATA_MAX_LEN;
  46. for(i=22;i<len;i++){
  47. if(pSendTest->TcData[j]!=pData[i])flag=1;
  48. pSendTest->TcData[j]=pData[i];
  49. if(j<(sizeof(pSendTest->TcData)-1))j++;
  50. else break;
  51. }
  52. if(pSendTest->TcLen!=j)flag=1;
  53. pSendTest->TcLen=j;
  54. if(flag==1){//发生变化,需要立即更新上传
  55. pSendTest->TcUpdated=1;
  56. }
  57. pSendTest->RecvReady=1;
  58. pSendTest->OnceRecvFlag=1;
  59. pSendTest->RecvIdelCt=0;
  60. tsk_unlock ();
  61. sprintf(buf,"TcLen=%d\r\n",j);
  62. SlwTrace(DEBUG,buf);
  63. return 1;
  64. }
  65. /*
  66. 发送命令给主机
  67. //0x01表示关闭红外探测器,0x02表示打开红外探测器,0x03表示关闭视频模块,0x04表示打开视频模块,占1个字节,0x05表示软件复位
  68. */
  69. void SendCmdToMB(unsigned char Cmd)
  70. {
  71. unsigned char data[4];
  72. data[0]=0xAA;
  73. data[1]=0xBB;
  74. data[2]=Cmd;
  75. data[3]=Cmd;
  76. Uart1Send((char *)data,4);
  77. }