- unsigned char keyscan()
- {
- unsigned char keynum = 0;
- if(KEY0 == 0)
- {
- delay_ms(10);
- if(KEY0 == 0)
- {
- //keynum =!keynum;
- keynum = 1;
- }while(KEY0 == 0);
- }
- return keynum;
- }
复制代码
扫描按键,按下就启动发送向从机发送数据
- switch(step)
- {
- //进入地址发送步骤
- case 0 :
-
- send_data(); //发送一帧数据
- send_datacnt++; //发送数据计数
- send_addrflag = 1; //开启发送完成标志位后定时器开始计时
- if(ack_flag) //等待接收应答信号,如果没有应答信号表示设备不在线就马上再次发送下一个地址
- {
- ack_flag = 0; //
- step = 1;
-
- clr_recvbuffer(recv_buf); // 清除这一帧应答数据,等待下一帧数据过来
- }
- else
- {
-
- step = 0;
- }
- break;
-
- case 1:
- revc_data(); //接收数据
- if(noeffec_dataflag) //如果接收到的是无效数据就再次从发数据
- {
- noeffec_dataflag = 0; //数据状态标志位清零
- step = 0; //状态机返回第0步
-
- }
- else if(effec_dataflag) //如果接收到的是有效数据就转入第二步
- {
- effec_dataflag = 0;
- step = 2;
- }
- break;
-
- case 2:
- if(send_datacnt >= 15) //如果发送的次数大于15 停止
- {
- //跳出发送程序
- return;
- }
- else
- {
- step = 0; //如果发送的次数小于15 游戏继续
- }
- break;
-
- default: break;
-
-
- }
复制代码
发送后超时检测,发送一帧数据后就开启定时器,因为从机收到数据成功后会立马回发数据,所以
超时检测先定在50ms测试,但是在switch里面无法转入到第二步
- if(send_addrflag == 1) //发送一帧数据后开始倒计时,超时重发地址
-
- {
- send_timecnt ++;
-
- if(send_timecnt<= 50 && recv_flag == 1) //在50毫秒内接收到应答信号
- {
- ack_flag = 1; //下位机应答成功
- send_timecnt = 0; //停止计时标志位
- send_addrflag = 0; //重新将标志位清零
-
- }
- else
- {
-
- ack_flag = 0; //下位机超时为回应
- send_timecnt = 0; //停止计时标志位
- send_addrflag = 0;
- }
-
- }
复制代码 |