这对熟悉C语言的人来说应该很容易回答。我想在LCD上显示变量的先前值(单片机上的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/

10-11 23:21