你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
谁是谁的谁520 发表于 2018-9-19 16:54 现象如下,刚开始正常,后面发送没有回应,关闭串口,重新打开,又恢复正常,不过产品应该是重启过,数据 ...
查看全部评分
butterflyspring 发表于 2018-9-19 12:19 你说的死机,是指MCU不运行了?建议你还是调试看看,是MCU真的死机了,还是只是信息没发出去 ...
wenyangzeng 发表于 2018-9-19 14:03 与上位机进行的485通讯应该判别上位机送来的地址码是否是本机的,如果不是本机的地址码就取消不通讯,否则 ...
谁是谁的谁520 发表于 2018-9-19 14:18 GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_1);//配置为TXD、RXD GPIO_PinAFConfig(GPIOA, GPIO ...
Your UAT Feedback is needed within today.
5.18活动板子会不会是STM32L4呢
STM32隐藏
STM32 CUBE软件中找不到STM32L4系列单片机
应用
AAA
测试测试12345
群
tiwen
BBBB
问题已解决,原因是USART_GetFlagStatus和USART_GetITStatus,,,,,获取ORE标记,需用USART_GetFlagStatus,然后清0
评分
查看全部评分
评分
查看全部评分
只要断开上位机发送,产品就会重启,然后恢复正常
评分
查看全部评分
确实是本机的地址码,就是设备每次都是运行一段时间。刚开始上位机发过来,产品也有返回。。。过一段时间,一直在发相同的命令,就没有回应了。。。。断开上位机发送一下,会看到产品重启,然后又恢复正常。。。。。然后按照上面的逻辑,是不是就会貌似死机的现象
{
USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
NVIC_InitTypeDef NVIC_InitStructure;
USART_ClockInitTypeDef usartClock;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* Enable the USART Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_DeInit(USART1);//串口状态到初始状态
USART_InitStructure.USART_BaudRate = BusBaudRate; //波特率默认为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;//禁用RTSCTS硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送接收
usartClock.USART_Clock = USART_Clock_Disable; //串口同步时钟禁止
usartClock.USART_CPOL = USART_CPOL_Low; //时钟下降沿有效
usartClock.USART_CPHA = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉
usartClock.USART_LastBit = USART_LastBit_Disable;//最后数据位的时钟脉冲不输出到SCLK引脚
USART_ClockInit(USART1,&usartClock);//初始化串口时钟
USART_Init(USART1, &USART_InitStructure);//初始化串口
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断
USART_Cmd(USART1, ENABLE);//调试串口(串口1)使能
}
{
USART_InitTypeDef USART_InitStructure; //定义串口初始化结构体
NVIC_InitTypeDef NVIC_InitStructure;
USART_ClockInitTypeDef usartClock;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* Enable the USART Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_DeInit(USART2);//串口状态到初始状态
USART_InitStructure.USART_BaudRate = 9600; //波特率默认为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;//禁用RTSCTS硬件流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//使能发送接收
usartClock.USART_Clock = USART_Clock_Disable; //串口同步时钟禁止
usartClock.USART_CPOL = USART_CPOL_Low; //时钟下降沿有效
usartClock.USART_CPHA = USART_CPHA_2Edge;//数据在第二个时钟沿捕捉
usartClock.USART_LastBit = USART_LastBit_Disable; //最后数据位的时钟脉冲不输出到SCLK引脚
USART_ClockInit(USART2,&usartClock);//初始化串口时钟
USART_Init(USART2, &USART_InitStructure);//初始化调试串口(串口1)
USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //开启接收字节中断
USART_ITConfig(USART2,USART_IT_IDLE,ENABLE); //开启接收空闲中断
USART_Cmd(USART2, ENABLE);//调试串口(串口1)使能
}
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
那应该考虑接收中断如果发生溢出需要先读SR,再读DR寄存器
USART_ClearFlag(USART2,USART_FLAG_ORE); //读SR
USART_ReceiveData(USART2); //读DR
{
if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET)//接收一字节数据
{
if(FlagIdle == 1)
{
Com2RevBuff[Com2RecvPtr++]= USART_ReceiveData(USART2);
if(Com2RevBuff[0] == 0x42)
{
if(Com2RecvPtr >= 24)
{
FlagIdle = 2;
Com2RecvPtr = 0;
}
}
else
{
Com2RecvPtr = 0;
}
}
else
{
USART_ReceiveData(USART2);
Com2RecvPtr = 0;
}
}
if(USART_GetITStatus(USART2,USART_IT_ORE) != RESET)//接收一字节数据
{
USART_ClearFlag(USART2, USART_FLAG_ORE);
USART_ReceiveData(USART2);
}
}