Serial port 读取软Uart&;硬件Uart@同时

Serial port 读取软Uart&;硬件Uart@同时,serial-port,interrupt,pic,uart,mikroc,Serial Port,Interrupt,Pic,Uart,Mikroc,好的,我已经在MikroC编译器的PIC18f8680上创建了一个软硬件UART。Soft_Uart使用定时器0进行中断,并通过名为Soft_Uart_Break()的函数中断Soft_Uart_read()行 当我从两个uart读取一个字符时,一切都正常。但是,当我在硬件uart上发送字符串时,这些行无法正确读取该字符串 UART1_读取_文本(缓冲区,“OK”,100) UART1_写入_文本(缓冲区) 我已经找到了导致这个问题的原因。也就是说,我的主while循环卡在Soft_UART_r

好的,我已经在MikroC编译器的PIC18f8680上创建了一个软硬件UART。Soft_Uart使用定时器0进行中断,并通过名为Soft_Uart_Break()的函数中断Soft_Uart_read()行

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

UART1_读取_文本(缓冲区,“OK”,100)
UART1_写入_文本(缓冲区)

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

我怎样才能克服这个问题?我是否也需要为硬件uart使用单独的中断?还是怎样任何帮助都将不胜感激。 这里是我的代码剪贴

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

    }

  }
 } 
void main(){
INTCON.GIE=1;//全局中断启用
INTCON.PEIE=1;//外围端口中断启用
INTCON.TMR0IF=0x0;//清除定时器0溢出中断标志
INTCON.TMR0IE=1;//通过设置TRM0IE标志启用计时器0
T0CON.TMR0ON=1;//Timer0开/关控制位:1=启用Timer0/0=停止Timer0
T0CON.T08BIT=0;//定时器0 8位/16位控制位:1=8位定时器/计数器/0=16位定时器/计数器
T0CON.T0CS=0;//TMR0时钟源选择位:0=内部时钟(CLKO)/1=T0CKI引脚上的转换
T0CON.T0SE=0;//TMR0源边缘选择位:0=低/高/1=高/低
T0CON.PSA=1;//预分频器分配位:0=已分配预分频器;1=未分配/旁路
T0CON.T0PS2=0;//位2-0 PS2:PS0:预分频器选择位
T0CON.T0PS1=1;
T0CON.T0PS0=1;
TMR0H=0xBD;//定时器0 MSB寄存器的预设值
TMR0L=0xCD;//定时器0 LSB寄存器的预设值
而(1){
数据1=软UART读取(&错误);
软UART写入(数据1);
如果(数据1='b'){

对于(x=0;x我也有同样的问题。MikroC手册中的一些示例代码和文档似乎自相矛盾

原型是:

void UARTx_Read_Text(char *Output, char *Delimiter, char Attempts);
您的分隔符应为:

char delimit[] = "OK";

UART1_Read_Text(&dataIn,&delimit,attempts);
如果您知道所接收数据的大小,则尝试应与此相对应