zoukankan      html  css  js  c++  java
  • F4107Usart数据处理程序

    解决:Cortex-M4上,usart自己主动发送数据计划。
    
    
        1. usart快速突破。数据还没有被处理。usart中断会把盖掉的数据不被处理。

    数据丢失。 2.此过程需要main处理4一个usart口的数据,这样出错的概率会更大。 提出例如以下解决方式: 第一:规定每条完毕的数据长度。步会超过256字节。 第二:我们规定数据的结束表标志为数据的后三位为,FFFFFF 第三:定义一个全局的数据,他是一个三维数组该数据用来存放4个usart口发上来的数据。 uint8_t usart_data[4][5][256]; 以下解析为什么要定义一个三维数组: 第一个下标4:它分别用来接受不同的usart口的数据。 第二个下标5:它表示每一个usart最多能缓存的数据条数是5. 第三个下标256:它用来表示最多一条数据能存256个字节。 以下是程序假设实现。 定义例如以下变量: 一:接受usart数据缓冲器的定义。它是一个全局的三维数据 uint8_t usart_data[4][5][256] = {0}; 二:记录每一个usart口。当前接收到的数据条数。 uint8_t data_count[4] = {0}; 三:记录当前接受到的数据数。 uint8_t data_len[4] = {0}; 四:用来记录出错的次数。 uint8_t error_count = 0; void UART_DATA_handle(uint8_t route) { if(data_count[route]<5) { if((usart_data[route][data_count[route]][data_len[route]-3]==0xFF) &&(usart_data[route][data_count[route]][data_len[route]-2]==0xFF) &&(usart_data[route][data_count[route]][data_len[route]-1]==0xFF)) { if(usart_data[route][data_count[route]][0]==data_len[route]) { data_count[route]++; data_len[route] = 0; if(data_count[route]>5) { data_count[route]=0; } else { error_count++; } } } } } void USART1_IRQHANDLER(void) { if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART1, USART_IT_RXNE); usart_data[0][data_cout[0]][data_len[0]++] = USART_Rece_Data(USART1); if(data_len[0]>2) { usart_data_route(0); } } return; } void USART2_IRQHANDLER(void) { if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART2, USART_IT_RXNE); usart_data[1][data_cout[1]][data_len[1]++] = USART_Rece_Data(USART2); if(data_len[1]>2) { usart_data_route(1); } } return; } void USART3_IRQHANDLER(void) { if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART3, USART_IT_RXNE); usart_data[2][data_cout[2]][data_len[2]++] = USART_Rece_Data(USART3); if(data_len[2]>2) { usart_data_route(2); } } return; } void USART4_IRQHANDLER(void) { if(USART_GetITStatus(USART4, USART_IT_RXNE) != RESET) { USART_ClearITPendingBit(USART4, USART_IT_RXNE); usart_data[3][data_cout[3]][data_len[3]++] = USART_Rece_Data(USART4); if(data_len[3]>2) { usart_data_route(3); } } return; } /****main*******/ uint8_t tmp[512] = {0}; static __INLINE void process_usartdata(uint8_t *tmpdata, uint8_t *usartdata, char *usart_format, int flag){ int tmp =0,count=0,i=0; memset(tmpdata,0x00,512); printf(usart_format,flag); for(i=0;i<usartdata[0]+1;i++){ tmp = sprintf(&tmpdata[count],"%02X", *(usartdata+i)); count += tmp; } memset(usartdata,0x00,256); printf(tmpdata); } int main(void) { ......... uint8_t i = 0; while(1) { for(i=0;i<4;i++) { while(data_count[i]>0) { process_usartdata(tmp,usart_data[i][data_count[i]],"usart:%d",i); data_count[i]--; } if(data_count[i]>5) { data_count[i] = 0; } } } ........ }


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    从乙方到甲方,我在做什么
    局域网ARP攻击防护
    【中间件安全】WebSphere安全加固规范
    【中间件安全】Jboss安全加固规范
    【中间件安全】IIS6安全加固规范
    【中间件安全】Weblogic 安全加固规范
    【中间件安全】Nginx 安全加固规范
    【中间件安全】Tomcat 安全加固规范
    openresty开发系列33--openresty执行流程之2重写赋值阶段
    openresty开发系列32--openresty执行流程之1初始化阶段
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4683124.html
Copyright © 2011-2022 走看看