TI中文支持网
TI专业的中文技术问题搜集分享网站

关于串口的问题

咨询一个问题:

我使用的是CC2530,ZStack-1.2.2a,我向串口发送数据的时候,两条数据的间隔比较短,结果串口输出的数据就出现了问题,我想请问一下,两条数据之间的间隔最小是多少?

YiKai Chen:

我向串口发送数据的时候,两条数据的间隔比较短

可以說明一下你两条数据的间隔?可以的話用程式碼說明

user5355203:

回复 YiKai Chen:

我想请教一下,之前您有做过测试吗?这个时间间隔最短是多少?

YiKai Chen:

回复 user5355203:

我最短試過30-40ms左右

Alvin Chen:

回复 user5355203:

适当加大间隔,这说明uart 接收有问题,试试50ms 以上。

xin dong:

回复 Alvin Chen:

TIAlvin您好:
我在使用UART的配置如下:
(1)CC2530协议栈,ZStack-1.2.2a,使能了ZTOOL_P1,也就是 HAL_UART_PORT_0 + HAL_UART_DMA = 1开启
(2)uartConfig.callBackFunc的回调函数自己新增,不使用MT相关的
(3)波特率38400
问题如下:
(1)uart发送数据:uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len) ->HalUARTWriteDMA(buf, len);
经常发现返回值为0的情况,导致数据丢失
应用场景:zigbee网关设备:ARM(LINUX) + cc2530(SOC),协调器广播数据,设备响应后,上报的数据,协调器通过UART发送给ARM,由于瞬间的数据量较大,同时UART发送慢,导致UART TX缓冲区满,这样数据就会丢失。
比如:协调器广播一个开关设备的开命令,10个设备同时响应,每个设备发送数据的时间也就约为8ms,协调器处理数据后(按照自定义的与ARM通信协议),最后每个设备的数据约为20字节,如果是10个设备,就是200个字节,时间大约在80ms。实际按照38400bps,80ms可以发送约为320个字节。uart消费数据的速率大于应用向缓冲区生产数据的速率。

然而实际并不是这样。

目前方案:
在一定的应用需求下(广播产生的数据量有上限),适当的增加缓冲区,满足应用。
请问:uint8 txBuf[2][HAL_UART_DMA_TX_MAX];txIdx_t txIdx[2];
是否可以将以上的buff写成:uint8 txBuf[1][HAL_UART_DMA_TX_MAX];txIdx_t txIdx[1];
这样就可以将HAL_UART_DMA_TX_MAX扩大。
目前的配置:HAL_UART_DMA_TX_MAX = 128 ,如果修改,就可以改为256。

其次这里的双缓冲区,在实际中,个人感觉,没有体现出乒乓缓冲的优点(或者只是为了避免可能同时操作buff)??
目前协调器RAM使用过多,只能这样修改,扩大缓冲。

谢谢指导。

Alvin Chen:

回复 xin dong:

是可以修改,但是要考虑你的应用,由于CC2530自身的限制,我们不是很推荐使用UART。

至于你的说的你的网关+SOC。如果可以建议使用我们TI的提供ZNP+SOC的方案。

YiKai Chen:

回复 xin dong:

我們网关用CC2530+mt command,每30-50ms收到80 bytes是沒有問題的,給你參考看看,你可能要查看看是不是你uartConfig.callBackFunc回调函数自己新增的程序處理不及造成数据丢失

xin dong:

回复 YiKai Chen:

你好,我的应用中收数据没有问题,CC2530发送数据存在问题,发送数据量大,缓冲区小,导致的

YiKai Chen:

回复 xin dong:

如果覺得是缓冲区小导致的,看看要不要考慮換用CC2652R

xin dong:

回复 Alvin Chen:

Alvin您好:
您的意思是:可以修改为:
uint8 txBuf[1][HAL_UART_DMA_TX_MAX];
txIdx_t txIdx[1];

那协议栈写成2的目的是什么?是为了避免什么问题?

目前我们这样使用,生产出货很多了;其次修改太大。

ZNP方案,应用没有,那就可以扩大buff,是不是这个意思?

谢谢

赞(0)
未经允许不得转载:TI中文支持网 » 关于串口的问题
分享到: 更多 (0)