我当前正在使用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