11 在ZStack里实现uart数据输出功能
来源:互联网 发布:手机淘宝直通车在哪里 编辑:程序博客网 时间:2024/06/01 09:29
在ZStack里的uart功能封装在HAL/Include/hal_uart.h头文件里:
#define HAL_UART_BR_9600 0x00#define HAL_UART_BR_19200 0x01#define HAL_UART_BR_38400 0x02#define HAL_UART_BR_57600 0x03#define HAL_UART_BR_115200 0x04/* Frame Format constant *//* Stop Bits */#define HAL_UART_ONE_STOP_BIT 0x00#define HAL_UART_TWO_STOP_BITS 0x01/* Parity settings */#define HAL_UART_NO_PARITY 0x00#define HAL_UART_EVEN_PARITY 0x01#define HAL_UART_ODD_PARITY 0x02/* Character Size */#define HAL_UART_8_BITS_PER_CHAR 0x00#define HAL_UART_9_BITS_PER_CHAR 0x01/* Flow control */#define HAL_UART_FLOW_OFF 0x00#define HAL_UART_FLOW_ON 0x01/* Ports */#define HAL_UART_PORT_0 0x00#define HAL_UART_PORT_1 0x01#define HAL_UART_PORT_MAX 0x02...typedef void (*halUARTCBack_t) (uint8 port, uint8 event);...typedef struct{ bool configured; uint8 baudRate; bool flowControl; uint16 flowControlThreshold; uint8 idleTimeout; halUARTBufControl_t rx; halUARTBufControl_t tx; bool intEnable; uint32 rxChRvdTime; halUARTCBack_t callBackFunc;}halUARTCfg_t;...extern void HalUARTInit ( void ); //uart工作模式初始化函数,在系统启动时已调用extern uint8 HalUARTOpen ( uint8 port, halUARTCfg_t *config );//打开串口,并指定uart的配置参数extern void HalUARTClose ( uint8 port ); //关闭串口extern uint16 HalUARTRead ( uint8 port, uint8 *pBuffer, uint16 length ); //接收串口数据extern uint16 HalUARTWrite ( uint8 port, uint8 *pBuffer, uint16 length ); //发出串口数据extern uint16 Hal_UART_RxBufLen ( uint8 port ); //返回串口port的需要接收的数据长度(接收缓冲区里的数据长度)extern uint16 Hal_UART_TxBufLen ( uint8 port ); //返回串口port的尚未发出的数据长度(发送缓冲区里的数据长度) ...
//////////////////////////////////////////////////////////////////////////////////////
串口的使用方法: 只要HalUARTOpen(…)打开串口后,再调用HalUARTRead(…)就可以接收数据, 调用HalUARTWrite(…)就可以发出数据了.
但用不着麻烦了,在工程MT/MT_UART.c里已经实现好由MT任务处理uart的驱动代码:
void MT_UartInit (){ halUARTCfg_t uartConfig; /* Initialize APP ID */ App_TaskID = 0; /* UART Configuration */ uartConfig.configured = TRUE; uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE; //波特率 uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW; //流控 uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD; uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF; uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF; uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT; uartConfig.intEnable = TRUE;#if defined (ZTOOL_P1) || defined (ZTOOL_P2) //宏在工程配置里设置 uartConfig.callBackFunc = MT_UartProcessZToolData; //指定串口接收数据的函数 ...#endif /* Start UART */#if defined (MT_UART_DEFAULT_PORT) HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig); //打开串口,并指定配置#else /* Silence IAR compiler warning */ (void)uartConfig;#endif...}/////////void MT_UartRegisterTaskID( byte taskID ){ App_TaskID = taskID; //在MT_UART.c里用全局变量App_TaskID存放需要接收串口数据的任务号.}void MT_UartProcessZToolData ( uint8 port, uint8 event ) //{ uint8 ch; uint8 bytesInRxBuffer; (void)event; // Intentionally unreferenced parameter while (Hal_UART_RxBufLen(port)) //判断是否已经有数据接收 { HalUARTRead (port, &ch, 1); //接收数据 ... } ...}
//////////////
MT任务的初始化:
void osalInitTasks( void ) //系统初始化所有任务的函数{ uint8 taskID = 0; ...#if defined( MT_TASK ) //宏可在工程配置里指定 MT_TaskInit( taskID++ );#endif ... MyApp_Init(taskID);}const pTaskEventHandlerFn tasksArr[] = { ...#if defined( MT_TASK ) MT_ProcessEvent,#endif ... MyApp_ProcessEvent,};void MT_TaskInit(uint8 task_id){ MT_TaskID = task_id; ... MT_UartInit(); //串口初始化函数, 我们不需要再次调用此函数了 ...}...//////////////////
要想让MT任务对串口进行操作,需要让宏MT_TASK和宏ZTOOL_P1成立才可以。
在工程里的配置:
///////////////////////////////////////////////////////////////////////////////////////////////////
在MyApp任务上加上串口的发出功能:
//注意修改下MT_UartInit里所用的参数#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_9600#define MT_UART_DEFAULT_OVERFLOW FALSE//////////////////////// 系统在启动时会自动调用MT_UartInit串口初始化函数,初始化第0个串口.// HalUARTWrite(HAL_UART_PORT_0, ...) 调用此函数就可以发出数据了
MyApp.c //实现按键时输出字符串
#include "OnBoard.h"#include "MyApp.h"#include "hal_led.h"#include "hal_key.h"#include "MT_UART.h"#include "hal_uart.h"#include "MT.h"#define TIME_OUT_EVENT 0x4#define TIME_LEN 2000uint8 mytask_id; //用于存放本身的任务号void MyApp_Init(uint8 task_id ){ mytask_id = task_id; RegisterForKeys(mytask_id); //设置当前任务接收按键消息}uint16 MyApp_ProcessEvent(uint8 task_id, uint16 events ){ keyChange_t *key_evt; if ( events & SYS_EVENT_MSG ) //当有按键消息时,任务的事件会是SYS_EVENT_MSG { key_evt = (keyChange_t *)osal_msg_receive(mytask_id); if (key_evt->hdr.event == KEY_CHANGE) { if (key_evt->keys & HAL_KEY_SW_1) HalUARTWrite(HAL_UART_PORT_0, "btn1\n\r", 6); if (key_evt->keys & HAL_KEY_SW_2) HalUARTWrite(HAL_UART_PORT_0, "btn2\n\r", 6); } osal_msg_deallocate( (uint8 *)key_evt ); //回收消息的空间 } if (events & TIME_OUT_EVENT) //定时器的事件 { ; } return 0;}
阅读全文
0 0
- 11 在ZStack里实现uart数据输出功能
- 12 在ZStack里实现uart数据接收功能
- Zstack之uart中断方式数据发送
- 09 在ZStack里的定时器应用
- 10 在ZStack里的按键驱动
- 在UITextView里实现类似超链接功能
- 在c语言里实现删除功能
- 07 在ZStack里创建自己的task
- 08 在ZStack里的led灯控制
- 13 在ZStack里设置pan ID和信号输出功率
- 14 在ZStack里的网络广播传输
- Qt实现UART串口调试功能
- 在CRM 4.0 里用导入向导功能更新数据
- MapReduce功能实现四---小综合(从hbase中读取数据统计并在hdfs中降序输出Top 3)
- 在sql 里实现asp中split的功能
- 在页面里实现DIV放大、缩小的功能
- 如何在免费的试用版里实现自毁的功能
- 在NESYS3上实现UART(VHDL)
- java加密之AES/CBC/PKCS5Padding
- setSizePolicy -- QSizePolicy
- 简单使用Apache poi 生成excel
- 二分 lower_bound,upper_bound
- 杭电oj1005
- 11 在ZStack里实现uart数据输出功能
- 数组转换成集合中的Arrays.asList用法
- HDU6045(此题有坑,拉低了A率)
- HDU 6045 Is Derek lying?
- vs2013,2015,2017 常用的插件
- css3布局
- python else用法
- 为什么matlab有的函数文件可以直接运行而有的不行
- web.xml报错“Attribute "xmlns" was already specified for element "web-app".”