微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > 串口读取数据后,再调用串口输出数据函数没有反应

串口读取数据后,再调用串口输出数据函数没有反应

时间:10-02 整理:3721RD 点击:

使用Z-Stack Energy 1.1.0进行开发时,想通过串口调试助手向CC2530协调器发送数据后,协调器立即将收到的数据发送至串口调试助手,但是发现串口可以收到数据但是不能调用发送数据至串口调试助手,接收使用的是自己写的回调函数,如下:

void MT_UartInit ()
{
halUARTCfg_t uartConfig;

/* Initialize APP ID */
App_TaskID = 0;

/* UART Configuration */
uartConfig.configured = TRUE;
//uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;
uartConfig.baudRate = HAL_UART_BR_115200;
#ifdef ZNP_UART_TEST
uartConfig.flowControl = FALSE;
#else
uartConfig.flowControl = TRUE;
#endif
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;
uartConfig.callBackFunc = rxCB;
#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

}

回调函数如下:

void rxCB( uint8 port, uint8 event )
{

uint8 rxlen;
uint8 databuf[128];
rxlen=Hal_UART_RxBufLen(port);

if (rxlen)
{
HalUARTRead (port, databuf, rxlen);
HalUARTWrite ( port, "Received!", 9 );

}

}

请问HalUARTWrite为什么不能正常发送? 

ps:如果在HalUARTRead (port, databuf, rxlen);后重新打开串口,HalUARTOpen,设置新的uartConfig,HalUARTWrite就又能够向调试助手发送数据了,HalUARTWrite在使用前一定要重新打开串口吗?

设备类型是哪种,Enddevice,Router or CO.  关闭下POWER_SAVING试试。

设备是协调器,没找到在哪里关闭POWER_SAVING。。。

协调器本身就关闭了。 是否开启了一些MT的功能?因为MT会使用串口。

搜索MT_UartInit,并设置断点,看是否会进入这个函数。

会使用MT_UartInit (),不过我将初始化中的uartConfig.callBackFunc = rxCB中的回调函数改成自己写的了,可以正常接收数据,但是无法再使用HalUARTWrite()向该串口写数据,除非重新再对该串口初始化,并将uartConfig.callBackFunc = NULL的回调函数设置为空,才能正常向串口写数据,不过这样串口又无法正常接收调试助手发送的数据了,向串口写数据之前一定要再重新对串口进行初始化吗?

不需要的,你这个写法我没觉得有问题,我测试了下,可以发送没有问题(HA stack ,not SE).

你可以尝试不改callback,就在默认的callback里回调一下发送试试。

在Z-Stack Home 1.2.1和Z-Stack Energy 1.1.0均试过了,还是无法在收到数据后写数据到串口,也在原来的回调函数里测试过了,没有反应,但是如果单独在应用层初始化串口,再向调试助手写数据就可以,总之无法同时读写同时进行

就用home1.2.1a的SampleSwitch, 什么都不改,只在MT_UART.C 的MT_UartProcessZToolData里增加一行:

没道理啊,我这边打印一点问题没有。

  while (Hal_UART_RxBufLen(port))
  {
    HalUARTRead (port, &ch, 1);
    HalUARTWrite(port, &ch, 1);

    ......

}

嗯,后来感觉是HalUARTWrite()这个函数在没有初始化好,就是了一下直接在 MT_UartInit ()后向串口写数据,果然没有,之后就改了一下初始化串口的配置,将uartConfig.flowControl  = FALSE,因为没找到ZNP_UART_TEST这个条件编译在哪里定义的就都改为FALSE了,后来试了一下,可以向串口写数据了

流控我以为默认的情况下是FALSE的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top