请教:CC1310串口接收数据有缺失并且跑几分钟后会挂掉 什么原因
如题。
我做了个测试:通过电脑串口给cc1310的串口每隔1s发送200个数据,并且设置个定时器,每隔1s监测一遍是否收到数据,如果有收到就将收到的数据长度打印出来。结果发现中间有时候会丢数据(收到的小于200个数据);并且跑几分钟后系统会死掉,这是测试结果图;
以下是我的代码:
#define UART_TASK_STACK_SIZE 1500
#define UART_TASK_PRIORITY 2
void UartTask_init(void) {
UartFifo_init(&Uart_ReceiveFiFo);
/* Create event used internally for state changes */
Event_Params eventParam;
Event_Params_init(&eventParam);
Event_construct(&uartEvent, &eventParam);
uartEventHandle = Event_handle(&uartEvent);
/* Create the node task */
Task_Params_init(&uartTaskParams);
uartTaskParams.stackSize = UART_TASK_STACK_SIZE;
uartTaskParams.priority = UART_TASK_PRIORITY;
uartTaskParams.stack = &uartTaskStack;
Task_construct(&uartTask, UartTaskFunction, &uartTaskParams, NULL);
}
// Callback function
void Uart_ReadCallback(UART_Handle handle, void *rxBuf, size_t size)
{
memcpy(Uart_ReceiveFiFo.Buf, (uint8_t *)rxBuf, size);
Uart_ReceiveFiFo.In += size;
UART_read(handle, Uart_RxTempBuf, 1);
}
// Callback function
void Uart_WriteCallback(UART_Handle handle, void *txBuf, size_t size)
{
// Start another read, with size the same as it was during first call to UART_read()
UART_read(handle, Uart_RxTempBuf, 1);
}
Void UartTaskFunction(UArg arg0, UArg arg1)
{
uint8_t tmp_data = 0; /* Create a UART with data processing off. */
UART_Params uartParams;
UART_Params_init(&uartParams);
uartParams.readMode = UART_MODE_CALLBACK;
uartParams.readCallback = Uart_ReadCallback;
uartParams.writeCallback = Uart_WriteCallback;
uartParams.writeMode = UART_MODE_CALLBACK;
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudRate = 115200;
uartHdl = UART_open(Board_UART0, &uartParams);
if (uartHdl == NULL) {
System_abort("Error opening the UART");
}
UART_read(uartHdl, Uart_RxTempBuf, 1);
UART_write(uartHdl, "\r\nJust for a test......\r\n", 25);
/* Loop forever echoing */
while (1){
}
}
static void clk0Fxn(UArg arg0)
{
if(Uart_ReceiveFiFo.In)
{
Uart_PrintfStringDigital("\r\n cnt = ", Uart_ReceiveFiFo.In, 10);
Uart_ReceiveFiFo.In = 0;
}
}
请问有谁遇到过这样的问题或者帮忙找下这个原因吗?
有可能是buffer溢出,可以尝试多次频繁发送较少的包
或者在程序里面自己做一个缓冲区来存放数据
不可能溢出啊,这里我发送的数据比缓冲区少啊,并且收完就清了啊。
有没有可能是串口没有处理过来然后丢数据了?
发少量数据也会出现, 最后卡死
附件是基于EasyLink做的代码,从串口获取数据然后通过RF无线发送出去
麻烦您试一下
首先谢谢 WBJ,你发的代码我看了下,基本跟我原来的一样(呵呵,也是之前在论坛上看到的忘记是谁-- 好像是你吧 哈哈, 发的一个自己写的串口中断demo, 我就是根据那个配置改过来的, 也就是跟你这个配置是一样的)。 这样应该会出现卡死情况的。 不过现在问题解决了,我在E2E那边也发了帖子,
http://e2e.ti.com/support/wireless_connectivity/proprietary_sub_1_ghz_simpliciti/f/156/t/538869
其中Topcat讲,他们的串口驱动应该是有问题的,存在buffer溢出问题,应该在九月中旬出新版本更改这个问题;
然后就是Eric Brundick同志指出每次读一个字节很浪费不效率,根据他的方法建议修改了每次读的字节数以及使UARTCC26XX_CMD_RETURN_PARTIAL_ENABLE,经过实际测试,好像基本规避了我的问题,行之有效,后续我会继续测试稳定性。
希望有此问题的童鞋共同关注,相互讨论,一起进步。
你好,很高兴看到你发了这样的帖子,我在串口读数据uart_read()这边也遇到了问题,在用WBJ那个例程中串口代码读数据有时读不到数据,有时有数据丢失现象,不太明白例程中为什么每次只读一个字节,而且还需要一个UART_read(handle, Uart_RxTempBuf, 1)?uart.h头文件里提到不要在自身callback中调用uart_read(),为什么这边这样使用?
我自己写了一个固定长度的Rxbuf[RX_LEN],长度为128,每次回调中拷贝128字节长度的buf,但是在用串口助手发送,比如abcd这样的数据,再用uart_write向串口写数据显示,串口没有数据。用按键触发发送一个固定的字符串用uart_write(),是可以的,也看了Eric Brundick提出的建议,加了之后没效果,每次读一个字节这效率也太低了,uart_read()在使用的时候有什么需要注意的吗?有点费解,求指点一二,谢谢了!
Hi JingXia, Jad json,
很高兴你的问题解决了。
当时写这个代码的时候只读一个字节的原因应该是当时的driver里面UART_RETURN_NEWLINE这个配置似乎是不支持的。
所以我希望通过发送/0字节标志这一句话已经发完了,来区分串口收到的不同命令。
如果有不同的使用需求,肯定是可以根据需求修改的。
现在版本的uart driver肯定已经做了更新和改进。
你好,麻烦测一下你的这个例子,每次只发送一个字节的数据。
我这边的现象是多个字节一起发是可以 ,一个字节发是有问题的。
您好:
我现在也是串口运行会卡死,你是怎么解决的呢?谢谢你
hello,你的问题解决了没?
我也发了一个帖子 ,帮忙看看是不是类似的问题
http://www.deyisupport.com/question_answer/wireless_connectivity/f/45/t/142719.aspx