This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

关于串口的问题

Other Parts Discussed in Thread: CC2530, CC2652R

咨询一个问题:

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

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

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

  • 我想请教一下,之前您有做过测试吗?这个时间间隔最短是多少?
  • 我最短試過30-40ms左右
  • 适当加大间隔,这说明uart 接收有问题,试试50ms 以上。
  • TI Alvin您好:
    我在使用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使用过多,只能这样修改,扩大缓冲。

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

    至于你的说的你的网关+SOC。如果可以建议使用我们TI的提供ZNP+SOC的方案。
  • 我們网关用CC2530+mt command,每30-50ms收到80 bytes是沒有問題的,給你參考看看,你可能要查看看是不是你uartConfig.callBackFunc回调函数自己新增的程序處理不及造成数据丢失
  • 你好,我的应用中收数据没有问题,CC2530发送数据存在问题,发送数据量大,缓冲区小,导致的
  • 如果覺得是缓冲区小导致的,看看要不要考慮換用CC2652R
  • Alvin您好:
    您的意思是:可以修改为:
    uint8 txBuf[1][HAL_UART_DMA_TX_MAX];
    txIdx_t txIdx[1];

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

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

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

    谢谢
  • 你可以适当加大,但是不建议太大,慢慢试试。目前看来是8ms ,接收没有问题,但是UART打印速度跟不上数据接收速度,试着去加大间隔也可以。