目前使用芯科的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天,您在需要使用的时候【私信】联系我,我会为您补发。
问题解决了吗