C -PIC18FXXXXX UART TX消息功能



我当前正在使用PIC18F67J60尝试使用UART打印字符串和/或整数值,但仅从中获得" 00"。我对嵌入式C有些新鲜,所以我实际上可能缺少一些东西。

该功能定义为:

u8 UART_TxMessage(u8 Count, u8 *Bufr)
{
    if (Timer_Expired(RxTimer))
    {
        Timer_Stop(RxTimer);
        RxIndex = 0;
    }
    if (TxCount)
        return(0); // still sending last message
    if (Count > MAX_MSG)
        return(Count);
    memcpy(TxBufr,Bufr,Count);
    TxIndex = 0;
    TxCount = Count;
    PIR1bits.TX1IF = 0;
    TXREG1 = Count;
    PIE1bits.TX1IE = 1;
    return(Count);
}

除了" 00"以外,我唯一能够获得其他任何东西的方法是回荡在RX侧收到的内容;因此,我相信这只是我缺乏知识。

我真的很感谢任何例子!

ISR函数按要求:

void UART_ISR()
{
    u8 c;
    if (PIR1bits.TX1IF && PIE1bits.TX1IE)
    {
        PIR1bits.TX1IF = 0;
        if (TxIndex < TxCount)
        {
            TXREG1 = TxBufr[TxIndex++];
        } else {
            PIE1bits.TX1IE = 0;
        }
    }
    if (PIR1bits.RC1IF)
    {
        Timer_Set(RxTimer,100);
        PIR1bits.RC1IF = 0;
        c = RCREG1;
        if (RxCount)
            return; // buffer in use
        if (RxIndex >= MAX_MSG)
        {
            RxIndex = 0; // abort
            return;
        }
        RxBufr[RxIndex++] = c;
    }
}

来自数据表(第134页):

tx1if仅是读的,因此,您不应该写(我想如果尝试的话,它都不做,但是我不会弄乱它)。

R-0

tx1if

tx1if:eusart1传输中断标志位

1 = eUSART1传输缓冲液Txreg1是空的(清除时清除 txreg1编写)

0 = EUSART1发送缓冲区已满


另外,由于设置TX1IE时,中断会立即发射,因此您不必写入TXREG1,因为中断会立即启动下一个字符,这可能会引起问题,因此请删除此问题:

PIR1bits.TX1IF = 0;
TXREG1 = Count;

我仍然有一个问题(对于仅在ISR中读取的变量的波动性?),涉及volatile对缓冲区的需求,我认为您需要它禁用编译器可以尝试执行的一些优化,并且可能意味着您将无法使用memset()(在这种情况下,您可以使用我几天前做过的MEMSET:是`emcpy((void *)dest,src,n),``阵列安全?(在这种情况下,memset_vout())。

编辑:正如对这两个问题中第一个问题所述的答案(及其评论)所述,您需要动荡以防止不必要的优化。因此,您需要重写memset(第二个链接)。


您有另一个问题:您不重置TxCount(以缓冲区的相同原因也应该是volatile)支票。ISR应重置在重置TX1IE

之后的重置

相关内容

  • 没有找到相关文章

最新更新