教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 资格考试 >

串口,按键,消息,定时器(2)

来源:网络收集 时间:2026-07-16
导读: 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_

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

…… 此处隐藏:3096字,全部文档内容请下载后查看。喜欢就下载吧 ……

串口,按键,消息,定时器(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/413251.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)