中级会员
 
- 积分
- 250
- 金钱
- 250
- 注册时间
- 2019-5-11
- 在线时间
- 39 小时
|
发表于 2021-1-27 17:10:32
|
显示全部楼层
本帖最后由 ma3264175 于 2021-1-29 15:28 编辑
- 串口一中断服务函数如下:
- void USART1_IRQHandler(void) //串口1中断服务程序
- {
- u16 Res;
- u8 lencnt=0;
- u8 Datacount=2;
- u8 Sum=0;
-
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntEnter();
- #endif
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
- {
- USART_RX_BUF[0] = USART_ReceiveData(USART1); //读取接收到的数据
- USART_SendData(USART1,USART_RX_BUF[0]);
-
- }
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntExit();
- #endif
- }
- #endif
- 接收到一串数据: FF 01 07 01 00 DA 00 00 00 E2 ,怎么讲第5、6个字节提取出来
- --------------------------------------
- 思路:
- 加入全局变量 len
- 将你的接受缓冲器改为USART_RX_BUF[len++]
- 这样你得到的 数据就是
- USART_RX_BUF[0]=0xFF;
- USART_RX_BUF[1]=0x01;
- 。
- 。
- 。
- USART_RX_BUF[9]=0x0e2;
- 你按照你需要的取就好了
- ---------------------------------------
- 改写:
- u8 USART_RX_BUF[10];
- u8 deal_buf[10];
- u8 deal_flag=0;
- u8 len=0;
- void USART1_IRQHandler(void) //串口1中断服务程序
- {
- // u16 Res;
- // u8 lencnt=0;
- // u8 Datacount=2;
- // u8 Sum=0;
-
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntEnter();
- #endif
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断
- {
- USART_RX_BUF[len++] = USART_ReceiveData(USART1); //读取接收到的数据
- // USART_SendData(USART1,USART_RX_BUF[0]);
- if(len>9){
- len=0;
- memcpy(&deal_buf,&USART_RX_BUF,10);
- memset(USART_RX_BUF,0,10);
- deal_flag=1;
- }
- else
- USART_SendData(USART1,USART_RX_BUF[len-1]);
- #if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
- OSIntExit();
- #endif
- }
- #endif
- void deal(void)
- {
- if(!deal_flag)retrun;
- deal_flag=0;
- // 加入你的处理程序
- }
- 程序拿txt写的,我没调试但是思路是这样,要是有语法报错你改改就行了!
复制代码 |
|