初级会员

- 积分
- 99
- 金钱
- 99
- 注册时间
- 2017-4-1
- 在线时间
- 16 小时
|
本帖最后由 hualuoshuijia 于 2017-11-20 09:26 编辑
个位大神,小弟新手,想读取一个串口输出的传感器模块,但不知如何将如何用串口2接收数据,并通过串口1打印数据到串口调试助手,
下面是我的程序:
串口2:
#include "usart2.h"
#include "usart.h"
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN];
u16 USART2_RX_STA=0;
void noise_Init(u32 baud) //利用RS485通信(RS485初始化程序)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;//中断结构体定义
RCC_APB1PeriphClockCmd(noise_USART_RCC,ENABLE); //开串口2时钟
RCC_APB2PeriphClockCmd(noise_PORT_RCC, ENABLE); //开GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //TX
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(noise_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//RX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(noise_PORT, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //FSMC_A13(CS-485)
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//复用推挽输出
// GPIO_Init(GPIOG, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = baud;//波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位长度
USART_InitStructure.USART_StopBits = USART_StopBits_1;//1个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//硬件流控制
USART_Init(noise_USART, &USART_InitStructure);
USART_Cmd(noise_USART, ENABLE);
USART_ITConfig(noise_USART, USART_IT_RXNE, ENABLE);//开启接收中断
//通道DMA4,外设串口1,存储器USART2_RX_BUF的内容发送到USART1->DR,
//DMAx_Init(DMA1_Channel4,(u32)&USART1->DR,(u32)USART2_RX_BUF,USART2_MAX_RECV_LEN);
/* 设置NVIC参数 */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //打开USART1的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
void USART2_IRQHandler()
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//判断是否产生接收中断
{
res=USART_ReceiveData(USART2);
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值
}
}
串口1:
#include "usart.h"
#include "usart2.h"
int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用
{
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return ch;
}
void USART1_Init(u32 baud) //波特率设置(9600)
{
GPIO_InitTypeDef GPIO_InitStruct; //GPIO口结构
USART_InitTypeDef USART_InitStructure; //串口结构
NVIC_InitTypeDef NVIC_InitStructure;//中断优先级结构
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//打开IO口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//打开串口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //打开
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9; //TX 串口输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10; //RX 串口输入
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStruct);
USART_InitStructure.USART_BaudRate = baud; //波特率9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8
USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None; //硬件流控制失能
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; //发送和接收模式
USART_Init(USART1, &USART_InitStructure); //初始化配置
USART_Cmd(USART1, ENABLE);//使能USART1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能串口接收中断(当接收数据信号产生时,就会进入中断函数进行处理)
USART_ClearFlag(USART1,USART_FLAG_TC);//清除发送完成标志位
//凡使用了中断,都要配置中断优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//中断优先级分组
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //使能串口1中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler() //中断入口函数
{
u8 res;
if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //判断是否进入发送中断
{
res = USART_ReceiveData(USART1);//接收TX端的数据
USART_SendData(USART1, res);//将接收的数据发送出去
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == SET); //判断是否发送完成
}
USART_ClearFlag(USART1, USART_FLAG_TC);//清除发送完成标志
}
main函数:
#include "public.h"
#include "usart2.h"
u8 USART1_TX_BUF[USART2_MAX_RECV_LEN]; //串口1,发送缓存区
int main()
{
u16 i,rxlen;
USART1_Init(9600); //波特率设置(9600)
noise_Init(9600);
while(1)
{
rxlen=USART2_RX_STA&0x7FFF;//得到数据长度
for(i=0;i<rxlen;i++)
{
USART1_TX_BUF=USART2_RX_BUF;
}
USART2_RX_STA=0; //启动下一次接收
USART1_TX_BUF=0; //自动添加结束符
printf("%s\r\n",USART1_TX_BUF);
delay_ms(1000);
}
}
我的思路是串口2接收数据,并保存到数组,然后利用串口1的printf函数打印出来,但不知道为什么打印不出来
|
|