EFR32MG22两串口通讯问题

目前使用芯科的EFR32MG22,读取ZG09二氧化碳传感器数据,使用USART0与传感器通信(modbus rtu协议,轮询方式,发送传感器说明书中读取二氧化碳值的指令)、USART1与电脑通讯返回二氧化碳浓度,但是返回的值不对,FC 00 02 00 00 00 C0 00 86 00 FC 00 00 00 C0 00 86 00 FC 00 00 00 C0 00 86 00 FC 00 00 00 C0 00 86 00 FC 00 00 00 C0 00 ,一直是这个,很有规律,请问这是怎么回事呢?



#include <stdio.h>
#include "em_device.h"
#include "em_chip.h"
#include "em_emu.h"
#include "em_cmu.h"
#include "em_gpio.h"
#include "em_usart.h"

// Size of the buffer for received data
//接收数据的缓冲区大小
#define BUFLEN  8
#define len  8
// True while receiving data (waiting for CR or BUFLEN characters)
//接收数据时为真(等待CR或BUFLEN字符)
bool receive = true;



void my_co2_usart0_Init(void)
{
       //  CMU_ClockEnable(cmuClock_GPIO, true);
       //CMU_ClockEnable(cmuClock_USART0, true);//使能GPIO和USART0时钟

        // Configure PB0 as an output (TX)
        GPIO_PinModeSet(gpioPortB, 0, gpioModePushPull, 0);

        // Configure PB1 as an input (RX)
        GPIO_PinModeSet(gpioPortB, 1, gpioModeInput, 0);

        // Configure PB4 as output and set high (VCOM_ENABLE)将PB4配置为输出并将其设置为高(VCOM_ENABLE)
        // comment out next line to disable VCOM注释掉下一行以禁用VCOM
        //  GPIO_PinModeSet(gpioPortB, 4, gpioModePushPull, 1);

        // Default asynchronous initializer (9.6Kbps, 8N1, no flow control)
        USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;//设置数据帧格式
            init.baudrate= 9600;

            // Route USART0 TX and RX to PB0 and PB1 pins, respectively
            //将USART0 TX和RX分别路由到PB0和PB1引脚
            GPIO->USARTROUTE[0].TXROUTE = (gpioPortB << _GPIO_USART_TXROUTE_PORT_SHIFT)
                | (0 << _GPIO_USART_TXROUTE_PIN_SHIFT);
            GPIO->USARTROUTE[0].RXROUTE = (gpioPortB << _GPIO_USART_RXROUTE_PORT_SHIFT)
                | (1 << _GPIO_USART_RXROUTE_PIN_SHIFT);

            // Enable RX and TX signals now that they have been routed
            //现在已经启用了RX和TX信号
            GPIO->USARTROUTE[0].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | GPIO_USART_ROUTEEN_TXPEN;

            // Configure and enable USART0
            //配置并启用USART0
            USART_InitAsync(USART0, &init);

            // Enable NVIC USART sources
            //启用NVIC USART源
     /*       NVIC_ClearPendingIRQ(USART0_RX_IRQn);
            NVIC_EnableIRQ(USART0_RX_IRQn);
            NVIC_ClearPendingIRQ(USART0_TX_IRQn);
            NVIC_EnableIRQ(USART0_TX_IRQn);*/
}

void initusart0(void){
  // Default asynchronous initializer (9.6Kbps, 8N1, no flow control)
         USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;//设置数据帧格式
             init.baudrate= 9600;

             // Route USART0 TX and RX to PB0 and PB1 pins, respectively
             //将USART0 TX和RX分别路由到PB0和PB1引脚
             GPIO->USARTROUTE[0].TXROUTE = (gpioPortB << _GPIO_USART_TXROUTE_PORT_SHIFT)
                 | (0 << _GPIO_USART_TXROUTE_PIN_SHIFT);
             GPIO->USARTROUTE[0].RXROUTE = (gpioPortB << _GPIO_USART_RXROUTE_PORT_SHIFT)
                 | (1 << _GPIO_USART_RXROUTE_PIN_SHIFT);

             // Enable RX and TX signals now that they have been routed
             //现在已经启用了RX和TX信号
             GPIO->USARTROUTE[0].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | GPIO_USART_ROUTEEN_TXPEN;

             // Configure and enable USART0
             //配置并启用USART0
             USART_InitAsync(USART0, &init);
}

