- 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;
- }
-
- }
復制代碼 |