完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
代码运行条件:
(1) 大端发送; (2) 上位机发送一帧数据的时间间隔不能大于主循环周期; (3)数据帧满足下面格式:
void USART6_Init (void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE); //修改 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;//修改 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure);//修改 GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_USART6);//修改 GPIO_PinAFConfig(GPIOC,GPIO_PinSource7,GPIO_AF_USART6); //修改 NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_Init(USART6,&USART_InitStructure); USART_ITConfig(USART6,USART_IT_RXNE,ENABLE);//打开接收中断 USART_Cmd(USART6,ENABLE); } void USART6_IRQHandler() { unsigned char rCh; static char rCnt = 0; if(USART_GetITStatus(USART6,USART_IT_RXNE) != RESET) { rCh = USART_ReceiveData(USART6); COM6_RecvBuf[rCnt] = rCh; if(rCnt == 0) //帧头0xAA { rCnt = (0xAA != rCh)?0:rCnt+1; } else if(rCnt == 1) //帧头0x55 { rCnt = (0x55 != rCh)?0:rCnt+1; } else if(rCnt == 2) //类型type { //这里可以根据类型的范围进行如上的处理 rCnt++; } else if(rCnt == 3) //长度len { rCnt++; } else if(rCnt > 3) //值value { rCnt++; if(rCnt == 6+COM6_RecvBuf[3]) { rCnt = 0; memcpy(COM6_RecvBufBck,COM6_RecvBuf,RECV_BUF_SZ);//缓冲 COM6_RecvFin = 1; //通知主循环处理 } } } } int main(void) { int i; //代码段1 while(1)//该循环不能太慢,否则数据缓冲区会被部分修改 { //代码段2 if(COM6_RecvFin == 1) { COM6_RecvFin = 0; CMD_Analysis();//分析接收到的这帧数据 } //代码段3 } return 0; } //在以后再仔细分析数据接收较快而处理较慢的问题吧,本课题主要讨论的是如何完整的接收一个数据帧,在数据源正确的情况下不丢帧 |
||||
|
||||
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1802 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1096 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
735 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1685 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
746浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
580浏览 3评论
602浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 03:47 , Processed in 1.065391 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号