【发布时间】:2019-03-04 20:55:46
【问题描述】:
我目前正在使用 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;
}
}
【问题讨论】:
-
我猜你写了一个中断函数。可以发一下吗?
-
此外,如果您知道如何对掩码执行相同操作,请避免使用位域。它们更快,而且位域是实现定义的,这意味着您的代码不可移植,并且可能表现与预期不同。 (即:
PIE1 |= _PIE1_TX1IE_MASK;)或类似的东西。 -
@CacahueteFrito 编辑原始帖子以显示 ISR
-
顺便说一下,我不知道你的确切图片,但至少在 PIC16f1829 上,TXIF 是只读的。
-
在最后一条评论之后,在我提到的 PIC 中,可能在你的 PIC 中,你不应该重置 TXIF,而且,你不应该在 ISR 之外填充 TXREG,所以我会删除那些两行,看看是否有效。