自己修改串口回调_第1页
自己修改串口回调_第2页
自己修改串口回调_第3页
自己修改串口回调_第4页
自己修改串口回调_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、确切的说已经不是第七天的学习了,但是为了跟之前的学习记录保持一致还是将就这么写 吧。基于协议栈的串口通信一直出现编译不通过,其实我想实现的功能很简单,就是一个Zigbee节点与PC串口通信,可以实现串口接收串口发送,也就是回显,不想用Zigbee2006 协议栈设计的串口通信,感觉那个真的很复杂,想自己编写实现 串口通信函数。想要自己实现这个串口通信,还是先看看协议栈是怎么实现的吧,因为自己写的函数可 能跟协议栈自带的发生冲突了,所以导致编译一直出错。协议栈实现串口部分是在SPIMgr.c中,主要是个初始化函数对串口进行了配置,代码如下:void SPI Mgr_l nit ()halUART

2、Cfg_t uartC on fig;/使用一个结构体来实现串口的配置,该结构体halUARTCfg_t将串口初始化有关参数集合在了一起,如波特率,是否打开串口,是否使用流控等。Ap p_TasklD = 0;uartC on fig.c on figured=TRUE;uartC on fig.baudRate=SPI_ MGR_DEFAULT_BAUDRATE;/#defi ne SP I_MGR_DEFAULT_BAUDRATE HAL_UART_BR_38400uartC on fig.flowC ontrol=SP l_MGR_DEFAULT_OVERFLOW;/ #defi ne

3、SP I_MGR_DEFAULT_OVERFLOWFALSEuartCo nfig.flowC on trolThreshold = SPI_ MGR_DEFAULT_THRESHOLD;uartC on fig.rx.maxBufSize=SPI_ MGR_DEFAULT_MAX_RX_BUFF;uartC on fig.tx.maxBufSize=SPI_ MGR_DEFAULT_MAX_TX_BUFF;uartC on fig.idleTimeout=SP I_MGR_DEFAULT_IDLE_TIMEOUT;uartC on fig.i ntEn able=TRUE;/Zigbee协议

4、栈里会大量使用这样的#if defi ned (ZTOOL_ P1) | defi ned (ZTOOL_ P2)SPI Mgr_ ProcessZToolData;/关键,uartConfig.callBackFunc是一个函数指针,后面的就是这个串口的回调函数。协 议栈中类似于这样的回调机制还是很多的。默认编了两个固化的:SPIMgr_ProcessZToolData 与 SPIMgr_ProcessZAppData;这两个是用于与 zibgee 的上位机通信的,有特定的协议,是由TI自己定的,比较复杂,所以我完成的就是自己编写回调函数,但是又不想破坏协议栈的完整性,也就是不修改SPIMg

5、r.c文件,不修改SPI Mgr_ ProcessZToolData与 SPIMgr_ProcessZAppData。#elif defined (ZAPP_P1) |defined (ZA PP_P2)uartC on fig.callBackF unc=SP IMgr_ ProcessZA pp Data;#elseuartC on fig.callBackF unc=NULL;#en dif#if defi ned (SP l_MGR_DEFAULT_ PORT)HalUARTOpen (SPI_MGR_DEFAULT_PORT, &uartConfig);/HalUARTOpen 函数

6、使用这些参数对串口进行初始化/ #if defi ned (ZTOOL_ P1) | defi ned (ZTOO L_P2)协议栈真是不厌其烦的不断的宏定义判断语句,不断的替换,但是可以看到最终替换到还是HAL_UART_PORT_m(ZTOOL_P1)是前提,所有的宏定义得依赖于它/ #defi ne SP I_MGR_DEFAULT_ PORT ZTOOL_ PORT/ #if defi ned (ZTOOL_ P1)/ #defi ne ZTOOL_ PORT SERIAL_ PORT1/#if defi ned (ZAPP_P1) | defined (ZTOO L_P1)/ #if

7、 defined (CC2430EB)/ #define SERIAL_PORT1 HAL_UART_PORT_O #else(void)uartC onfig;#en dif#if defi ned (ZA PP_P1) | defi ned (ZA PP_P2)SP IMgr_MaxZA pp BufLen = 1;SP IMgr_ZA pp RxStatus = SP I_MGR_ZA PP_RX_READY;#en dif现在我不想使用协议栈这个串口通讯函数,我必须把与之相关的内容禁用,然后增加自己的函数内容,由于不想破坏协议栈的完整性,所以我不能在源码中禁语句,那我还能通过什点左边的

8、C/C+么方法呢,那就是IAR编译器,Alt+F7键快捷打开option,进入工程设置,ComplierPreprossor 选项中Defind symbols ,可以看到很多宏定义,其中会有一项ZTOOL_P1或者是ZTOOL_P2,ZAPP_P 1,ZAPP_P2这个是定义串口调用函数、串口使能等的宏定义,如果你不想用这些函数,这几个你就必须注释掉,可以直接删除,但是避免以后还会x好啦!详见下图:用到添加又麻烦,所以最好的方法就是给它前面标个小写Options for no de GenericApp*匚atego申:General OptionsAssemblerCustom 0LJd

