c - 显示先前接收到的 UART 值

标签 c microcontroller microchip uart

熟悉 C 的人应该很容易回答这个问题。我想在 LCD 上显示变量的先前值(微 Controller 上 UART (RS-232) 的接收寄存器)。这是我当前的实现,它工作正常。但我想知道是否有办法在我的中断例程中花费更少的时间。当前,外设配置为在 UART 馈送中接收到一个新字符后立即跳转到中断例程。有人有建议吗?

//Initialization
char U1RX_data = '\0';
char p0_U1RX_data = '\0';
char p1_U1RX_data = '\0';
char p2_U1RX_data = '\0';
char p3_U1RX_data = '\0';
char p4_U1RX_data = '\0';
char p5_U1RX_data = '\0';
char p6_U1RX_data = '\0';
char p7_U1RX_data = '\0';

char U1buf[] = {p7_U1RX_data, p6_U1RX_data, p5_U1RX_data,
                p4_U1RX_data, p3_U1RX_data, p2_U1RX_data,
                p1_U1RX_data, p0_U1RX_data, U1RX_data, '\0'};
disp_string(-61, 17, 1, U1buf); //X, Y, mode, string

void _U1RXInterrupt(void){
    p7_U1RX_data = p6_U1RX_data;
    p6_U1RX_data = p5_U1RX_data;
    p5_U1RX_data = p4_U1RX_data;
    p4_U1RX_data = p3_U1RX_data;
    p3_U1RX_data = p2_U1RX_data;
    p2_U1RX_data = p1_U1RX_data;
    p1_U1RX_data = p0_U1RX_data;
    p0_U1RX_data = U1RX_data;

    U1RX_data = U1RXREG;
    IFS0bits.U1RXIF = 0;    
}

最佳答案

您可以在中断中使用memmove,如下所示:

void _U1RXInterrupt(void)
{
    memmove(&U1Buf[0], &U1Buf[1], 7);
    U1Buf[7] = U1RX_data;
    ...
}

这取代了您当前手动执行的分配,并且更加惯用。

我希望我能正确理解您的意思;要点是使用 memmove 将缓冲区向下移动一个字节。顺便说一句,当目标缓冲区和源缓冲区重叠时,使用 memmove 而不是 memcpy 很重要,如本例所示。

关于c - 显示先前接收到的 UART 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1805177/

相关文章:

C编程-unsigned int溢出问题

microcontroller - 什么是振荡器频率?它与系统时钟频率有何不同?

java - 可以修改商店产品上的迷你 Controller /微 Controller 代码吗?

C:使用头文件中的函数最小化代码重复

assembly - PIC 汇编中的整数常量 : decimal vs.(十六进制)

c - 如何使这个 for 循环使 LED 变暗和变亮?

c - 动态字符串数组不起作用

将 AST 转换为字节码

c - 在C中,popen是否将其结果作为文件指针写入硬盘?

c - 如何确保已读取微 Controller 外围寄存器