[ZLG-ARM] 请问通过UCOS的UART中间件向485发数据的问题

[复制链接]
8888|3
 楼主| lw2008 发表于 2008-5-29 09:06 | 显示全部楼层 |阅读模式
不用OS时,可用正常485收发:<br />向485发一帧数据(15字节),设一个全局变量Txln,发前置15。<br />在发送中断服务中发一个字节Txln递减,Txln为0时485方向位置反。<br /><br />基于UCOS时:<br />串口中间件收发时,单纯串口收发很可靠,基于485时。<br />采用上面同样方式,因为中间是缓冲队列发送,不能确定何时发送结束,不能用上面的方法将485反向。<br /><br />void&nbsp;UART1_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;IIR,&nbsp;temp,&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_ENTER_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;while(((IIR&nbsp;=&nbsp;U1IIR)&nbsp;&&nbsp;0x01)&nbsp;==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;switch&nbsp;(IIR&nbsp;&&nbsp;0x0e)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;0x02:&nbsp;&nbsp;//&nbsp;THRE中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;16;&nbsp;i++)&nbsp;//&nbsp;向发送FIFO填充数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(QueueRead(&temp,&nbsp;UART1SendBuf)&nbsp;==&nbsp;QUEUE_OK)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;U1THR&nbsp;=&nbsp;temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utxn--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(utxn&nbsp;&lt=&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;|=&nbsp;IO_485_DIR;&nbsp;&nbsp;//&nbsp;485收<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br /><br /><br /><br />请问有何好的方法解决。
zxsxr 发表于 2008-8-6 09:11 | 显示全部楼层

我有相同的困难

  
zxsxr 发表于 2008-8-6 09:32 | 显示全部楼层

请高手指教关于uart库函数使用485问题

我用2103的UART库函数发送485数据时发现,无法确认数据已经发送完成,因为提供的查发送队列的函数uartFifoStatus()只能确认队列空,不能确认已经发送完成,我想改发送完成中断函数__uartThre或在钩子函数里添加程序但不知如何下手,请高手指教。
zxsxr 发表于 2008-8-6 11:00 | 显示全部楼层

485uart中间件发送

问题解决了,是在钩子函数里加代码解决的:<br />void&nbsp;uart1Hook&nbsp;(void)<br />{<br />&nbsp;&nbsp;&nbsp;uint32&nbsp;uiNum;<br />&nbsp;&nbsp;&nbsp;&nbsp;uiNum&nbsp;=&nbsp;uartFifoStatus(UART1,&nbsp;TX_FIFO);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;uiNum&nbsp;&gt=&nbsp;QUEUE1SENDFIFOLEN+4){&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnableRcv485;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />但是一直搞不懂为什么发送队列的可用空间是QUEUE1SENDFIFOLEN+4?<br />不想深究了,可以用就行了。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

296

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部