zstack 中控制485数据收发方向 如何实现?
德州的技术工程师们:
我采用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一次并不频繁,因为他们双方传送的数据包都不大。 大家能指点下这个是什么原因造成的吗?