找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11269|回复: 14
打印 上一主题 下一主题
收起左侧

求助:我用stm32f103串口接收数据,怎么处理接收后的数据呢?

  [复制链接]
跳转到指定楼层
楼主
ID:331360 发表于 2018-8-16 18:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
5黑币
我用stm32f103串口接收数据,怎么处理接收后的数据呢?
比如说,串口接收数据为数字1,stm32怎么样识别这个数字1

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:387026 发表于 2018-8-16 19:49 | 只看该作者
可以通过显示屏,或者LED亮暗来识别吧
回复

使用道具 举报

板凳
ID:387033 发表于 2018-8-16 20:25 | 只看该作者
void Init_NVIC(void) {                  NVIC_InitTypeDef NVIC_InitStructure;                        //定义一个NVIC向量表结构体变量          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置中断组 为2             NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                                //配置串口1为中断源         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //设置占先优先级         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //设置副优先级         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能串口1中断         NVIC_Init(&NVIC_InitStructure);                                                                                //根据参数初始化中断寄存器                  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel6_IRQn;                                //配置串口1为中断源         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //设置占先优先级         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //设置副优先级         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能串口1中断         NVIC_Init(&NVIC_InitStructure);                                                                                //根据参数初始化中断寄存器                  NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel7_IRQn;                                //配置串口1为中断源         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;           //设置占先优先级         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                               //设置副优先级         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                        //使能串口1中断         NVIC_Init(&NVIC_InitStructure);                                                                                //根据参数初始化中断寄存器                   }
回复

使用道具 举报

地板
ID:364278 发表于 2018-8-16 21:29 | 只看该作者
pc机和单片机通信的话发送的默认接收到的实际是1的ascll码,你可以上网搜搜如何转换,将接收的处理一下就能转换了
回复

使用道具 举报

5#
ID:384109 发表于 2018-8-16 21:48 | 只看该作者
用判断语句,或SWITCH语句,串口通讯都是由协议的,接收到数据后根据协议格式和内容进行判断就行了
回复

使用道具 举报

6#
ID:308437 发表于 2018-8-16 23:29 | 只看该作者
原子历程直接有呢,还是识别数组的呢。你去看下。
回复

使用道具 举报

7#
ID:387162 发表于 2018-8-17 13:54 | 只看该作者
一般是16进制的
回复

使用道具 举报

8#
ID:174087 发表于 2018-8-17 14:32 | 只看该作者
使用串口助手发送的“1”其实是字符“1”,在接收判断的时候注意变量类型就可以了
回复

使用道具 举报

9#
ID:331360 发表于 2018-8-17 18:46 | 只看该作者
yousunny 发表于 2018-8-16 23:29
原子历程直接有呢,还是识别数组的呢。你去看下。

可以给发一下吗?谢谢
回复

使用道具 举报

10#
ID:331360 发表于 2018-8-17 19:02 | 只看该作者
人中狼 发表于 2018-8-16 21:48
用判断语句,或SWITCH语句,串口通讯都是由协议的,接收到数据后根据协议格式和内容进行判断就行了

这个while应该怎么改一下呢
while(1)
    {       
       if(USART_RX_STA&0x8000)
                {                                          
                        len=USART_RX_STA&0x3fff;//
                        printf("\r\nÄú·¢ËíμÄÏûÏ¢Îa:\r\n");
                        HAL_UART_Transmit(&UART1_Handler,(uint8_t*)USART_RX_BUF,len,1000);        //·¢Ëí½óêÕμ½μÄêy¾Y
                        while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_TC)!=SET);                //μè′y·¢Ëí½áêø
                        printf("\r\n\r\n");//2åèë»»DD
                        USART_RX_STA=0;
                }else
                {
                        times++;
                        if(times%5000==0)
                        {
                                printf("\r\nALIENTEK MiniSTM32¿a·¢°å ′®¿úêμÑé\r\n");
                                printf("ÕyμãÔ-×ó@ALIENTEK\r\n\r\n\r\n");
                        }
                        if(times%200==0)printf("Çëêäèëêy¾Y,òÔ»Ø3μ¼ü½áêø\r\n");  
                        if(times%30==0)LED0=!LED0;//éá˸LED,ìáê¾Ïμí3ÕyÔúÔËDD.
                        delay_ms(10);   
                }
    }
回复

使用道具 举报

11#
ID:383525 发表于 2018-8-17 21:13 | 只看该作者
看你定义的是用什么类型接收,如果是char型就是字符,如果你用的是int型接收,那就可以直接当做int的使用,其实还是看传输协议两边的人是怎么定义的,只要对应好关系就可以的
回复

使用道具 举报

12#
ID:280876 发表于 2018-8-23 20:12 | 只看该作者
这是我写modbus串口中断处理函数,你看一下

#if EN_USART1_RX                   //如果使能了接收             

void USART1_IRQHandler(void)
{
  u8 res;          
  if((__HAL_UART_GET_FLAG(&USART1_RS485Handler,UART_FLAG_RXNE)!=RESET))  //接收中断
  {                
    HAL_UART_Receive(&USART1_RS485Handler,&res,1,1000);
    if(RS485_RX_CNT<2047)
    {
      RS485_RX_BUFF[RS485_RX_CNT]=res;                //记录接收到的值
      RS485_RX_CNT++;                              //接收数据增加1
      __HAL_TIM_CLEAR_IT(&htim3, TIM_IT_UPDATE);  //清除中断标志
      __HAL_TIM_SetCounter(&htim3,0);  //当接收到一个新的字节,将定时器3复位为0,重新计时(相当于喂狗)
      __HAL_TIM_ENABLE(&htim3);       //启动定时器
      
      
    }
  }
}   
#endif
回复

使用道具 举报

13#
ID:381818 发表于 2018-8-24 09:35 | 只看该作者
如果你是16进制发送的话,直接if判断接收是否为1就可以了,如果不是的话你就判断是否位字符“1”
回复

使用道具 举报

14#
ID:389529 发表于 2018-8-24 10:25 | 只看该作者
读出来存在相应的数组里,有空就去处理,怎么处理要看需求
回复

使用道具 举报

15#
ID:389552 发表于 2018-8-24 10:27 | 只看该作者
C语言的标准库里有一个函数叫int atoi(const char *nptr);
头文件, #include <stdlib.h>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表