熟悉 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/