矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 3031|回复: 8

【求助】C51编程switch语法

[复制链接]
     
发表于 2021-5-6 18:56:11 | 显示全部楼层 |阅读模式
一段程序如下:
  1. /*********************************************************************************************
  2. 函数名:主函数
  3. 调  用:无
  4. 参  数:无
  5. 返回值:无
  6. 结  果:程序开始处,无限循环
  7. 备  注:判断从串口接收到的数据,如果是“Turn on”就点亮LED,如果是“Turn off”就熄灭LED
  8. /**********************************************************************************************/
  9. void main (void)
  10. {
  11.         UART_init();
  12.         PowerCtrl=1;//初始状态熄灭LED
  13.         unsigned char UART_data; //定义串口接收数据变量
  14.         while(1)
  15.         {
  16.                 if (RI == 1)//接收中断标志位为1时
  17.                 {
  18.                         UART_data = SBUF;        //接收数据 SBUF 为单片机的接收发送缓冲寄存器
  19.                         RI = 0;                        //令接收中断标志位为0(软件清零)
  20.                         switch(UART_data)
  21.                         {
  22.                                 case Turn on:PowerCtrl=0;break;//检测收到的字符串为“Turn on”,就点亮LED
  23.                                 case Turn off:PowerCtrl=1;break;//检测收到的字符串为“Turn off”,就熄灭LED
  24.                         }

  25.                 }               

  26.         }
  27. }
  28. /**********************************************************************************************/
复制代码

编译就报错,case Turn on:PowerCtrl=0;break;这里拼写错误,因为case后面的Turn和on之间有个空格,如果我把空格去掉的话,报错信息就变成“Turnon”未定义。假如我现在就是从串口收到了带有空格的字符串“Turn on”,用这个字符串触发点亮LED,这段程序应该怎么处理?搞一个数组变量做过渡?
     
发表于 2021-5-6 22:22:09 | 显示全部楼层
C语言的switch对比较的变量类型是限制的,实际上它比较的都是整数。字符串在C语言中的保存是一个字节序列,后面放一个字符0x00;
不理解你的SBUF是哪里定义的,是字符串还是字符。
如果是字符串,你的逻辑是要做字符串比较,直接用strcmp函数吧。
如果是字符,那么把你的turnon和turnoff定义为整数常量,比如
#define TURNON 1
#define TURNOFF 0

评分

2

查看全部评分

回复 支持 1 反对 0

使用道具 举报

     
发表于 2021-5-6 19:17:13 | 显示全部楼层
不可以这样的,

UART_data 是单字节.
Turn on 按你的描述是一个没有结束符的字符串,

如果是电脑端,可以用 fgets 和 strcmp 来处理.
单片机中,就要自己写一个比较函数.

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2021-5-6 19:24:38 | 显示全部楼层
串口接收数据可以写在中断里.
每接收一个数据就存入数组中,注意下标不要越界.
还得定义一个结束符,如 '\0' '\n',

然后main中 判断数组是否匹配就行了.

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2021-5-6 20:42:15 | 显示全部楼层
例如:定义一个静态数组A[7] ,中断函数中,让 A[7]=A[6];A[6]=A[5];'...A[0]=sbuf;后面进入判断 if(A[7]='T' ......)后面执行就行了。

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2021-5-6 21:37:33 | 显示全部楼层
switch 对比的是常量,不是变量

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
发表于 2021-5-6 22:44:41 | 显示全部楼层
unsigned char zjj;

       switch(zjj)
      {
      case 0x0D:  ORA0x0D();break;//1
      case 0x0E:  ASL0x0E();break;//2
      case 0x19:  ORA0x19();break;//3
      case 0x1D:  ORA0x1D();break;//4
      case 0x1E:  ASL0x1E();break;//5
      
      case 0x20:  JSR0x20();break;//6
      case 0x2C:  BIT0x2C();break;//7
      case 0x2D:  AND0x2D();break;//8
      case 0x2E:  ROL0x2E();break;//9

      case 0x39:  AND0x39();break;//10
      case 0x3D:  AND0x3D();break;//11
      case 0x3E:  ROL0x3E();break;//12
     }

void ORA0x0D();
void  ASL0x0E();
void ORA0x19();
void ORA0x1D();
void ASL0x1E();
void JSR0x20();
void BIT0x2C();
void AND0x2D();
void ROL0x2E();
void AND0x39();//10
void AND0x3D();
void ROL0x3E();

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2021-5-7 09:54:35 | 显示全部楼层
是用STC的单片机,学习串口通讯。
看起来用switch来对比串口接收的字符串比较麻烦,我还是先把串口通讯这部分弄明白,先用上位机发送16进制数到串口,用单片机接收,搞明白了单片机串口通讯,再学习字符串处理吧。
感谢各位解答!
回复 支持 反对

使用道具 举报

     
发表于 2021-5-8 19:48:56 | 显示全部楼层
学串口最好有个逻辑分析仪,30元左右的那种saleae逻辑分析仪就可以了,主要是电脑的串口数据停止位默认应该是两位的,不然你看不到他的波形与单片机的常用1位停止位的数据总是连接出错,当时我花了一个星期才发现的!不过现在知道了,单片机就设置为两位停止位就可以了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-28 06:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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