标签:
功能:通过PC机的串口调试助手发送数据给串口A,串口B接收到串口A发送的数据,再由串口B将接收到的数据返回给PC机的串口调试助手。#ifndef multiple_serial_H#define multiple_serial_H#define MAX_RECV_DATA_MASK
(0x3f)#define MAX_COM_COUNT
(6)typedef
signed
char
int8_t;typedef
signed
short
intint16_t;typedef
signed
int
int32_t;typedef
unsigned
char
uint8_t;typedef
unsigned
short
intuint16_t;typedef
unsigned
int
uint32_t;#define NEXTAI_COM1_NAME"COM1"#define NEXTAI_COM2_NAME"COM2"#define NEXTAI_COM3_NAME"COM3"#define NEXTAI_COM4_NAME"COM4"#define NEXTAI_COM5_NAME"COM5"#define NEXTAI_COM6_NAME"COM6"enum{NEXTAI_COM1_ID=1,NEXTAI_COM2_ID,NEXTAI_COM3_ID,NEXTAI_COM4_ID,NEXTAI_COM5_ID,NEXTAI_COM6_ID};typedef
struct _NEXTAI_CHANNEL_INFO_{uint8_t
local_com_id;//nextai_uint8 *databuf;//nextai_uint16 data_read_p;//nextai_uint16 data_write_p;uint8_t
used_flag;}NEXTAI_CHANNEL_INFO;/******************************************************************************** local_channel_data : 通道数据结构* data_recv_flag : 是否有数据flag,1表示*******************************************************************************/typedef
struct _NEXTAI_MGR_INFO_{NEXTAI_CHANNEL_INFO local_channel_data[MAX_COM_COUNT];uint8_t
data_recv_flag;}NEXTAI_MGR_INFO;static NEXTAI_MGR_INFO*
local_com_mgr_p=0;void serial_nvic_Configuration(uint8_t
comID);static
void serial_gpio_configuration(uint8_t
comID);static
void serial_rcc_configuration(uint8_t
comID);uint8_t serial_Configuration(uint8_t*comName);uint8_t serial_send(uint8_t
comID,uint8_t*databuf,uint32_t
datalen);uint32_t serial_recv(uint8_t
comID,uint8_t*databuf,uint32_t
datalen);void clean_rebuff(void);#endif#include"multiple_serial.h"#include"stm32f4xx_gpio.h"#include"stm32f4xx_usart.h"#include<string.h>unsigned
char uart_buf[MAX_RECV_BUF_LEN]={0};uint8_t com1_recv_buf[MAX_RECV_BUF_LEN]={0};int com1_gloabl_p=0;int com1_read_p=0;uint8_t com4_recv_buf[MAX_RECV_BUF_LEN]={0};int com4_gloabl_p=0;int com4_read_p=0;uint8_t com5_recv_buf[MAX_RECV_BUF_LEN]={0};int com5_gloabl_p=0;int com5_read_p=0;uint8_t com6_recv_buf[MAX_RECV_BUF_LEN]={0};int com6_gloabl_p=0;int com6_read_p=0;//串口gpio的配置static
void serial_gpio_configuration(uint8_t
comID){GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,
ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,
ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,
ENABLE);RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,
ENABLE);/*
Configure USART Tx and Rx as alternate function push-pull */if(comID
== NEXTAI_COM1_ID){GPIO_StructInit(&GPIO_InitStructure);GPIO_PinAFConfig(GPIOA,
GPIO_PinSource9, GPIO_AF_USART1);GPIO_PinAFConfig(GPIOA,
GPIO_PinSource10, GPIO_AF_USART1);GPIO_InitStructure.GPIO_Mode=
GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed=
GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType=
GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_9;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_10;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=
GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed=
GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType=
GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_4;GPIO_Init(GPIOF,&GPIO_InitStructure);}elseif(comID==
NEXTAI_COM4_ID){GPIO_StructInit(&GPIO_InitStructure);GPIO_PinAFConfig(GPIOA,
GPIO_PinSource0, GPIO_AF_UART4);GPIO_PinAFConfig(GPIOA,
GPIO_PinSource1, GPIO_AF_UART4);GPIO_InitStructure.GPIO_Mode=
GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed=
GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType=
GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_1;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_0;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=
GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed=
GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType=
GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_7;GPIO_Init(GPIOA,&GPIO_InitStructure);}elseif(comID==
NEXTAI_COM5_ID){GPIO_StructInit(&GPIO_InitStructure);GPIO_PinAFConfig(GPIOC,
GPIO_PinSource12, GPIO_AF_UART5);GPIO_PinAFConfig(GPIOD,
GPIO_PinSource2, GPIO_AF_UART5);GPIO_InitStructure.GPIO_Mode=
GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed=
GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType=
GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_2;GPIO_Init(GPIOD,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_12;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_Init(GPIOC,&GPIO_InitStructure);}elseif(comID==
NEXTAI_COM6_ID){GPIO_StructInit(&GPIO_InitStructure);GPIO_PinAFConfig(GPIOC,
GPIO_PinSource6, GPIO_AF_USART6);GPIO_PinAFConfig(GPIOC,
GPIO_PinSource7, GPIO_AF_USART6);GPIO_InitStructure.GPIO_Mode=
GPIO_Mode_AF;GPIO_InitStructure.GPIO_Speed=
GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_OType=
GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_6;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_7;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_Init(GPIOC,&GPIO_InitStructure);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Mode=
GPIO_Mode_OUT;GPIO_InitStructure.GPIO_Speed=
GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType=
GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd=
GPIO_PuPd_UP;GPIO_InitStructure.GPIO_Pin=
GPIO_Pin_8;GPIO_Init(GPIOC,&GPIO_InitStructure);}}//串口时钟的配置static
void serial_rcc_configuration(uint8_t
comID){if(comID==
NEXTAI_COM1_ID){RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,
ENABLE);}elseif(comID==
NEXTAI_COM4_ID){RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4,ENABLE);}elseif(comID==
NEXTAI_COM5_ID){RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);}elseif(comID==
NEXTAI_COM6_ID){RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,
ENABLE);}}//配置各个串口的中断处理函数,优先级相同void serial_nvic_Configuration(uint8_t
comID){NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);if(comID==
NEXTAI_COM1_ID){NVIC_InitStructure.NVIC_IRQChannel=
USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=
ENABLE;NVIC_Init(&NVIC_InitStructure);}elseif(comID==
NEXTAI_COM4_ID){NVIC_InitStructure.NVIC_IRQChannel=
UART4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=
ENABLE;NVIC_Init(&NVIC_InitStructure);}elseif(comID==
NEXTAI_COM5_ID){NVIC_InitStructure.NVIC_IRQChannel=
UART5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=
ENABLE;NVIC_Init(&NVIC_InitStructure);}elseif(comID==
NEXTAI_COM6_ID){NVIC_InitStructure.NVIC_IRQChannel=
USART6_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;NVIC_InitStructure.NVIC_IRQChannelCmd=
ENABLE;NVIC_Init(&NVIC_InitStructure);}}/*串口参数配置*/uint8_t serial_Configuration(uint8_t*comName){USART_InitTypeDef USART_InitStructure;uint8_t
comID =0;if(strcmp(NEXTAI_COM1_NAME,(constchar*)comName)==0){comID=
NEXTAI_COM1_ID;}elseif(strcmp(NEXTAI_COM4_NAME,(constchar*)comName)==0){comID=
NEXTAI_COM4_ID;}elseif(strcmp(NEXTAI_COM5_NAME,(constchar*)comName)==0){comID=
NEXTAI_COM5_ID;}elseif(strcmp(NEXTAI_COM6_NAME,(constchar*)comName)==0){comID=
NEXTAI_COM6_ID;}/*
System Clocks Configuration */serial_rcc_configuration(comID);/*
Configure the GPIO ports */serial_gpio_configuration(comID);USART_InitStructure.USART_WordLength=
USART_WordLength_8b;USART_InitStructure.USART_Parity=
USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=
USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=
USART_Mode_Rx| USART_Mode_Tx;if(comID==
NEXTAI_COM1_ID){USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_StopBits=
USART_StopBits_1;USART_Init(USART1,&USART_InitStructure);}elseif(comID==
NEXTAI_COM4_ID){USART_InitStructure.USART_BaudRate=38400;USART_InitStructure.USART_StopBits=
USART_StopBits_1;USART_Init(UART4,&USART_InitStructure);}elseif(comID==
NEXTAI_COM5_ID){USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_StopBits=
USART_StopBits_1;USART_Init(UART5,&USART_InitStructure);}elseif(comID==
NEXTAI_COM6_ID){USART_InitStructure.USART_BaudRate=9600;USART_InitStructure.USART_StopBits=
USART_StopBits_1;USART_Init(USART6,&USART_InitStructure);}serial_nvic_Configuration(comID);if(comID==
NEXTAI_COM1_ID){USART_Cmd(USART1,
ENABLE);USART_ITConfig(USART1,
USART_IT_RXNE, ENABLE);}elseif(comID==
NEXTAI_COM4_ID){USART_Cmd(UART4,
ENABLE);USART_ITConfig(UART4,
USART_IT_RXNE, ENABLE);}elseif(comID==
NEXTAI_COM5_ID){USART_Cmd(UART5,
ENABLE);USART_ITConfig(UART5,
USART_IT_RXNE, ENABLE);}elseif(comID==
NEXTAI_COM6_ID){USART_Cmd(USART6,
ENABLE);USART_ITConfig(USART6,
USART_IT_RXNE, ENABLE);}return
comID;}/******************************************************************************** 函数名 : serial_send* 描 述 : 发送某个端口的数据* 输 入 : comID: 串口标识号databuf: 发送数据缓冲区datalen: 发送数据长度* 输 出 : None* 返 回 : None*******************************************************************************/uint8_t serial_send(uint8_t
comID,uint8_t*databuf,uint32_t
datalen){int
i =0;uint8_t
nextai_timer =0;if(comID==
NEXTAI_COM1_ID){GPIO_SetBits(GPIOF,
GPIO_Pin_4);//清除标志位,否则第1位数据会丢失USART_GetFlagStatus(USART1,
USART_FLAG_TC);for(i=0;
i< datalen; i++){//485
需添加超时检测USART_SendData(USART1,databuf[i]);while(USART_GetFlagStatus(USART1,
USART_FLAG_TC)== RESET){nextai_timer++;if(nextai_timer>>8)return0;}}GPIO_ResetBits(GPIOF,
GPIO_Pin_4);}elseif(comID==
NEXTAI_COM4_ID){GPIO_SetBits(GPIOA,
GPIO_Pin_7);//清除标志位,否则第1位数据会丢失USART_GetFlagStatus(UART4,
USART_FLAG_TC);for(i=0;
i< datalen; i++){//485USART_SendData(UART4,databuf[i]);
while(USART_GetFlagStatus(UART4,
USART_FLAG_TC)== RESET){nextai_timer++;if(nextai_timer>>8)return0;}}GPIO_ResetBits(GPIOA,
GPIO_Pin_7);}elseif(comID==
NEXTAI_COM5_ID){//清除标志位,否则第1位数据会丢失USART_GetFlagStatus(UART5,USART_FLAG_TC);for(i=0;
i< datalen; i++){USART_SendData(UART5,databuf[i]);while(USART_GetFlagStatus(UART5,
USART_FLAG_TC)== RESET){nextai_timer++;if(nextai_timer>>8)return0;}}}elseif(comID==
NEXTAI_COM6_ID){GPIO_SetBits(GPIOC,
GPIO_Pin_8);//清除标志位,否则第1位数据会丢失USART_GetFlagStatus(USART6,USART_FLAG_TC);for(i=0;
i< datalen; i++){USART_SendData(USART6,databuf[i]);while(USART_GetFlagStatus(USART6,
USART_FLAG_TC)== RESET){nextai_timer++;if(nextai_timer>>8)return0;}}GPIO_ResetBits(GPIOC,
GPIO_Pin_8);}return
datalen;}/******************************************************************************** 函数名 : serial_recv* 描 述 : 接收一定长度的数据(从内存中读取数据)* 输 入 : comID: 串口标识号databuf: 接收数据缓冲区datalen: 需要接收数据长度* 输 出 : None* 返 回 : 实际接收到的数据长度*******************************************************************************/uint32_t serial_recv(uint8_t
comID,uint8_t*databuf,uint32_t
datalen){uint16_t
i =0,
nextai_indx=0,
j=0;NEXTAI_MGR_INFO*me=
local_com_mgr_p;if((comID>
NEXTAI_COM6_ID)||(comID<
NEXTAI_COM1_ID))return
0xffffffff;nextai_indx=
comID- NEXTAI_COM1_ID;if(me->local_channel_data[nextai_indx].used_flag==0)return
0xffffffff;if(!(me->data_recv_flag&(1<<
nextai_indx)))return
0xffffffff;if(comID==
NEXTAI_COM1_ID){i=0;while(1){if(com1_read_p==
com1_gloabl_p)break;databuf[i]=
com1_recv_buf[com1_read_p];com1_read_p++;com1_read_p&=
MAX_RECV_DATA_MASK;i++;if(i>=
datalen)break;for(j=0;
j<100;
j++);}me->data_recv_flag=
me->data_recv_flag&(~(1<<
nextai_indx));}if(comID==
NEXTAI_COM4_ID){i=0;while(1){if(com4_read_p==
com4_gloabl_p)break;databuf[i]=
com4_recv_buf[com4_read_p];com4_read_p++;com4_read_p&=
MAX_RECV_DATA_MASK;i++;if(i>=
datalen)break;for(j=0;
j<100;
j++);}me->data_recv_flag=
me->data_recv_flag&(~(1<<
nextai_indx));}if(comID==
NEXTAI_COM5_ID){i=0;while(1){if(com5_read_p==
com5_gloabl_p)break;databuf[i]=
com5_recv_buf[com5_read_p];com5_read_p++;com5_read_p&=
MAX_RECV_DATA_MASK;i++;if(i>=
datalen)break;for(j=0;
j<100;
j++);}me->data_recv_flag=
me->data_recv_flag&(~(1<<
nextai_indx));}if(comID==
NEXTAI_COM6_ID){i=0;while(1){if(com6_read_p==
com6_gloabl_p)break;databuf[i]=
com6_recv_buf[com6_read_p];com6_read_p++;com6_read_p&=
MAX_RECV_DATA_MASK;i++;if(i>=
datalen)break;for(j=0;
j<100;
j++);}me->data_recv_flag=
me->data_recv_flag&(~(1<<
nextai_indx));}return
i;}//中断处理函数只是将发送过来的数据保存到内存void USART1_IRQHandler(void){NEXTAI_MGR_INFO*me=
local_com_mgr_p;if(USART_GetITStatus(USART1,
USART_IT_RXNE)!= RESET){USART_ClearITPendingBit(USART1,USART_IT_RXNE);com1_recv_buf[com1_gloabl_p]=
USART_ReceiveData(USART1);com1_gloabl_p++;com1_gloabl_p&=
MAX_RECV_DATA_MASK;}me->data_recv_flag|=0x01;//{//
uint8_t temp;//
if(USART_GetITStatus(UART5,
USART_IT_RXNE)!= RESET)//
{//
temp= USART_ReceiveData(UART5);//
USART_SendData(UART5,temp);//
}//}void UART4_IRQHandler(void){NEXTAI_MGR_INFO*me=
local_com_mgr_p;if(USART_GetITStatus(UART4,
USART_IT_RXNE)!= RESET){com4_recv_buf[com4_gloabl_p++]=
USART_ReceiveData(UART4);com4_gloabl_p&=
MAX_RECV_DATA_MASK;}me->data_recv_flag|=0x08;}void UART5_IRQHandler(void){NEXTAI_MGR_INFO *me = local_com_mgr_p;if(USART_GetITStatus(UART5, USART_IT_RXNE)
!= RESET){com5_recv_buf[com5_gloabl_p++] = USART_ReceiveData(UART5);com5_gloabl_p &= MAX_RECV_DATA_MASK;}me->data_recv_flag |= 0x10;}void USART6_IRQHandler(void){NEXTAI_MGR_INFO*me=
local_com_mgr_p;if(USART_GetITStatus(USART6,
USART_IT_RXNE)!= RESET){com6_recv_buf[com6_gloabl_p++]=
USART_ReceiveData(USART6);com6_gloabl_p&=
MAX_RECV_DATA_MASK;}me->data_recv_flag|=0x20;}#include"multiple_serial.h"#include"stm32f4xx_gpio.h"#include"stm32f4xx_usart.h"#include<string.h>#include<stdio.h>int main(){char*COM1="COM1";char*COM4="COM4";serial_Configuration((uint8_t*)COM1);serial_Configuration((uint8_t*)COM4);extern
unsigned
char uart_buf[64];int
i=0,j;unsigned
char printf_buf[128]={0};uint8_t
flag=0;while(1){flag=
serial_recv(1, uart_buf,64);//延时让serial_recv函数接收完PC机串口调试助手发来的全部数据for(i=10000;i!=0;i--)for(j=3000;j!=0;j--);if(flag>0){sprintf((char*)printf_buf,"receive
data len is %d\n", flag);//将字符串写入printf_buf中serial_send(4,
printf_buf, strlen((char*)printf_buf));//发送printf_buf中的内容到串口serial_send(4,
uart_buf, flag+1);}
}return
0;}#include"multiple_serial.h"#include"stm32f4xx_gpio.h"#include"stm32f4xx_usart.h"#include<string.h>#include<stdio.h>int main(){char*COM1="COM1";char*COM4="COM4";char*COM5="COM5";char*COM6="COM6";serial_Configuration((uint8_t*)COM1);serial_Configuration((uint8_t*)COM6);extern
unsigned
char uart_buf[64];unsigned
char printf_buf[128]={0};while(1){//从串口调试助手发送数据,串口A接收到数据后产生中断,在中断函数中将数据保存到com6_recv_buf中,
//然后通过serial_recv函数将数据从com6_recv_buf中保存到接收uart_buf中,最后调用serial_send回传给串口调试助手。flag=
serial_recv(1, uart_buf,64);if(flag>0){serial_send(4,
uart_buf, flag+1);}}return0;}标签:
原文地址:http://blog.csdn.net/zhubao124/article/details/51941865