我正试图通过Silicon Labs C8051f320
在PC上通过UART序列获取数据我通常用Java编程,所以如果我在C语言或MCU理解的地方错了,请纠正我。
这是我处理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;
}
}
第一个问题我正在以相反的顺序获取数据(这是正常的)。 第二个问题我收到错误数据中的字符
这是一个输出样本:
一 小号 d
一 小号 d
一 小号 d
一 小号 小号
一 一个 d
一 小号 d
一 小号 d
一 小号 d
一 小号 d
一 小号 d
一 小号 小号
一 一个 d
一 小号 d
一 小号 d
一 小号 d
一 小号 d
一 小号 d
一 小号 小号
一 一个 d
一 小号 d
一 小号 d
一 小号 d
一 小号
答案 0 :(得分:1)
这是一个公平的奇迹。您没有做任何事情来确保中断处理程序与SendData()循环同步。因此,期望获得重复或消失的字节。
两个基本方案。如果你不像现在这样担心延迟,那么就不要使用中断了。你只需循环直到SCON.1 == 1,然后写SBUF。
如果你关心延迟,那么你需要中断。你需要一个循环缓冲区来存储字节。中断处理程序从缓冲区中提取一个字节并将其写入SBUF。如果缓冲区为空,则需要设置bool以指示检测到中断但未进行服务。现在,您可以通过禁用中断来发送字节,并将要发送的字节附加到循环缓冲区。如果设置了bool标志,则立即向SBUF写入一个字节并清除该标志。重新启用中断。
答案 1 :(得分:1)
同时检查时钟源 - 计算波特率/ crytal的故障率是多少?
我曾经有两个AVR。由于我无法在我的情况下稳定时钟源,我实现了一个简单的检查,发送“byte ff-byte” - 就像接收器可以验证数据是否正确