我最近在做套用AT89S52开发的控制柜的板子, 是利用RS485的方式从上位机通过单片机控制40个接口。
协议、通信、控制功能都已经实现了,现在为了加强协议的抗干扰性,在协议里面加了一位“01”和“04”命令标识,例如我发送 68 01 01 06 01 00 00 00 8C,单片机接收到这串指令后,只是通过译码器识别40个接口的高低电平的状态,而不通过译码器发送这串指令去控制任何一个接口的高低电平,然后再给上位机发送一串指令,让上位机知道40个接口的状态;我要是发送68 01 04 06 01 00 00 00 8C,单片机接收到这串指令后,通过译码器将1号接口置为高电平,然后再给上位机发送一串指令,让上位机知道40个接口的状态;
目前程序流程就是上位机发一组指令,单片机返回一组指令,我现在在协议里加上命令标示后(“04”好说,保存原状就行)当单片机收到带“01”的指令后,怎么样不向译码器发送这串指令去控制接口,并且读一遍所有接口的状态返回给上位机?怎么样通过程序控制单片机如何处理接收到的指令?
下面是我写得这部分功能代码,那位专家帮忙指导下,如做过类此的东西,能直接附上代码让我学习下最好了!!!!谢谢- void main(void)
- {
- unsigned char i;
- UART_init(); //初始化串口
-
- LED=0; //red lamp
- RS485E=0; //green lamp
-
- // addr_re();
- (*((void (*)())(addr_re)))(); // 执行上一行代码,将rst数组当函数调用
- (*((void (*)())(rq)))();
-
- //UART_init(); //初始化串口
- for(i = 0;i < 10 ;i++)
- {
- //首先发送一次数据作为测试用
- (*((void (*)())(COM_send)))();
- }
- while(1)
- {
-
- WDI=0;
-
- if(read_flag==1) //如果取数标志已置位,就将读到的数从串口发出
- {
-
- RS485E=1;
- (*((void (*)())(COM_send)))();
- _nop_();
- read_flag=0; //取数标志清0
- }
- else
- {
- RS485E=0;
- }
-
- WDI=1;
- //;_nop();
-
- }
- }
下面是协议定义部分内容,协议写在中断里面了- case 2: //命令标示
- if(temp==0x01)
- {
- cmd_order=temp;
- state=3;
- }
- else if(temp==0x04)
- {
- cmd_order=temp;
- state=3;
- }
- else
- {
- rc_index=0;
- state=0;
- MSG_LEN=0;
- sum=0;
- }
- break;
- case 3: //接收数据长度
- if(temp<=7)
- {
- MSG_LEN=temp;
- prar_len=MSG_LEN-1;
- state=4;
- }
- else
- {
- rc_index=0;
- state=0;
- MSG_LEN=0;
- sum=0;
- }
- break;
- case 4: //获取命令参数
- rbut[rc_index]=temp;
- sum=sum+temp;
- rc_index=rc_index+1;
- if(rc_index>=prar_len) state=5;
- break;
|