9、Guild ActionsLinker DebuggerThird-Part/ Driver 匚 hipcon roNneon ROM-Monitor Analog Devices 5il蛀SimulatorFacto 申 SettingsCode I Optiniz&tions | Output j Li stFreprocessor 1 Di AST, I I厂 Ignoreincludt dire”STOOmTZuiKS IHC 辽LIB VAdiitiond. include directories: (one per line)JPKDJ BIRJSFEDJ_DIRJ.EOUEEEt

10、FEDJV. . VZHATlfT1243ODBSFEDJ_DIH$. . COHFOBEHISVMTFreincludDefined symbols; CaneB243CIEE BEFLECTOR一 xETOOLFlI HT TASKper II IroctsEor output to 二 r- nh t -I厂1 I Il -OKCancel那下面在哪里添加自己的串口的配置函数及回调函数呢,很简单,这些函数需要自己放在之前系统的任务初始化函数void Ge nericA pp_l nit( byte task_id )里,格式按照协议栈的SPIMgr.c 中的 void SPIMgr_ln

11、it ()写就OK啦,代码如下:void Gen ericA pp_ln it( byte task_id )halUARTCfg_t uartC on fig;/串口配置结构体Gen ericA pp_TasklD = task_id;Gen ericA pp_Tra nsID = 0;/ Fill out the endpoint descri pti on.Gen ericA pp_ep Desc.e ndPoint = GENERICA PP_END POINT;Gen ericA pp_ep Desc.task_id = &Gen ericA pp_TasklD;Gen ericA

12、pp_ep Desc.si mp leDesc=(Si mpl eDescri pti onFo rmat_t *)&Gen ericA pp_Simpl eDesc;Gen ericA pp_ep Descate ncyReq = n oLate ncyReqs;/ Register the endpoint descri pti on with the AF afRegister( &Gen ericA pp_ep Desc );uartC on fig.c on figured = TRUE;uartCo nfig.baudRate = HAL_UART_BR_38400;uartCo

13、nfig.flowC on trol = FALSE;uartCo nfig.flowC on trolThreshold = 48;=128;=128;uartC on fig.rx.maxBufSizeuartC on fig.tx.maxBufSizeuartC on fig.idleTimeout=6;uartC on fig.i ntEn able=TRUE;uartCo nfig.callBackFu nc = RXCB;注意啦,RXCB就是自己需要写的串口回调函数uartCo nfig.i ntE nable = TRUE;HalUARTO pen (HAL_UART_ PORT

14、_0,&uartCo nfig); / 启动串口 HalUARTWrite(HAL_UART_ PORT_0,The CC2430 is in itialfin ished!/n,sizeof(The CC2430 is in itial fini shed!/n);/这个函数是协议栈自带的,将接收到的字符或固定的字符直接输出到PC串口 static void RXCB (ui nt8 p ort,ui nt8 event)uint8 usartbuf5;HalUARTRead(HAL_UART_ PORT_0,usartbuf,5);/该函数也是协议栈提供的串口相关的函数,是从串口中读取数据

15、,并存放在buf中HalUARTWrite(HAL_UART_ PORT_0,usartbuf,5);/将接收到的数据输出到 PC/这个函数完成的功能比较简单,还可以继续增加自己对接收的数据进行处理的函数编译后下载后,发现PC串口还是没有反应,应该还是zigbee协议栈多次使用条件编译的问题,应该是自己一下子禁止ZTOOL_P时,把串口某个功能禁止了。参考 Zigbee无线 传感器网络设计与实现中写的找到main中的HalDriverInit()函数,代码如下:void HalDriverl nit (void)HalTimerl ni t();#if (defined HAL_ADC) &

16、(HAL_ADC = TRUE)HalAdcI ni t();#en dif#if (defined HAL_DMA) & (HAL_DMA = TRUE) / Must be called before the init call to any module that uses DMA.HalDmaI ni t();#en dif#if (defi ned HAL_AES) & (HAL_AES = TRUE)HalAes In it();#en dif#if (defi ned HAL_LCD) & (HAL_LCD = TRUE)HalLcdI ni t();#en dif#if (de

17、fi ned HAL_LED) & (HAL_LED = TRUE)HalLed In it();/因为宏定义的问题,串口未能初始#en dif#if (defi ned HAL_UART) & (HAL_UART = TRUE)化,因此需要在编译器option进入工程设置,点左边的 C/C+ ComplierPrep rossor选项中Defind symbols ,加上HAL_UART = TRUE这句预编译HalUARTI ni t();#en dif#if (defined HAL_KEY) & (HAL_KEY = TRUE)HalKeyI nit();#en dif编译运行后,往串口输入hello,串口接收区终于出现了hello,(心)/。总结:禾

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论