找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3836|回复: 7
收起左侧

关于单片机串口识别HEX

[复制链接]
ID:208180 发表于 2018-4-7 19:01 | 显示全部楼层 |阅读模式
在网上看到一个很有意思的芯片,关于数字声音识别的,其实觉得不如语音识别,但是又觉得数字声音识别这个模块也挺有意思
但是有很多不懂的地方,先在这里跟大家探讨一下:

这个数字声控芯片说默认的波特率是9600,然后通过uart口可以直接识别然后回显出HEX的值,如下图:


我看了简介,他的意思就是,不需要写代码,直接写 串行接口接收数据的代码,就可以识别数字声音转换为HEX也就是十六进制显示,
比如播放一组声音,那串口这边就回显的是“FF FC 00 01”或者“FF FC 10 1D”这样,

刚好最近又在学习串口识别,我只懂得用swich case语句识别单个字符,也不懂得关于串口识别字符串的知识。
我就想问各位大神,如果遇到这样的情况,我需要怎么样让单片机识别到这组HEX显示的数据并且触发继电器闭合或者LED灯亮起呢?


0000.png
2222.png
回复

使用道具 举报

ID:160834 发表于 2018-4-8 22:05 | 显示全部楼层
定义一个数组 例如 unsigned char CN[4];  在串口接收中断里把收到的字符依次存进CN[0];  CN[1];  CN[2];  CN[3];   再判断4个字节内容  用swich case  分别定义收到的内容后做什么反应就可以了。

评分

参与人数 2黑币 +30 收起 理由
admin + 20 回帖助人的奖励!
etxuxu + 10 赞一个!

查看全部评分

回复

使用道具 举报

ID:208180 发表于 2018-4-10 16:06 | 显示全部楼层
QIANLILI 发表于 2018-4-8 22:05
定义一个数组 例如 unsigned char CN[4];  在串口接收中断里把收到的字符依次存进CN[0];  CN[1];  CN[2];   ...

那应该如何把收到的字符存入CN[ ]呢?
要怎么去判断帧尾?比如FF FC 00 01,得怎么判断才能精确的把FF存入CN[0],FC存入CN[1],如此类推呢?
回复

使用道具 举报

ID:208180 发表于 2018-4-10 17:15 | 显示全部楼层
QIANLILI 发表于 2018-4-8 22:05
定义一个数组 例如 unsigned char CN[4];  在串口接收中断里把收到的字符依次存进CN[0];  CN[1];  CN[2];   ...

这样写是对的吗?求前辈帮我指点一下,最近串口这块一直在学习:

  1. void  serial() interrupt 4
  2. {
  3.         int i;
  4.         if(RI)
  5.         {

  6.                 for(i=0;i<4;i++)
  7.                 {
  8.                         while(!RI)
  9.                         ES = 0;                //关闭串行中断
  10.                         RI = 0;               //清除串行接受标志位
  11.                
  12.                         CN[i] = SBUF;            //从串口缓冲区取得数据
  13.                         if(CN[2] == 0x00)
  14.                         {
  15.                                 switch(CN[3])
  16.                                 {
  17.                                         case(0x30):led1=0;delay(200);led1=1;break;
  18.                                         case(0x20):led1=0;delay(200);led1=1;break;
  19.                                         default: break;
  20.                                 }
  21.                         }
  22.                         else if(CN[2] == 0x01)
  23.                         {
  24.                                 switch(CN[3])
  25.                                 {
  26.                                         case(0x30):led2=0;delay(200);led2=1;break;
  27.                                         case(0x20):led2=0;delay(200);led2=1;break;
  28.                                         default: break;
  29.                                 }
  30.                         }
  31.                 }
  32.                 ES = 1;    //允许串口中断
  33.    }//if RI

  34.    if(TI)
  35.    {
  36.    }
  37. }
复制代码
回复

使用道具 举报

ID:275111 发表于 2018-11-1 15:26 | 显示全部楼层
我草,我也是同样的问题呀。高人,有下文了吗?
回复

使用道具 举报

ID:414975 发表于 2018-11-1 19:56 | 显示全部楼层
谢谢分享。
回复

使用道具 举报

ID:387733 发表于 2018-11-2 08:23 | 显示全部楼层
etxuxu 发表于 2018-4-10 17:15
这样写是对的吗?求前辈帮我指点一下,最近串口这块一直在学习:

中断里面只完成接收,判断与执行放在中断外面,这样更合理

int i=0;

void  serial() interrupt 4
{
     uchar temp;
     if(RI)
     {
        RI = 0;               //清除串行接受标志位
        temp = SBUF;
        if((temp==0xff) || (i>3))      // 收到 0xff 重新开始
           i=0;
        if((temp!=0xfc) && (i==1))   // 第2个不是 0xfc,放弃
           i=0;
        CN[i++]=temp;
     }
}
  


.......
    if(i==3)
    {
        if(CN[2] == 0x00)
        {
            switch(CN[3])
            {
               case(0x30):led1=0;delay(200);led1=1;break;
               case(0x20):led1=0;delay(200);led1=1;break;
               default: break;
             }
         }
        else if(CN[2] == 0x01)
         {
            switch(CN[3])
            {
                case(0x30):led2=0;delay(200);led2=1;break;
                case(0x20):led2=0;delay(200);led2=1;break;
                default: break;
             }
        }
    }

评分

参与人数 1黑币 +20 收起 理由
yousunny + 20 赞一个!

查看全部评分

回复

使用道具 举报

ID:275111 发表于 2018-11-2 15:27 | 显示全部楼层
mark一下。回去看。谢谢楼上的高人。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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