串口通讯的流控提供了由于某种原因不能进行通讯时阻塞通讯的一种机制。流控可以使数据接收设备在不能接收数据时通知数据发送设备,使其停止发送。串口的流控经常采用硬件流控和软件流控两种方式。开发串口通讯程序的过程中,可根据实际需要决定是否采用流控,采用硬件流控还是软件流控。使用控件Mscomm32开发串口通讯程序简单直接,若需要计算机协调与外设的数据传数时,这种方法不能满足要求;直接调用WIN32API函数的开发串口通讯程序,可以灵活的对串口进行设置,但需要较多的Windows编程背景知识。
1、串口初始化
以前,配置串口号、波特率、流控、校验位,配置好寄存器,然后使用。
现在,在workspace下找到HAL\Target\CC2530EB\drivers的hal_uart.c文件,可以看到里面已经包括了串口初始化、发送、接收等函数。
workspace上的MT层,发觉有很多基本函数,前面带MT。包括MT_UART.C,我们打开这个文件。看到MT_UartInit()函数,这里也有一个串口初始化函数,没错Z-stack上有一个MT层,用户可以选用MT层配置和调用其他驱动。进一步简化了操作流程。
***************************************************
SampApp.c
SampApp_Init()
SampApp_TransID() = 0;
MT_UartInit();
***************************************************
进入MT_UartInit()修改相应初始化配置
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)//P1和P2则是串口0和串口1
uartConfig.callBackFunc = MT_UartProcessZToolData;
#elif defined (ZAPP_P1) || defined (ZAPP_P2)
uartConfig.callBackFunc = MT_UartProcessZAppData;
#else
uartConfig.callBackFunc = NULL;
#endif
/* Start UART */
#if defined (MT_UART_DEFAULT_PORT)
HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);
#else
/* Silence IAR compiler warning */
(void)uartConfig;
#endif
/* Initialize for ZApp */
#if defined (ZAPP_P1) || defined (ZAPP_P2)
/* Default max bytes that ZAPP can take */
MT_UartMaxZAppBufLen = 1;
MT_UartZAppRxStatus = MT_UART_ZAPP_RX_READY;
#endif
}
***************************************************
#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_38400 默认的波特率是 38400bps,
我们修改成 115200bps,修改如下:#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200
***************************************************
#define MT_UART_DEFAULT_OVERFLOW TRUE默认是打开串口流控的,
如果你是只连了 TX/RX 2 根线的方式务必关流控,本功能底板只连了 TX/RX 2 根线
#define MT_UART_DEFAULT_OVERFLOW FALSE
注意: 2 根线的通讯连接务必关流控,不然是永远收发不了 信息的。
***************************************************
用 ZTOOL,串口 0。我们可以在 option——C/C++ 的 CompilerPreprocessor 里面看到,已经默认添加 ZTOOL_P1 预编译。
***************************************************
2、登记任务号
void SampleApp_Init( uint8 task_id )
MT_UartInit();
MT_UartRegisterTaskID(task_id);//登记任务号
把串口事件通过 task_id 登记在 SampleApp_Init();
3、串口发送
void SampleApp_Init( uint8 task_id )
MT_UartInit();
MT_UartRegisterTaskID(task_id);//登记任务号
HalUARTWrite(0, "Hello,world\n", 12); //(串口, 字符, 字符个数)
***************************************************
SampleApp.c
#include "MT_UART.h" //串口头文件引用
***************************************************
选择 CoordinatorEB, 点解下载并调试,全速运行。可以看到串口助手收到信息。
发现 Hello World 后面有一小段乱码。这是 Z-stack MT 层定义的串口发送格式,还有液晶提示信息。如果不想要的可以在预编译地方Project--Options--C/C++ Compiler--Preproce--Defined symbols 把 MT 和 LCD 相关内容注释。如:
ZTOOL_P1
xMT_TASK
xMT_SYS_FUNC
xMT_ZDO_FUNC
xLCD_SUPPORTED=DEBUG
xMT_TASK: 表示没有定义 MT_TASK,也就是不定义了。
改好的重新编译再下载,按复位键,观察串口已经没有乱码了。
拓展:
我们在协议栈里再做一个测试,在 osal_start_system()函数里 for(;;)里加入:
HalUARTWrite(0,”Hello,World\n”,12);
下载运行后发现串口不停地接收到 Hello,World。
这就证明了前一节的协议栈运行后会在这个函数里不停地循环查询任务、执行任务。
这只是一个演示用的方法,实际应用中你可千万不能有把串口发送函数弄到这个位置,然后给 PC 发信息。
因为这破坏了协议栈任务轮询的工作原则,相当于我们普通单片机不停用 Delay 延时函数一样,是极其低效的。
原文链接:https://blog.csdn.net/scgaliguodong123_/article/details/41680849
本站声明:网站内容来源于网络,如有侵权,请联系我们,我们将及时处理。
还没有人抢沙发呢~