0

好的,所以我已经在 MikroC 编译器中完成了在 PIC18f8680 上创建软件和硬件 UART。Soft_Uart 使用 timer0 进行中断,并通过一个名为 Soft_uart_Break() 的函数中断 Soft_UART_read() 行。

一切正常,当我从两个 uart 读取一个字符时。但是当我在硬件 uart 上发送一个字符串时,这些行无法正确读取该字符串;

UART1_Read_Text(缓冲区,“OK”,100);
UART1_Write_Text(缓冲区);

我发现是什么导致了这个问题。也就是说,我的主 while 循环卡在 Soft_UART_read() 中,直到它被中断中断。当它卡在那里时,硬件uart没有得到适当的时间来读取整个字符串,因此它显示了该字符串的一些字符。

我该如何克服呢?我需要为硬件 uart aswel 使用单独的中断吗?或者是什么 ?任何帮助将不胜感激。这是我的代码片段;

void main() {

  INTCON.GIE=1;         //globle interrupt enable
  INTCON.PEIE=1;        //peripharel interrupt enable
  INTCON.TMR0IF = 0x0;  //Clear timer0 overflow interrupt flag
  INTCON.TMR0IE = 1;    //enable the timer0 by setting TRM0IE flag
  T0CON.TMR0ON = 1;  // Timer0 On/Off Control bit: 1=Enables Timer0 / 0=Stops Timer0
  T0CON.T08BIT = 0;  // Timer0 8-bit/16-bit Control bit: 1=8-bit timer/counter / 0=16-bit timer/counter
  T0CON.T0CS   = 0;  // TMR0 Clock Source Select bit: 0=Internal Clock (CLKO) / 1=Transition on T0CKI pin
  T0CON.T0SE   = 0;  // TMR0 Source Edge Select bit: 0=low/high / 1=high/low
  T0CON.PSA    = 1;  // Prescaler Assignment bit: 0=Prescaler is assigned; 1=NOT assigned/bypassed
  T0CON.T0PS2  = 0;  // bits 2-0  PS2:PS0: Prescaler Select bits
  T0CON.T0PS1  = 1;
  T0CON.T0PS0  = 1;
  TMR0H = 0xBD;        // preset for Timer0 MSB register
  TMR0L = 0xCD;       // preset for Timer0 LSB register

 while(1) {
 data1 = Soft_UART_Read(&error);
   Soft_UART_Write(data1);
  if   (data1 == 'b') {
      for(x = 0; x <= strlen(alive); x++) {
          Soft_UART_Write(alive[x]);
       }
   }

  if (UART1_Data_Ready()) {     // If data is received,
   UART1_Read_Text(buffer, "OK", 100);    // reads text until 'OK' is found
   UART1_Write_Text(buffer);             // sends back text
  /*if   (uart_rd == 'a') {
      UART1_Write_Text("\rSensor 1 data\r");

  }*/
  //else
  //UART1_Write(uart_rd);      // and send data via UART

    }

  }
 } 
4

1 回答 1

0

我遇到过同样的问题。MikroC 手册中的一些示例代码和文档似乎自相矛盾。

原型是:

void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);

您的分隔符应该是:

char delimit[] = "OK";

UART1_Read_Text(&dataIn,&delimit,attempts);

如果您知道正在接收的数据的大小,则尝试应该与此相对应。

于 2015-10-17T12:26:06.137 回答