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