当前位置: 首页 > news >正文

热门网站建设加盟平台网页游戏排行榜西游

热门网站建设加盟平台,网页游戏排行榜西游,公司企业网站建设目的,网站建设涉及的标准单片机串口接收状态机stm32 前言 项目的芯片stm32转国产#xff0c;国产芯片的串口DMA接收功能测试不通过#xff0c;所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣#xff0c;不过我的芯片已经主频跑…单片机串口接收状态机stm32 前言 项目的芯片stm32转国产国产芯片的串口DMA接收功能测试不通过所以要由原本很容易配置的串口空闲中断触发DMA接收数据的方式转为串口逐字节接收的状态机接收数据 两种方式各有优劣不过我的芯片已经主频跑到72m对于接收115200波特率的数据绰绰有余。 给一张图接收状态机就是设置串口每次接收1byte的数据就触发一次中断在中断函数里面逐次统计数据最后把有用的数据包放进缓存区给到处理区 ‍ ​​ 1.首先现在cubemx的串口的dma接收关闭具体配置看截图然后导出下代码 ​​ ​​ ​​ 2.开始配置代码这里我用的代码编辑器是vscode个人认为vscode编辑代码keil调试的方式是最舒服的有兴趣的可以试试绝对提一档。 ​​ 先定义一个uint8_t的变量用来接收每次收到的数据一定注意只要你是用的cubemx生成的project在生成的文件下都有把你改的代码写到/* USER CODE BEGIN 0 */​下面不然等你下次在cubemx更改底层配置的时候会把你改好的代码擦洗掉。 uint8_t USART1_rxdata 0;​​ 往下滑找到这个串口1的初始化函数加这个串口接收中断启动函数 HAL_UART_Receive_IT(huart1, USART1_rxdata, 1);然后我们来到中断c文件下在串口1中断里增加我们的接收状态机 ​​ rec_buff_scan(USART1_rxdata); HAL_UART_Receive_IT(huart1, USART1_rxdata, 1); 这里的rec_buff_scan就是我们定义的函数因为我的习惯是在我自己创建的文件下写代码避免更改cube生成的东西所以文件名可能就不一样这里就只看代码就好了 首先先把定义全部cv下来我们协议是[0XAA,0X55,命令包长度…(命令包内容)校验和高位校验和底位的格式如果你们的不一样就改下RecState里面的变量名 ​​ #define REC_BUFF_SIZE 100 uint8_t rec_buf_scan[REC_BUFF_SIZE]; // 数据接收缓冲区 uint8_t rec_index 0; // 数据接收索引 extern uint8_t USART1_rxdata; // 存储接收的单个字节// 状态枚举 typedef enum {STATE_WAIT_FOR_HEAD1, // 等待帧头AASTATE_WAIT_FOR_HEAD2, // 等待帧头55STATE_WAIT_FOR_LENGTH, // 等待命令包长度STATE_RECEIVE_DATA, // 接收命令包数据STATE_WAIT_FOR_CHECKSUM1, // 等待校验和字节1STATE_WAIT_FOR_CHECKSUM2 // 等待校验和字节2 } RecState;RecState rec_state STATE_WAIT_FOR_HEAD1; // 初始状态 uint8_t packet_length 0; // 数据包长度 uint16_t checksum 0; 然后把状态机整段cv状态机就是把接收部分分成一个个的状态条件符合就会跳到下一段最后会在校验和验证整段数据是否接收正常正常的话就会送入数据处理的函数里面我这里定义了一个rec_buf_scan[REC_BUFF_SIZE]是跟我之前的接收数据缓存区做兼容而已你们可以只导入数据包的内容不需要把头和校验和导入这里其实就是我懒了嘻嘻 我这里的处理其实你们不用借鉴的 直接在STATE_WAIT_FOR_CHECKSUM2状态判断校验和成功后把接收成功flagtrue然后在你另外的处理函数就可以处理数据包了这里的memcpy一下也是很有必要的我们的处理缓存和接收缓存一定要区分开来因为没有自锁所以只能在成功的时候把接受的数据塞入处理缓存至于我这里为什么塞了全部数据而不是只有数据包主要是配合我以前的处理无需借鉴总之你上班就明白我的难处要改来改去还要兼容是很麻烦的事情 ​​ void rec_buff_scan(uint8_t byte) {switch (rec_state) {case STATE_WAIT_FOR_HEAD1:if (byte 0xAA) {rec_state STATE_WAIT_FOR_HEAD2;rec_index 0; // 重置接收索引checksum 0; // 重置校验和rec_buf_scan[rec_index] byte;//可以不用导入}break;case STATE_WAIT_FOR_HEAD2:if (byte 0x55) {rec_state STATE_WAIT_FOR_LENGTH;rec_buf_scan[rec_index] byte;//可以不用导入} else {rec_state STATE_WAIT_FOR_HEAD1;}break;case STATE_WAIT_FOR_LENGTH:packet_length byte;rec_buf_scan[rec_index] byte;//可以不用导入rec_state STATE_RECEIVE_DATA;break;case STATE_RECEIVE_DATA:if (rec_index-3 packet_length) {//这里if里面的条件把-3去掉 rec_buf_scan[rec_index] byte;}if (rec_index-3 packet_length) {//这里if里面的条件把-3去掉 checksum Frame_CalculationChecksum(rec_buf_scan[3], packet_length); // 计算校验和rec_state STATE_WAIT_FOR_CHECKSUM1;}break;case STATE_WAIT_FOR_CHECKSUM1:if (byte ((checksum 8) 0xFF)) {rec_state STATE_WAIT_FOR_CHECKSUM2;rec_buf_scan[rec_index] byte;//可以不用导入} else {rec_state STATE_WAIT_FOR_HEAD1;}break;case STATE_WAIT_FOR_CHECKSUM2:if (byte (checksum 0xFF)) {//这里做你自己的处理就好了 程序跑到这里就已经验证通过了rec_buf_scan[rec_index] byte;//可以不用导入memcpy(rec_buff[0], rec_buf_scan[0], rec_index);Device_data.device_state JUDGE_FLAG;Data_queue_rx.Interrupt_Len rec_index;}// 无论校验是否通过回到初始状态rec_state STATE_WAIT_FOR_HEAD1;break;} }用到的Frame_CalculationChecksum函数是校验和计算函数具体操作就是把接收的数据需要校验的那一段的第一个元素地址放进去把数据包长度放进去他会算完把结果返回我这里就是简单的数据包加和校验 uint16_t Frame_CalculationChecksum(uint8_t *pData, uint8_t u8Length) {uint16_t u16check_sum 0;uint8_t i;for (i 0; i u8Length; i){u16check_sum u16check_sum pData[i];}return u16check_sum; }这样基本上就把接收状态机整完了可以仿真下试试看。 3.仿真测试 可以看到断点在第二步的时候0xaa已经存入数据缓存去了 ​​ 同理我们直接看到接收成功这里打断点可以看到我们在把接收成功时已经把所有数据都塞进处理缓存区了。这里再严谨点最好是在移完数据后把接收缓存清零一下但是不清也不影响。 ​​ ​​ 4.小结 串口中断状态机是最基本的协议解析接收方式作为一个嵌入式人员这个你必须要学会的写法不限制但是流程就是跟我的差不多的具体根据协议来定的。 这种接收方式适合没有dma外设的单片机比如51单片机国产单片机在项目开发完成进行降本的时候也是可能会改到这种方式的如果有不规范的地方请留言我会更改。
http://www.w-s-a.com/news/159379/

