21ic问答首页 - HC32L17系列串口通信问题
HC32L17系列串口通信问题
学以致用11282024-11-13
案例代码都是用9600作为波特率与串口通信,结果没问题,但是调到115200后,出现了乱码,发现是实际波特率的问题,于是用示例的App_RCH4MHzToPll48MHz代码,调到48MHZ,实际串口没问题,但是在与4G模块通信时,还是会出现数据缺失的问题
发送AT+CPIN?后,应该回复+CPIN:READY,但实际转发到串口查看,缺少数据D,实际代码也没往下跑,因为接收数据缺失
在检测4G模块正常的情况下,是哪里出现了问题?代码如下:
/*author ljx*/
#include "hc32l17x.h"
#include "uart.h"
#include "gpio.h"
int RxCount=0;//接收缓冲区坐标
char RxBuffer[1000];//接收缓冲区
//串口引脚配置
void usart1_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
stc_uart_cfg_t stcCfg;
stc_uart_baud_t stcBaud;
DDL_ZERO_STRUCT(stcGpioCfg);
DDL_ZERO_STRUCT(stcCfg);
DDL_ZERO_STRUCT(stcBaud);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
Gpio_SetAfMode(GpioPortA, GpioPin2, GpioAf1); //配置PA02 端口为URART1_TX
///<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortA, GpioPin15, &stcGpioCfg);
Gpio_SetAfMode(GpioPortA, GpioPin15, GpioAf2); //配置PA15 端口为URART1_RX
//串口配置
///< 开启外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟
///<UART Init
stcCfg.enRunMode = UartMskMode1; ///<模式1
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.enMmdorCk = UartMskDataOrAddr; //无校验
stcCfg.stcBaud.u32Baud = 115200; ///<波特率115200
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART1, &stcCfg); ///<串口初始化
Uart_ClrStatus(M0P_UART1,UartRC); ///<清接收请求
Uart_ClrStatus(M0P_UART1,UartTC); //清发送请求
}
//4G模块引脚配置
void usart0_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
stc_uart_cfg_t stcCfg;
stc_uart_baud_t stcBaud;
DDL_ZERO_STRUCT(stcGpioCfg);
DDL_ZERO_STRUCT(stcCfg);
DDL_ZERO_STRUCT(stcBaud);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortB, GpioPin6, &stcGpioCfg);
Gpio_SetAfMode(GpioPortB, GpioPin6, GpioAf2); //配置PB06 端口为URART0_TX
///<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
Gpio_SetAfMode(GpioPortB, GpioPin7, GpioAf2); //配置PB07 端口为URART0_RX
//串口配置
///< 开启外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);///<使能uart0模块时钟
///<UART Init
stcCfg.enRunMode = UartMskMode1; ///<模式1
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.enMmdorCk = UartMskDataOrAddr; //无校验
stcCfg.stcBaud.u32Baud = 115200; ///<波特率115200
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART0, &stcCfg); ///<串口初始化
///<UART中断使能
Uart_ClrStatus(M0P_UART0,UartRC); ///<清接收请求
Uart_ClrStatus(M0P_UART0,UartTC); //清发送请求
Uart_EnableIrq(M0P_UART0,UartRxIrq); ///<使能串口接收中断
EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE); ///<系统中断使能
}
/**
* 函 数:串口发送一个字节
* 参 数:Byte 要发送的一个字节
* 返 回 值:无
*/
void USART1_SendByte(uint8_t Byte)
{
Uart_SendDataPoll(M0P_UART1,Byte); //启动UART1发送第一个字节
}
/**
* 函 数:串口发送一个字节
* 参 数:Byte 要发送的一个字节
* 返 回 值:无
*/
void USART0_SendByte(uint8_t Byte)
{
Uart_SendDataPoll(M0P_UART0,Byte); //启动UART0发送第一个字节
}
/**
* 函 数:使用printf需要重定向的底层函数
* 参 数:保持原始格式即可,无需变动
* 返 回 值:保持原始格式即可,无需变动
*/
int fputc(int ch, FILE *p)
{
USART0_SendByte(ch); //将printf的底层重定向到自己的发送字节函数
return ch;
}
//UART0中断函数
void Uart0_IRQHandler(void)
{
if(Uart_GetStatus(M0P_UART0, UartRC)) //UART0数据接收
{
Uart_ClrStatus(M0P_UART0, UartRC); //清中断状态位
RxBuffer[RxCount] = Uart_ReceiveData(M0P_UART0); //接收数据字节
USART1_SendByte(RxBuffer[RxCount]);
RxCount++;
if(RxCount>=1000)
RxCount=0; //字符数组满了,从头再来
}
}
发送AT+CPIN?后,应该回复+CPIN:READY,但实际转发到串口查看,缺少数据D,实际代码也没往下跑,因为接收数据缺失
在检测4G模块正常的情况下,是哪里出现了问题?代码如下:
/*author ljx*/
#include "hc32l17x.h"
#include "uart.h"
#include "gpio.h"
int RxCount=0;//接收缓冲区坐标
char RxBuffer[1000];//接收缓冲区
//串口引脚配置
void usart1_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
stc_uart_cfg_t stcCfg;
stc_uart_baud_t stcBaud;
DDL_ZERO_STRUCT(stcGpioCfg);
DDL_ZERO_STRUCT(stcCfg);
DDL_ZERO_STRUCT(stcBaud);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortA, GpioPin2, &stcGpioCfg);
Gpio_SetAfMode(GpioPortA, GpioPin2, GpioAf1); //配置PA02 端口为URART1_TX
///<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortA, GpioPin15, &stcGpioCfg);
Gpio_SetAfMode(GpioPortA, GpioPin15, GpioAf2); //配置PA15 端口为URART1_RX
//串口配置
///< 开启外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart1,TRUE);///<使能uart1模块时钟
///<UART Init
stcCfg.enRunMode = UartMskMode1; ///<模式1
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.enMmdorCk = UartMskDataOrAddr; //无校验
stcCfg.stcBaud.u32Baud = 115200; ///<波特率115200
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART1, &stcCfg); ///<串口初始化
Uart_ClrStatus(M0P_UART1,UartRC); ///<清接收请求
Uart_ClrStatus(M0P_UART1,UartTC); //清发送请求
}
//4G模块引脚配置
void usart0_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
stc_uart_cfg_t stcCfg;
stc_uart_baud_t stcBaud;
DDL_ZERO_STRUCT(stcGpioCfg);
DDL_ZERO_STRUCT(stcCfg);
DDL_ZERO_STRUCT(stcBaud);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio,TRUE); //使能GPIO模块时钟
///<TX
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortB, GpioPin6, &stcGpioCfg);
Gpio_SetAfMode(GpioPortB, GpioPin6, GpioAf2); //配置PB06 端口为URART0_TX
///<RX
stcGpioCfg.enDir = GpioDirIn;
Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
Gpio_SetAfMode(GpioPortB, GpioPin7, GpioAf2); //配置PB07 端口为URART0_RX
//串口配置
///< 开启外设时钟
Sysctrl_SetPeripheralGate(SysctrlPeripheralUart0,TRUE);///<使能uart0模块时钟
///<UART Init
stcCfg.enRunMode = UartMskMode1; ///<模式1
stcCfg.enStopBit = UartMsk1bit; ///<1bit停止位
stcCfg.enMmdorCk = UartMskDataOrAddr; //无校验
stcCfg.stcBaud.u32Baud = 115200; ///<波特率115200
stcCfg.stcBaud.enClkDiv = UartMsk8Or16Div; ///<通道采样分频配置
stcCfg.stcBaud.u32Pclk = Sysctrl_GetPClkFreq(); ///<获得外设时钟(PCLK)频率值
Uart_Init(M0P_UART0, &stcCfg); ///<串口初始化
///<UART中断使能
Uart_ClrStatus(M0P_UART0,UartRC); ///<清接收请求
Uart_ClrStatus(M0P_UART0,UartTC); //清发送请求
Uart_EnableIrq(M0P_UART0,UartRxIrq); ///<使能串口接收中断
EnableNvic(UART0_2_IRQn, IrqLevel3, TRUE); ///<系统中断使能
}
/**
* 函 数:串口发送一个字节
* 参 数:Byte 要发送的一个字节
* 返 回 值:无
*/
void USART1_SendByte(uint8_t Byte)
{
Uart_SendDataPoll(M0P_UART1,Byte); //启动UART1发送第一个字节
}
/**
* 函 数:串口发送一个字节
* 参 数:Byte 要发送的一个字节
* 返 回 值:无
*/
void USART0_SendByte(uint8_t Byte)
{
Uart_SendDataPoll(M0P_UART0,Byte); //启动UART0发送第一个字节
}
/**
* 函 数:使用printf需要重定向的底层函数
* 参 数:保持原始格式即可,无需变动
* 返 回 值:保持原始格式即可,无需变动
*/
int fputc(int ch, FILE *p)
{
USART0_SendByte(ch); //将printf的底层重定向到自己的发送字节函数
return ch;
}
//UART0中断函数
void Uart0_IRQHandler(void)
{
if(Uart_GetStatus(M0P_UART0, UartRC)) //UART0数据接收
{
Uart_ClrStatus(M0P_UART0, UartRC); //清中断状态位
RxBuffer[RxCount] = Uart_ReceiveData(M0P_UART0); //接收数据字节
USART1_SendByte(RxBuffer[RxCount]);
RxCount++;
if(RxCount>=1000)
RxCount=0; //字符数组满了,从头再来
}
}
您需要登录后才可以回复 登录 | 注册