/**************************************************************************//**
 * @brief
 *    GPIO initialization
 *****************************************************************************/
void initGpio(void)
{
  // Configure PA5 as an output (TX)
  GPIO_PinModeSet(gpioPortA, 5, gpioModePushPull, 0);

  // Configure PA6 as an input (RX)
  GPIO_PinModeSet(gpioPortA, 6, gpioModeInput, 0);

  // Configure PB4 as output and set high (VCOM_ENABLE)将PB4配置为输出并将其设置为高(VCOM_ENABLE)
  // comment out next line to disable VCOM注释掉下一行以禁用VCOM
  GPIO_PinModeSet(gpioPortB, 4, gpioModePushPull, 1);
}

/**************************************************************************//**
 * @brief
 *    CMU initialization
 *****************************************************************************/
void initCmu(void)
{
  // Enable clock to GPIO and USART1
  CMU_ClockEnable(cmuClock_GPIO, true);
  CMU_ClockEnable(cmuClock_USART1, true);
  CMU_ClockEnable(cmuClock_USART0, true);//使能GPIO和USART0时钟


}

/**************************************************************************//**
 * @brief
 *    USART1 initialization
 *****************************************************************************/
void initUsart1(void)
{
  // Default asynchronous initializer (115.2 Kbps, 8N1, no flow control)
  USART_InitAsync_TypeDef init = USART_INITASYNC_DEFAULT;


  // Route USART1 TX and RX to PA5 and PA6 pins, respectively
  GPIO->USARTROUTE[1].TXROUTE = (gpioPortA << _GPIO_USART_TXROUTE_PORT_SHIFT)
      | (5 << _GPIO_USART_TXROUTE_PIN_SHIFT);
  GPIO->USARTROUTE[1].RXROUTE = (gpioPortA << _GPIO_USART_RXROUTE_PORT_SHIFT)
      | (6 << _GPIO_USART_RXROUTE_PIN_SHIFT);

  // Enable RX and TX signals now that they have been routed
  GPIO->USARTROUTE[1].ROUTEEN = GPIO_USART_ROUTEEN_RXPEN | GPIO_USART_ROUTEEN_TXPEN;

  // Configure and enable USART1
  USART_InitAsync(USART1, &init);

  // Enable NVIC USART sources
  /*NVIC_ClearPendingIRQ(USART1_RX_IRQn);
  NVIC_EnableIRQ(USART1_RX_IRQn);
  NVIC_ClearPendingIRQ(USART1_TX_IRQn);
  NVIC_EnableIRQ(USART1_TX_IRQn);*/
}

/**************************************************************************//**
 * @brief
 *    Main function
 *****************************************************************************/
int main(void)
{
  uint8_t i;

  uint8_t k=0;

  uint8_t buffer[8]={0,0,0,0,0,0,0,0};

  uint8_t co2m[8]={0xFE,0x03,0x00,0x0B,0x00,0x01,0xE1,0xC7};

 // Chip errata芯片初始化例程,用于修订勘误解决方法。
  CHIP_Init();

  // Initialize GPIO and USART0 and USART1
  initCmu();
  initGpio();
  initUsart1();
  my_co2_usart0_Init();

 // USART_Rx(USART0);

 while(k<5){
    // initusart0();

         //transmit data to sensor
         for (i = 0; i < 8  ; i++)
             USART_Tx(USART0, co2m[i]);

        //receive 8 bytes
        for(i=0;i<8;i++)
            buffer[i++]=USART_Rx(USART0);

      // initUsart1();

         for (i= 0;i < 8; i++)
             USART_Tx(USART1, buffer[i]);

         k++;
      }

}

 

你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

问题解决了吗