从C8051F320通过串行端口接收UART数据时出错

时间:2014-02-01 16:34:00

标签: c serial-port uart

我正试图通过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

一 小号

2 个答案:

答案 0 :(得分:1)

这是一个公平的奇迹。您没有做任何事情来确保中断处理程序与SendData()循环同步。因此,期望获得重复或消失的字节。

两个基本方案。如果你不像现在这样担心延迟,那么就不要使用中断了。你只需循环直到SCON.1 == 1,然后写SBUF。

如果你关心延迟,那么你需要中断。你需要一个循环缓冲区来存储字节。中断处理程序从缓冲区中提取一个字节并将其写入SBUF。如果缓冲区为空,则需要设置bool以指示检测到中断但未进行服务。现在,您可以通过禁用中断来发送字节,并将要发送的字节附加到循环缓冲区。如果设置了bool标志,则立即向SBUF写入一个字节并清除该标志。重新启用中断。

答案 1 :(得分:1)

同时检查时钟源 - 计算波特率/ crytal的故障率是多少?

我曾经有两个AVR。由于我无法在我的情况下稳定时钟源,我实现了一个简单的检查,发送“byte ff-byte” - 就像接收器可以验证数据是否正确