多个switch嵌套怎么写好,有没别的写法

nicker08 2010-07-22 11:52:54
开发单片机的,他要求是串口输入操作命令和操作数,操作数和操作码都不是固定长度的,现在我能想到的就是switch里面在嵌套switch,关键是命令和数据都不等长,让我头痛啊

比如说命令是0xff,0xaa,后接8B数据,实现功能1;
命令0xee,0xcc,0xdd,后接20B数据实现功能2;
还有很多
命令都是唯一可译的


有没有什么建议啊
...全文
817 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
nicker08 2010-07-24
  • 打赏
  • 举报
回复
我自己写出来了,前面还有写变量定义,
unsigned char data[5];
unsigned char data_display[20];
unsigned char data_diy[8];
unsigned char data_flag=0;
unsigned char flag=0;
nicker08 2010-07-24
  • 打赏
  • 举报
回复
void response(unsigned char x)
{
data[data_flag]=x;
/*********************系统设置部分**********************/
switch(data[0])
{
case 0xfe:
{
if(data_flag>0)
switch(data[1])
{
case 0x47:
{
if(data_flag>2&&data[2]==0x01) //
{
if(flag>3&&data[3]>0&&data[3]<9) //命令正确,开始接受数据
{
data_display[flag]=data[4];
flag++;
if(flag==20) //接收完20B数据
{
//hanshu();
data_flag=0;
flag=0;
break;
}
break;
}
data_flag++;
break;
}
data_flag++;
break;
}
nicker08 2010-07-24
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 marshalking0000 的回复:]

swith的case太多确实挺麻烦的,每个都要一个break;
[/Quote]
这个倒无所谓,问题是不能把操作数误识别为操作命令,我昨天写了一个基本可以,但是有bug,求个健壮的啊
hrx1989 2010-07-24
  • 打赏
  • 举报
回复
单片机!!
也在学习中!
marshalking0000 2010-07-24
  • 打赏
  • 举报
回复
swith的case太多确实挺麻烦的,每个都要一个break;
versed8 2010-07-24
  • 打赏
  • 举报
回复
17 楼 的高手,能给个具体的例子吗


nicker08 2010-07-24
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 jldream110 的回复:]

这个问题 你应该去 单片机版 问 。 用串口中断模式接收,在中断里设置关键字,把你说的 命令的第一个字节如 oxaa 看做是 head 。用head索引下面的数据,在数据接收完 设置全局标志 如 finish。 在中断里 不用switch 嵌套。switch 只 case head 就行 然后查询标志finish ,然后执行动作。
[/Quote]

感觉很有用。。。
但还是不是非常清晰该怎么做
blackmailer 2010-07-23
  • 打赏
  • 举报
回复
要不你用循环吧,其实用switch效率还是很高的。
例如unsigned int mm[]={0xee,0xcc,0xdd};
m1:数据1
  m2:数据2
  ..
  mn:数据n
for(int gg=0;gg<10;gg++){
if(input==mm[gg])
{
}
}
zjf30366 2010-07-23
  • 打赏
  • 举报
回复
正如楼上的所言,使用状态机也是不错的选择。当然使用switch也不是不可。问题是都可以解决的。
jackyjkchen 2010-07-23
  • 打赏
  • 举报
回复
数组索引+函数指针能几乎解决所有需要大量switch和if……else的情况,我差不多从学编程的第二年起,就从来不用switch了
bobo364 2010-07-23
  • 打赏
  • 举报
回复
《编译原理》词法分析之有限状态自动机,
应该可以,或者用5楼的hash也是不错的选择

顺便问下7楼有啥《编译原理》的好点的入门的书吗?原来大学里没这门课了
fancyivan 2010-07-23
  • 打赏
  • 举报
回复
你知道的太多了
theoneluck 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ayw215 的回复:]
引用 7 楼 zhao4zhong1 的回复:

《编译原理》词法分析之有限状态自动机

同意
写个状态自动机就好办啦
[/Quote]

你知道的太多了
ayw215 2010-07-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

《编译原理》词法分析之有限状态自动机
[/Quote]
同意
写个状态自动机就好办啦
Lonelywolf1899 2010-07-23
  • 打赏
  • 举报
回复
楼上会的好多啊,编译原理都出来了。

赵4老师 2010-07-23
  • 打赏
  • 举报
回复
《编译原理》词法分析之有限状态自动机
偶是江湖中人 2010-07-23
  • 打赏
  • 举报
回复
switch就用在这种场合了
若实在不想的话,自己就编写一个函数来实现
Qlaiaqu 2010-07-23
  • 打赏
  • 举报
回复
可以采用hash的方式进行处理:
首先使用某种hash算法,将命令导入该函数,返回某个整数值,然后使用一层switch就可以了。
主要是你要设计好hash算法,保证好接口的能接受所有数据,以及保证好计算结果的唯一性。
这样既简单,速度又快。
jixingzhong 2010-07-23
  • 打赏
  • 举报
回复
当然可以把指令部分合并取值,不过这样看代码的时候就很痛苦了..
jixingzhong 2010-07-23
  • 打赏
  • 举报
回复
switch参数只接收整型数值
加载更多回复(6)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