打印
[ZLG-ARM]

请问通过UCOS的UART中间件向485发数据的问题

[复制链接]
8065|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lw2008|  楼主 | 2008-5-29 09:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不用OS时,可用正常485收发:
向485发一帧数据(15字节),设一个全局变量Txln,发前置15。
在发送中断服务中发一个字节Txln递减,Txln为0时485方向位置反。

基于UCOS时:
串口中间件收发时,单纯串口收发很可靠,基于485时。
采用上面同样方式,因为中间是缓冲队列发送,不能确定何时发送结束,不能用上面的方法将485反向。

void UART1_Exception(void)
{
    uint8 IIR, temp, i;
    OS_ENTER_CRITICAL();
    while(((IIR = U1IIR) & 0x01) == 0)
    {
        switch (IIR & 0x0e)
        {
           case 0x02:  // THRE中断
                for (i = 0; i < 16; i++) // 向发送FIFO填充数据
                {
                    if(QueueRead(&temp, UART1SendBuf) == QUEUE_OK)
                    {
                        U1THR = temp;
                utxn--;
                if(utxn <= 1)
                {
                    IO0SET |= IO_485_DIR;  // 485收
                }  



请问有何好的方法解决。

相关帖子

沙发
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中间件发送

问题解决了,是在钩子函数里加代码解决的:
void uart1Hook (void)
{
   uint32 uiNum;
    uiNum = uartFifoStatus(UART1, TX_FIFO);
    if( uiNum >= QUEUE1SENDFIFOLEN+4){ 
        EnableRcv485;
    }               
}
但是一直搞不懂为什么发送队列的可用空间是QUEUE1SENDFIFOLEN+4?
不想深究了,可以用就行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

296

帖子

0

粉丝