我想用串口二实现串口的实验,各种参数都按照串口二进行了修改,但串口助手上还是没收到数据,我想问三个问题
一、你定义USART_RX_STA变量怎么就能检验串口一的传输状态的呢?我只是在usart.c中看到他的定义u16 USART_RX_STA=0; 关于它内部的各个位是怎么判断是在哪里?
二、你定义USART_RX_STA变量适用于串口二的状态检验吗?
三、如果写一个检测串口二传输状态的变量应该怎么写?(这个问题问的可能有些大,还是希望指点一下学习方向)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
恩,我再理解理解谢谢你了
谢谢你,已经理解了,谢谢你耐心的解答,
使用stm32f103zet6芯片吗?
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* 使能STM32的USART对应GPIO的Clock时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_AFIO , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* 初始化STM32的USART的TX管脚,配置为复用功能推挽输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
/* 初始化STM32的USART的RX管脚,配置为复用功能输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA , &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = bound; //串口的波特率,例如115200 最高达4.5Mbits/s
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据字长度(8位或9位)
USART_InitStructure.USART_StopBits = USART_StopBits_1; //可配置的停止位-支持1或2个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //双工模式,使能发送和接收
/* 根据传入的参数初始化STM32的USART配置 */
USART_Init(USART1, &USART_InitStructure);
/* 使能STM32的USART功能模块 */
USART_Cmd(USART1, ENABLE);
//Usart1 NVIC 配置
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 子优先级
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
}
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x8000; //接收完成了
}
else //还没收到0X0D
{
if(Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
USART_RX_STA++;
}
if(USART_RX_STA>63)
USART_RX_STA=0;//接收数据错误,重新开始
}
}
}
}
一周热门 更多>