串口读取数据后,再调用串口输出数据函数没有反应
使用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的