gpt4 book ai didi

c - PIC18FXXXXX UART Tx 消息功能?

转载 作者:行者123 更新时间:2023-11-30 16:21:07 24 4
gpt4 key购买 nike

我目前正在使用 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 Transmit Interrupt Flag bit

1 = The EUSART1 transmit buffer, TXREG1, is empty (cleared when TXREG1 is written)

0 = The EUSART1 transmit buffer is full

<小时/>

此外,由于当您设置TX1IE时中断会立即触发,因此您不必写入TXREG1,因为中断将立即开始下一个字符,并且这可能会导致问题,所以删除它:

PIR1bits.TX1IF = 0;
TXREG1 = Count;
<小时/>

我还有一个问题(volatile for variable that is only read in ISR?)关于缓冲区是否需要 volatile ,我认为您需要它来禁用编译器可能尝试执行的一些优化,并且意味着您将无法使用 memset() (在这种情况下,您可以使用我几天前完成的 memset 版本:Is `memcpy((void *)dest, src, n)` with a `volatile` array safe? (在这种情况下, memset_vout()))。

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

<小时/>

您还有另一个问题:在结束传输后,您没有重置TxCount(出于与缓冲区相同的原因,它也应该是 volatile ),因此您发送的第二条(及后续)消息将始终在支票中返回。 ISR 应在重置 TX1IE

后重置该值

关于c - PIC18FXXXXX UART Tx 消息功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54991412/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com