相关文章:

  • 响应式网站介绍页面模板功能找不到
  • 公司网站如何seo自己做资讯网站
  • 天津网站建设软件开发招聘企业信用信息查询公示系统上海
  • 网站备案中做正品的网站
  • 网站建设0基础学起青海企业网站开发定制
  • 网站定制项目上海快速建站
  • 大型视频网站建设方案东莞企业网站建设开发
  • 西安php网站制作可以用AI做网站上的图吗
  • 网站开发工程师和前端企业网络推广公司
  • 泉州开发网站的公司有哪些电脑网页翻译
  • 河北省建设机械会网站首页刚做的网站怎么收录
  • 什么网站专门做自由行的framework7做网站
  • 网页设计与网站建设书籍包头住房与城乡建设局网站
  • 重庆网站建设平台免费猎头公司收费收费标准和方式
  • 形象设计公司网站建设方案书打开一个不良网站提示创建成功
  • 网站手机页面如何做网站关键字 优帮云
  • 免费的黄冈网站有哪些下载软件系统软件主要包括网页制作软件
  • 企业微站系统重庆高端网站建设价格
  • 有没有做衣服的网站吗网站自适应开发
  • 青海省制作网站专业专业定制网吧桌椅
  • 网站开发的项目17岁高清免费观看完整版
  • 手机网站建设多少钱一个门网站源码
  • 重庆 网站开发天津住房和城乡建设厅官方网站
  • 泰安高级网站建设推广厦门高端网站建设定制
  • jsp网站开发引用文献手机seo排名
  • 创建一家网站如何创设计网页的快捷网站
  • 1688代加工官方网站h5开发教程
  • 静态网站源码下载网站怎么显示备案号
  • 网站代码设计网站开发维护任职要求
  • 长寿做网站的电话怎么快速刷排名