C6748 UART 同时接受与发送数据遇到的问题 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 79|回复: 1

[已解决] C6748 UART 同时接受与发送数据遇到的问题

[复制链接]

18

主题

40

帖子

318

积分

中级会员

Rank: 3Rank: 3

积分
318
发表于 2018-11-7 10:22:01 | 显示全部楼层 |阅读模式
本帖最后由 xiaoluoshan 于 2018-11-8 15:43 编辑

在任务中,发送数据前,置位标志位1,填好第一包使能发送中断,后续发送在中断中处理,中断发送结束后,置位标志位为0,并关闭发送中断;
在中断中接受数据,接受完一帧数据后,发送给任务处理;

在发送数据的同时,下发数据,会出现不进入中断的情况:

中断处理代码为:
void UARTISR ()
{
    GR_U32 u32int_id = 0;
    GR_U32 u32fifo_status = 0;
    GR_U8 u8CharData = 0;//收到的1字节数据
    GR_U32 u32SerialData= 0;
    GR_U16 u16Class = 0,u16Type = 0;
    GR_U16 u16PutCharCount = 0, u32Temp;

    // 确定中断源
    u32int_id = UARTIntStatus(SOC_UART_1_REGS);
    //IntEventClear(SYS_INT_UART1_INT);

    // 发送中断
    if (UART_INTID_TX_EMPTY == u32int_id)
    {
        if (DalUartSendBusy(UART1))
        {
            while ((tUart1Buf.u32SendBufPos < tUart1Buf.u32SendBufLen) && (u16PutCharCount < 16))
            {
                HWREG(SOC_UART_1_REGS + UART_THR) = tUart1Buf.u8SendBuf[tUart1Buf.u32SendBufPos];
                tUart1Buf.u32SendBufPos++;
                u16PutCharCount++;
            }
        }
        if (DalUartSendBusy(UART1))
        {
            if (tUart1Buf.u32SendBufPos == tUart1Buf.u32SendBufLen)
            {
                tUart1Buf.u32SendBufPos = 0;
                tUart1Buf.u32SendBufLen = 0;
                tUart1Buf.s32SendStatus = 0;
                UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);
            }
        }
    }
    // 接收中断
    if (UART_INTID_RX_DATA == u32int_id)
    {
        u32fifo_status = DalUartReadBusy(UART_PORT);
        vCommPortTimersEnable();
        while (u32fifo_status)
        {
           //接收串口数据,放到全局缓冲区中
            DalUartCharGet(UART_PORT, (GR_S8 *)&u8CharData, 0);           
   //  拷贝至全局数组中
  …………………………
            u32fifo_status = DalUartReadBusy(UART_PORT);
        }
    }
    // 接收错误
    if (UART_INTID_RX_LINE_STAT == u32int_id)
    {
        u32Temp = UARTRxErrorGet(SOC_UART_1_REGS);
        while(u32Temp)
        {
            while(DalUartReadBusy(UART_PORT))
            {
                // RBR 读一个字节
                UARTCharGetNonBlocking(SOC_UART_1_REGS);
            }
            u32Temp = UARTRxErrorGet(SOC_UART_1_REGS);
        }
    }
    else if ((UART_INTID_RX_LINE_STAT != u32int_id)
            && (UART_INTID_RX_DATA != u32int_id)
            && (UART_INTID_TX_EMPTY != u32int_id))
    {
        u32int_id = u32int_id;
    }
}


我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励0 , 目前已有1人回答

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
最近访问 头像模式 列表模式
回复

使用道具 举报

18

主题

40

帖子

318

积分

中级会员

Rank: 3Rank: 3

积分
318
 楼主| 发表于 2018-11-7 10:24:15 | 显示全部楼层
任务实现代码如下:

while (tUart1Buf.s32SendStatus)

    {

        DalOsTaskSleep(1);

    }

    if (u16DataLen > 0)

    {

        tUart1Buf.s32SendStatus = 1;

        tUart1Buf.u32SendBufLen = u16DataLen;

        tUart1Buf.u32SendBufPos = 0;

        memcpy(tUart1Buf.u8SendBuf,pu8Data,u16DataLen);

        UARTIntDisable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);

        if (DalUartSendBusy(UART1))

        {

        u16Count = 0;

            while ((tUart1Buf.u32SendBufPos < tUart1Buf.u32SendBufLen) && (u16Count < 16))

            {

                HWREG(SOC_UART_1_REGS + UART_THR) = tUart1Buf.u8SendBuf[tUart1Buf.u32SendBufPos];

                tUart1Buf.u32SendBufPos++;

                u16Count++;

            }

        }

        UARTIntEnable(SOC_UART_1_REGS, UART_INT_TX_EMPTY);

    }

    while (tUart1Buf.s32SendStatus)

    {

        DalOsTaskSleep(1);

    }   
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则  回帖提醒

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号-1  

GMT+8, 2018-11-17 16:33 , Processed in 0.142769 second(s), 37 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表