Embedded PIC32 UART丢弃字节数

Embedded PIC32 UART丢弃字节数,embedded,pic,uart,Embedded,Pic,Uart,问题 外部源发送这四个字节0x2A、0x42、0x78、0x25 PIC32 UART不生成整数 外部源再发送一个字节 然后,PIC32 UART生成一个int 在该int中,仅显示上一次传输的0x25字节 i、 例如,前三个消失了 偶尔(可能有5%的时间)UART会正确地生成所有4个字节 [周五晚上调试结果] 我们编写了另一个echo例程;它只是读取它得到的内容并将其写出来 我们在发布模式下构建了它(根据这里另一个用户的建议) 我编写了一个例程,将相同的数字发送25次,然后看看我得到了什么

问题

  • 外部源发送这四个字节
    0x2A、0x42、0x78、0x25
  • PIC32 UART不生成整数
  • 外部源再发送一个字节
  • 然后,PIC32 UART生成一个int
  • 在该int中,仅显示上一次传输的
    0x25
    字节
  • i、 例如,前三个消失了
  • 偶尔(可能有5%的时间)UART会正确地生成所有4个字节
[周五晚上调试结果]

我们编写了另一个echo例程;它只是读取它得到的内容并将其写出来

我们在发布模式下构建了它(根据这里另一个用户的建议)

我编写了一个例程,将相同的数字发送25次,然后看看我得到了什么

在那之后,我加上值并发送25次,然后循环

结果将附加在此消息的末尾

我没有得到第一个空字节。基于各种因素,我现在不担心这一点

在接下来的五轮比赛中,我会把一切都完美地恢复过来

我将尝试包含所有相关的源代码,希望它不是一堵文字墙。如果需要更多的代码来理解这一点,请询问

这是有关UART的初始代码。我可以包括

  //*****************************************************************//
  void initUART1(void)   // UART1 for MCU1/2 communication
  {
   U1MODE=0;                     //// Mode Register, Manual DS61168D page 180
   U1MODEbits.FRZ=0;
   U1MODEbits.SIDL=0;
   U1MODEbits.IREN=0;
   U1MODEbits.RTSMD=0;

   U1MODEbits.UEN=0b00;           //// Just TX/RX, No CTS/RTS

   U1MODEbits.WAKE=1;
   U1MODEbits.LPBACK=0;
   U1MODEbits.ABAUD=0;
   U1MODEbits.RXINV=0;
   U1MODEbits.BRGH=1;
   U1MODEbits.PDSEL=0b00;
   U1MODEbits.STSEL=0;

   U1STA=0;
   U1STAbits.ADM_EN=0;
   U1STAbits.UTXINV=0;
   U1STAbits.URXEN=1;
   U1STAbits.UTXBRK=0;
   U1STAbits.UTXEN=1;
   U1STAbits.ADDEN=0;
   U1STAbits.OERR=0;     
                                 //// Status register, Manual DS61168D page 183

   //U1BRG=21;                    ////  21 for 921600 (80 MIPS)
     U1BRG=172;                   //// 172 for 115200 (80 MIPS)

   IFS0bits.U1RXIF=0;
   IPC6bits.U1IP=5;
   IPC6bits.U1IS=3;
   IEC0bits.U1RXIE=1;

   U1MODEbits.ON=1;
  }


  //*****************************************************************//
