我正在使用PIC v7.2的MikroC来编程PIC18f67k40。
在 functii.h 中,我具有以下变量声明:
extern volatile unsigned char byte_count;
在 main.c 中,以下代码:
#include <functii.h>
// ...
volatile unsigned char byte_count = 0;
// ...
void interrupt () {
if (RC1IF_bit) {
uart_rx = Uart1_read();
uart_string[byte_count] = uart_rx;
byte_count++;
}
// ...
}
然后,在 command.c 中,我具有以下代码:
#include <functii.h>
void how_many_bytes () {
// ...
uart1_write(byte_count);
// ...
}
在main.c
中,我使用中断处理通过UART传输的数据。接收到传输结束符后,我将调用how_many_bytes()
,它会发送回接收到的消息的长度(加上数据字节本身,以及我在此处未包括的代码,但这些都是好!!)。
问题在于,在uart1_write()
调用中,byte_count
始终为0,而不是在中断序列中递增。
答案 0 :(得分:-1)
可能您需要在中断处理程序和主处理程序之间进行一些同步。
如果您做这样的事情
if(byte_count != 0) {
uart1_write(byte_count);
byte_count = 0;
}
中断可以发生在任何地方,例如
if(byte_count != 0)
和uart1_write(byte_count);
或uart1_write(byte_count);
的处理过程中,该过程使用旧值的副本,而值被更改,或者uart1_write(byte_count);
和byte_count = 0;
之间。 使用上面的代码,情况1没问题,但是2和3没问题。读取byte_count
用于函数调用后,您将丢失所有收到的字符。
也许您可以在某些时候禁用/启用中断。
更好的解决方案可能是不重置byte_count
之外的interrupt()
,而是实现具有单独的读写索引的环形缓冲区。读索引只能由how_many_bytes()
(或uart1_write()
)修改,写索引只能由interrupt()
修改。