Hello:
最近在做CC1310低功耗的产品,调试串口时出现了问题,串口将接收的数据打印出来,使用串口工具自动发送,每帧数据大小为14字节,接收缓冲区足够大,不会溢出,硬件为TI提供的CC1350 LaunchPad(CC1310和CC1350的软件设计一样)
串口发送的速率为100ms时,发送450~700左右帧数据时,串口不工作了;串口发送的速率为300ms时,发送350左右帧数据时,串口不工作了;发送数速率为1000ms时,发送2000多帧数据时,串口不工作了;
在线仿真时,运行逻辑是对的,复位之后模块又重新开始工作了,串口停止工作之后如果不复位则会一直处于这种状态;以下是测试代码(不能上传附件,文件在公司会被加密的)
static UART_Handle uart = NULL;
uint8_t buf[256];
// 硬件资源初始化
int uart_init(uint8_t baudIndex)
{
static const uint32_t baudRateTable[] = {
4800,9600,19200,38400,57600,115200};
UART_init();
UART_Params uartParams;
UART_Params_init(&uartParams);
uartParams.baudRate = baudRateTable[baudIndex];uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;uartParams.readTimeout = 20*1000ul/Clock_tickPeriod;
uart = UART_open(UART_BASE, &uartParams);
if(!uart){
return -1;
}return 0;
}
void uart_task_function(UArg arg0, UArg arg1)
{
int_fast32_t ret = -1;
uint8_t index = 0;
uint8_t rx_busy = 0;
while(1)
{
ret = UART_read(uart,buf + index,1);
if(1 == ret)
{
if(index ++ >= 255){
index = 0;
}
rx_busy = 1;
}
else
{
if(rx_busy)
{
rx_busy = 0;UART_write(uart,buf,index);
index = 0;
}
}
}
}
除了上述串口工作一段时间侯异常之外,还有几个问题
1、串口死机的与uartParams.readTimeout 设置的值有关,设置比较小时,很容易就死机了,请问这个参数一般设置多少合适?
2、目前在使用CC1310做低功耗的产品,需要串口中断唤醒,该怎么处理?是否有相应的范例可供参考
tom tian:
回复 Barbara Wu:
第二个问题解决了了,但是串口的问题还是会卡死;使用阻塞的方式读数据,对那些未知长度的数据不好处理
FreePom:
回复 tom tian:
串口卡死,大部分是因为缓存满了造成了内存溢出,注意一点就是Uart_Read()的size的大小,注意接收的时候不要超过这个大小。我感觉read的时候,底层会开一块size大小的内存,如果用的过程不小心很容易造成溢出,我的做法是用timeout跳出来就可以避免了