这是处理此特定UART的中断服务例程

  //*********************************************************//
  void __ISR(_UART1_VECTOR, ipl5) IntUart1Handler(void)   //MCU communication port
  {     
    if(INTGetFlag(INT_SOURCE_UART_RX(UART1)))  //if it's a rx interrupt
    {
       U1RxBuf=UARTGetDataByte(UART1);

    switch (CmdRecording)
    {
     case 0:
           if(U1RxBuf=='*')
           {
            CmdRecording=1;  //set the cmd recording flag
            Command_U1[0]=U1RxBuf;
            TimeOut=1;  //time out=1 means the timeout for MCU1 command receiver is enabled
            initT3(0x0100);  //time out=0 means the timeout for MCU1 command receiver is enabled
           }
           else
         {
          putcharUART1('$');
          putcharUART1('e');
          putcharUART1('2');
          putcharUART1('%');
         }
           break;
     case 1:
           CmdRecording=2;  //set the cmd recording flag
           Command_U1[1]=U1RxBuf;
           break;
     case 2:
           CmdRecording=3;  //set the cmd recording flag
           Command_U1[2]=U1RxBuf;
           break;
     case 3:
           CmdRecording=0;  //reset the cmd recording flag
           Command_U1[3]=U1RxBuf;
           if(U1RxBuf=='%') //if this is the last command byte
           {
                if((Command_U1[1]=='O'))
            {
               CMD_Err=0;      //clear error
             CMD_OK=1;      //send cmd OK;
            }
              else if((Command_U1[1]=='e'))
            {
               CMD_OK=0;      //clear OK
             CMD_Err=1;     //send cmd Err;
            }
            else
            Command_flag=1;
           }
           else
           {
            Command_flag=0;
           }

           disableT3(0);  //the command receiving is done, disable the time out #0 (command receving time out)
           TimeOut=0;  //the command receiving is done, disable the time out

           break;
     default:
           break;
    }
     INTClearFlag(INT_SOURCE_UART_RX(UART1));
    }

    if ( INTGetFlag(INT_SOURCE_UART_TX(UART1)) )  //if it's a tx interrupt
    {
        INTClearFlag(INT_SOURCE_UART_TX(UART1));
    }
  }

  //***********************************************//
这是我在通过“echo”系统运行字节时看到的数据;i、 例如,读一个,写一个的例程

PIC-32的运行频率为80 MHz,UART的速度为115200 bps,所以我不担心速度

  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
  01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 01 
  02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 02 
  03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 03 
  04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 04 
  05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05 05

看起来UART可能有一个4字节的FIFO,在FIFO满之前不会生成中断。我不熟悉这一部分,但通常可以对UART进行编程,以在特定FIFO级别或n字符超时后生成中断,以便读取非完整FIFO中的数据。此外,如果是这种情况,ISR应该循环直到FIFO清空,而不是简单地读取单个字符。

“只显示最后一个字节”-在哪里?您有这个命令\u U1数组-四个字节中有什么?您的ISR主要与RX有关,对于TX,它只是清除中断标志-我建议这根本不是“所有相关源代码”命令-U1保持
0x00,0x00,0x00,0x00
@Clifford,这是接收字节的PIC32中断例程。这就是问题所在。当我(从另一个源)向这个UART发送字节时,我没有看到前3个。刚刚发现:发送4个字节后没有int。我现在正在尝试一个。Init代码(假定)设置UART在每个字节上生成一个int。我给他发了第五个字节(很抱歉,编辑跨越了互联网云),我得到了第四个字节。我继续尝试单字节传输,你觉得呢?我刚看了数据表,您需要为此编写
U1STAbits.URXISEL=0
。我在你的代码中没有看到。如果你是对的,我是错的,谢谢!!!让我检查一下。U1STA持有似乎设置URXISEL=0的
0x00001110
,即,从手动DS61168D第183页,他们说00=中断标志位被断言,而接收缓冲区不为空(即,如果我的位正确,至少有1个数据字符)。此外,init部分有'U1STA=0;`在一开始,它应该清除一切。但要让这些想法继续下去。我正在继续我的单字节实验。我认为零实际上是重置状态,但是如果其他代码已经运行——可能是引导加载程序,它可能已经改变了这种状态。我可以找到一些例子,使用Microchips PIC32 library
UARTSetFifoMode()
调用来设置FIFO模式,以及其他用于UART初始化的库函数。使用该库可能是明智的——它可能会做一些您忽略的事情——尽管我目前看不出这可能是什么。