串口,按键,消息,定时器(2)
31. state = LEN_STATE; 32. break; 33.
34. case LEN_STATE://1
35. LEN_Token = ch;//消息的长度 36.
37. tempDataLen = 0; 38.
39. /* Allocate memory for the data */
40. pMsg = (mtOSALSerialData_t *)osal_msg_allocate( sizeof ( mtOSALSeria
lData_t ) +
41. MT_RPC_FRAME_HDR_SZ
+ LEN_Token ); 42.
43. if (pMsg) 44. {
45. /* Fill up what we can */
46. pMsg->hdr.event = CMD_SERIAL_MSG; 47. pMsg->msg = (uint8*)(pMsg+1);
48. pMsg->msg[MT_RPC_POS_LEN] = LEN_Token;//pMsg->msg[0]=len 49. state = CMD_STATE1;//读完长度,就进入CMD_STATE1状态,进行读命令 50. } 51. else 52. {
53. state = SOP_STATE; 54. return; 55. } 56. break; 57.
58. case CMD_STATE1:
59. pMsg->msg[MT_RPC_POS_CMD0] = ch;//pMsg->msg[1]=命令低字节 60. state = CMD_STATE2; 61. break; 62.
63. case CMD_STATE2:
64. pMsg->msg[MT_RPC_POS_CMD1] = ch;//pMsg->msg[2]=命令高字节 65. /* If there is no data, skip to FCS state */ 66. if (LEN_Token) 67. {
68. state = DATA_STATE;//读完命令,如果数据长度不为0,就进入DATA_STATE状
态,进行读数据 69. } 70. else 71. {
72. state = FCS_STATE;//否则进入FCS_STATE状态,进行校验 73. } 74. break; 75.
76. case DATA_STATE: 77.
78. /* Fill in the buffer the first byte of the data */ 79. pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen++] = ch; 80.
81. /* Check number of bytes left in the Rx buffer */ 82. bytesInRxBuffer = Hal_UART_RxBufLen(port); 83.
84. /* If the remain of the data is there, read them all, otherwise, jus
t read enough,读数量较小的数据 */
85. if (bytesInRxBuffer <= LEN_Token - tempDataLen)//如果剩余数据<=len-已
读长度,全部读出 86. {
87. HalUARTRead (port, &pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen],
bytesInRxBuffer);
88. tempDataLen += bytesInRxBuffer; 89. }
90. else//否则只读出(len-已读长度)的数据 91. {
92. HalUARTRead (port, &pMsg->msg[MT_RPC_FRAME_HDR_SZ + tempDataLen],
LEN_Token - tempDataLen);
93. tempDataLen += (LEN_Token - tempDataLen); 94. } 95.
96. /* If number of bytes read is equal to data length, time to move on
to FCS */
97. if ( tempDataLen == LEN_Token ) 98. state = FCS_STATE; 99.
100. break; 101.
102. case FCS_STATE: 103.
104. FSC_Token = ch; 105.
106. /* Make sure it's correct */
107. if ((MT_UartCalcFCS ((uint8*)&pMsg->msg[0], MT_RPC_FRAME_HDR_SZ + L
EN_Token) == FSC_Token))//计算fcs 108. {
109. osal_msg_send( App_TaskID, (byte *)pMsg );
110. } 111. else 112. {
113. /* deallocate the msg */
114. osal_msg_deallocate ( (uint8 *)pMsg ); 115. } 116.
117. /* Reset the state, send or discard the buffers at this point */ 118. state = SOP_STATE; 119.
120. break; 121.
122. default: 123. break; 124. } 125. } 126. }
所以如果PC发数据给zigbee串口,需要先发送FE...或者修改这个MT_UartProcessZToolData函数以适应自己的应用
协议栈中的串口发送流程
在某个app_init()中初始化和注册串口(如果此app不需要接收数据,可以不用注册) 直接使用如下代码发送数据即可
HalUARTWrite(0,\
如果在opention中定义了MT_TASK,则在发送实际的数据之前会发送一个11字节的数据头(下行红色数据),在PC接收到如下形式的数据:
FE 06 41 80 01 02 00 02 03 00 C5 48 65 6C 6C 6F 20 57 6F 72 6C 64 0A 后面黑色字体的12个字节才是真正的数据
将MT_TASK取消定义则直接发送真实的数据
协议栈中的按键流程
以其为例C:\\Texas
Instruments\\ZStack-CC2530-2.3.0-1.4.0\\Projects\\zstack\\Samples\\SampleApp
1.在main函数中会执行InitBoard(),用于初始化led和按键 OnBoard.c
[cpp] view plaincopy
1. void InitBoard( uint8 level ) 2. {
3. if ( level == OB_COLD ) 4. {
5. // Interrupts off
6. osal_int_disable( INTS_ALL ); 7. // Turn all LEDs off
8. HalLedSet( HAL_LED_ALL, HAL_LED_MODE_OFF ); 9. // Check for Brown-Out reset 10. ChkReset(); 11. }
12. else // !OB_COLD 13. {
14. /* Initialize Key stuff */
15. OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;//此处需要使能按键中断 16. HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);//配置按键终端产生
之后,触发OnBoard_KeyCallback函数 17. } 18. }
配置函数HalKeyConfig,用于配置哪个按键(哪个端口)
回调函数OnBoard_KeyCallback,此函数执行OnBoard_SendKeys,将按键事件发给上层注册按键的应用
2.在SampleApp_Init()函数中注册按键,这样以后有按键事件发生时,才会将消息发送到SampleApp应用
RegisterForKeys( SampleApp_TaskID ); 如果按键已被注册,则后来注册的就会失败。 uint8 RegisterForKeys( uint8 task_id ) {
// Allow only the first task
if ( registeredKeysTaskID == NO_TASK_ID ) {
registeredKeysTaskID = task_id; return ( true ); } else
return ( false ); }
类似于注册串口,但串口刚好相反。
协议栈中的消息流程
3个不得不知道的结构体
[cpp] view plaincopy
相关推荐:
- [资格考试]机械振动与噪声学部分答案
- [资格考试]空调工程课后思考题部分整合版
- [资格考试]电信登高模拟试题
- [资格考试]2018年上海市徐汇区中考物理二模试卷(
- [资格考试]坐标转换及方里网的相关问题(椭球体、
- [资格考试]语文教研组活动记录表
- [资格考试]广东省2006年高应变考试试题
- [资格考试]LTE学习总结—后台操作-数据配置步骤很
- [资格考试]北京市医疗美容主诊医师和外籍整形外科
- [资格考试]中学生广播稿400字3篇
- [资格考试]CL800双模站点CDMA主分集RSSI差异过大
- [资格考试]泵与泵站考试复习题
- [资格考试]4个万能和弦搞定尤克里里即兴弹唱(入
- [资格考试]咽喉与经络的关系
- [资格考试]《云南省国家通用语言文字条例》学习心
- [资格考试]标准化第三范式
- [资格考试]GB-50016-2014-建筑设计防火规范2018修
- [资格考试]五年级上册品社复习资料(第二单元)
- [资格考试]2.对XX公司领导班子和班子成员意见建议
- [资格考试]关于市区违法建设情况的调研报告
- 二0一五年下半年经营管理目标考核方案
- 2014年春八年级英语下第三次月考
- 北师大版语文二年级上册第十五单元《松
- 2016国网江苏省电力公司招聘高校毕业生
- 多渠道促家长督导家长共育和谐 - 图文
- 2018 - 2019学年高中数学第2章圆锥曲线
- 竞争比合作更重要( - 辩论准备稿)课
- “案例积淀式”校本研训的实践与探索
- 新闻必须客观vs新闻不必客观一辩稿
- 福师大作业 比较视野下的外国文学
- 新编大学英语第二册1-7单元课文翻译及
- 年产13万吨天然气蛋白项目可行性研究报
- 河南省洛阳市2018届高三第二次统一考试
- 地下车库建筑设计探讨
- 南京大学应用学科教授研究方向汇编
- 2018年八年级物理全册 第6章 第4节 来
- 毕业论文-浅析余华小说的悲悯性 - 以《
- 2019年整理乡镇城乡环境综合治理工作总
- 广西民族大学留学生招生简章越南语版本
- 故宫旧称紫禁城简介




