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.

zstack 中控制485数据收发方向 如何实现?

Other Parts Discussed in Thread: CC2531

德州的技术工程师们:

       我采用cc2531+zstack2.5.1a来做一个串口数据透传模块,将无线收到的数据通过485发送给设备,或将通过设备得到的数据通过无线发送到网络。现在的一个问题是程序中需要控制485的收发数据方向,我想将模块平常设置为接收数据,需要发送数据时才置为发送方向,一旦发送完成立即切换回接收方向。

       现在的问题是,我不知道何时数据已经发送完成。目前采用计时的方式,根据发送字节定时一定时间后切换回接收,这样处理在数据收发频繁的时候效果不好,会丢包。我注意到串口驱动里边有Hal_UART_TxBufLen() 函数,查询发送缓存,但是不能使用该函数。另外我还看到hal_uart.h中定义了一个HAL_UART_TX_EMPTY 的串口发送空的事件,但是不知道怎么才能使用该事件。请教德州的技术们,我该如何操作,或者有其他更好的解决办法?

      另外我使用的TI提供sampleAPP工程进行修改,串口数据读取和发送采用的DMA方式。

  • 参考了下这个帖子的修改方法:

    http://e2e.ti.com/support/low_power_rf/f/158/t/85122.aspx

    试验证明能通过。将DMA转换为ISR的办法是:

    我在编译选项里边增加了两条

    HAL_UART_DMA=0
    HAL_UART_ISR=1

    另外修改的程序不知道路径在什么地方,我是通过sourceinsight 找到这里然后修改的,只知道文件名是 _hal_uart_isr.c

    MicroWait() 函数需要添加头文件 OnBoard.h

  • 另外我还有个问题需要请教,就是串口在进行数据透传的时候,如果发送频率小于600ms,就会感觉停顿,即有数据包丢失。

    我的试验是 协调器 发送一个命令(12字节) 到路由,其中一个路由接了一个设备,收到这个命令后会立即返回一个数据包(25字节)

    测试的时候,协调器发送间隔设置为 小于600ms时,协调接收到的数据包就会正常接收几个后 就停一下,然后继续收几个又停一次。

    请问大家谁遇到类似的问题了么?或者有什么好的方法找出是是么原因?

  • 有没有ED类型的设备?如果有,ED采用POLL的方式,他的父节点帮他缓存数据,等待ED来提取。那显然缓存是有限的,缓存会保持一段时间,如果它满了,这段时间你又有数据进来,它存不下肯定丢失。你可以提高POLL的速度,或者把设备改为Router试试。

  • 没有,设备为1一个协调+2个路由。

    我发送无线信息时,地址用的 组。和这个有关系没?

    我仿真看了下,找到原因是因为下面的路由设备发送无线信息的时候失败,然后重新进行发送。造成上面接收到数据延迟了,所以看起来有停顿的现象。

    但是让我不理解的是,发送不成功也这么有规律吗?按道理来说600ms一次并不频繁,因为他们双方传送的数据包都不大。 大家能指点下这个是什么原因造成的吗?