文件下载地址: 点击打开链接
https://download.csdn.net/download/jkson10/10494553
除了之前按照原子的驱动写过一个版本,这是通过结构体的编写来实现串口收发
实现功能:
初始化三个串口,调用两个,一个串口发送一个串口接收
串口数据接收除接收数据外还需给出帧有效数据字节长度;
串口可使用USART1、USART2、USART3,串口参数能自由设置;
实现不定长数据帧的串口收发
编译环境:UV5
设计思路及流程
将串口参数,初始化,中断,数组都写在结构体里面,各个模块分开,最后在主函数中进行数组设置,
变量,优先级设置,时钟使能。在循环中设置串口收发来实现功能。比在原子修改思路更加简洁。
1.建立SCOM.c SCOM.h文件
串口初始化结构:
串口参数设置结构体:
中断函数结构:
上述代码主要是判断数据位是否空,然后进行执行
主函数:
数组设置,变量,优先级设置,时钟使能
判断是否小于变量MIAO,小于则代表可以继续接收,然后进入循环。可以3个com口任意调用两个:
Debug模式调试
使用助手调试
至于怎么debug 使用串口助手,请自行百度
完整代码:
SCOM.C
#include "SCOM.h"
#include "string.h"
#include "sys.h"
extern uint8_t OLED;
extern uint8_t MONE[TX_BUFFER_MAX_SIZE]; //ÉèÖûº³åÇø±äÁ¿//
extern uint8_t MIAO;
SCOM_TypeDef_Struct SCOM1_BASE,SCOM2_BASE,SCOM3_BASE;
**************************************************´®¿Ú³õʼ»¯½á¹¹*****************************///
SCOMHardware_TypeDef_Struct SCOM_Hardware[] = {
{ SCOM1_USART,SCOM1_USART_IRQn ,SCOM1_tx_GPIO, SCOM1_tx_GPIO_Pin,SCOM1_rx_GPIO,SCOM1_rx_GPIO_Pin,
SCOM1_rx_DMA_Channel, SCOM1_rx_DMA_Channel_IRQn,SCOM1_tx_DMA_Channel,SCOM1_tx_DMA_Channel_IRQn },
{ SCOM2_USART,SCOM2_USART_IRQn ,SCOM2_tx_GPIO, SCOM2_tx_GPIO_Pin,SCOM2_rx_GPIO,SCOM2_rx_GPIO_Pin,
SCOM2_rx_DMA_Channel, SCOM2_rx_DMA_Channel_IRQn,SCOM2_tx_DMA_Channel,SCOM2_tx_DMA_Channel_IRQn },
{ SCOM3_USART,SCOM3_USART_IRQn ,SCOM3_tx_GPIO, SCOM3_tx_GPIO_Pin,SCOM3_rx_GPIO,SCOM3_rx_GPIO_Pin,
SCOM3_rx_DMA_Channel, SCOM3_rx_DMA_Channel_IRQn,SCOM3_tx_DMA_Channel,SCOM3_tx_DMA_Channel_IRQn },
};
void SCOM_StructInit(SCOM_InitTypeDef_Struct *SCOMx_InitStruct)
{
SCOMx_InitStruct->enable_SCOM
=SCOM_ENABLE_DEFAULT;
SCOMx_InitStruct->usartInitParm.USART_BaudRate
=SCOM_BaudRate_DEFAULT;
SCOMx_InitStruct->usartInitParm.USART_HardwareFlowControl
=SCOM_HardwareFlowControl_DEFAULT;
SCOMx_InitStruct->usartInitParm.USART_WordLength
=SCOM_WordLength_DEFAULT;
SCOMx_InitStruct->usartInitParm.USART_Parity
=SCOM_Parity_DEFAULT;
SCOMx_InitStruct->usartInitParm.USART_StopBits
=SCOM_StopBits_DEFAULT;
SCOMx_InitStruct->usartInitParm.USART_Mode
=SCOM_Mode_DEFAULT;
SCOMx_InitStruct->SCOM_USART_PreemptionPriority
=SCOM_USART_PreemptionPriority_DEFAULT;
SCOMx_InitStruct->SCOM_USART_SubPriority
=SCOM_USART_SubPriority_DEFAULT;
}
//******************************