我试图通过硅实验室在PC上获取数据c8051f320
我通常在Java中编程,所以如果我在某个地方错了C语言或MCUS理解,请纠正我。
这是我处理UART中断的代码
Unsigned char Byte;
unsigned char TX_Ready =1;
void UART0_Interrupt (void) interrupt 4{
if (RI0 == 1)// Check if Rec flag is set
{
// Do nothing
}
if (TI0 == 1) { // Check if transmit flag is set
SBUF0 = Byte; // copy the character from Byte to Buffer
TI0 = 0; // Set Transmit flag to 0
}
}
这是我发送数据的方法
void SendData(){
unsigned char incoming_str[] = {'d','s','a','r'}; //array of chars to send
TX_Ready = 0;
for(i=0;i<sizeof(incoming_str);i++) {
Byte = incoming_str[i];
TI0=1;
}
}
第一个问题我以相反的顺序获取数据(是正常的)。第二个问题我在错误的数据中获得字符
这是一个输出样本:
asD
asD
asD
asS
aAD
asD
asD
asD
asD
asD
asS
aAD
asD
asD
asD
asD
asD
asS
aAD
asD
asD
asD
aS
一个公平的奇迹,它根本起作用。您没有采取任何行动来确保中断处理程序与senddata()循环同步。因此,预计会重复或消失。
两个基本方案。如果您不必担心延误,就像现在一样,那么您就不会使用中断。您只需循环直到扫描1 == 1,然后写sbuf。
如果您确实在乎延迟,则需要中断。您需要一个圆形缓冲区来存储字节。您的中断处理程序从缓冲区中拉出一个字节,并将其写入SBUF。如果缓冲区为空,则需要设置一个布尔以表明检测到中断但未维修。现在,您通过禁用中断来发送字节并附加要发送到圆形缓冲区的字节。如果设置了布尔标志,请立即将字节写入SBUF并清除标志。重新启用中断。
还检查时钟源 - 计算波特率/crytal ??
的失败比是多少我曾经有两个AVR。由于我无法稳定时钟源,因此我通过发送"字节ff -byte"来实现一个简单的检查 - 就像接收器可以验证数据是否正确