久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5946|回復: 4
收起左側

CCD紅外掃描槍 PS/2接口協議的郁悶

[復制鏈接]
ID:68618 發表于 2014-11-22 16:08 | 顯示全部樓層 |閱讀模式
CCD紅外掃描槍,PS/2接口,如果用232接口的價格貴點,MCU那邊程序處理好一點,掃描出來的條碼掃描槍按照PS/2協議自動發送給上位機,默認形式下有個終止符,就是回車鍵,鍵值是0x5a,0xf0,0x5a,現在的情況是掃描EAN-13型的條碼,當然對接收的數據可以采用兩種辦法,判斷接收的位數,因為位數是死的,到那個位數值就處理判斷,然后送LCD顯示看一下,還有一種就是判斷有沒有碰到終止符,碰到就說明一組數據傳輸完畢,畢竟條碼有長有短,為了靈活運用,偶還是采用了判斷終止符的辦法。奇怪無比郁悶的是老是成功閱讀了若干個條碼后會無法判斷識別出終止符了。MCU肯定沒死機,執行其他程序是OK的,因為沒有仿真器,所以設置了幾個點亮關閉LED的動作來判斷程序到底出錯在哪里。折騰了三天了,急死了。唉,附一些程序。

void Receive_Data(void)
    {
          if((Int_counter>0)&&(Int_counter<9))   //第1位起始位低電平拋棄,故從第2次中斷開始到第9次中斷是8位數據
          {
               Key_buf=Key_buf>>1;
               if((DATA_STATUS))
              Key_buf|=0x80;//如果數據線是高電平,則為1
          }
        Int_counter++;
        while(!(CLK_STATUS));//等待PS/2的CLK拉高
     
        if(Int_counter>10)
         {
              Int_counter=0;
              Receive_status|=BIT(0);//成功接收一個數據后設置一個判斷位
         }
   }   
   
/********************************INT1中斷**************************************/
#pragma interrupt_handler int1_isr:3
void int1_isr(void)
      {
             if(IsEnd==FALSE)
              {
                    Receive_Data();
                    if(Receive_status&0x01)
                     {
                            Receive_status&=~BIT(0);
                            PS2_Receive.buf[PS2_Receive.cnt]=Key_buf;//第0個即存放第一個數據
                            PS2_Receive.cnt++;
                            LED_GREEN_ON;
                            if(PS2_Receive.buf[PS2_Receive.cnt-1]==0x5a)//碰到"ENTER"終止符,通碼+斷碼為0x5a+0xf0,0x5a
                            {
                                   IsEnd=TRUE;
                                   Endcnt=0;
                                   LED_RED_ON;
                            }
                       if(PS2_Receive.cnt>64)//正常的話,數據接收不可能超過64個,如果成功閱讀碰到終止符,程序跳轉執行完后會自動清PS2_Receive.cnt;無法閱讀,LED_GREEN老是接收了滿數據后暗滅交替,IsEnd老是為FALSE,也就是判斷不到0x5a啊,就是郁悶在這里。
                        {
                                 LED_GREEN_OFF;
                        }
          }
     }   
    else
     {
           Receive_Data();
           if(Receive_status&0x01)
             {
                   PS2_Receive.buf[PS2_Receive.cnt]=Key_buf;
                   PS2_Receive.cnt++;   
                   Receive_status&=~BIT(0);
                   Endcnt++;
                   if(Endcnt==2)
                   {
                           if((PS2_Receive.buf[PS2_Receive.cnt-1]==0x5a)&&(PS2_Receive.buf[PS2_Receive.cnt-2]==0xf0))     
                             {
                                   if((SendToRBuf(PS2_Receive)==COMM_NO_ERR))
                                    {
                                          Comm_status|=BIT(7);
                                    }
                                  IsEnd=FALSE;
                                  Endcnt=0;
                                  PS2_Receive.cnt=0;
                                  LED_GREEN_OFF;
                           }
                         else
                           {
                                 IsEnd=FALSE;
                                 Endcnt=0;
                                 PS2_Receive.cnt=0;
                                 Scan_error|=BIT(7);   
                          }
                  }
             }
        }
   }                                                                                                  
回復

使用道具 舉報

ID:68618 發表于 2014-11-22 16:08 | 顯示全部樓層
奶奶的,老天終于開眼,昨天晚上應該是徹底搞定了。這幾天一直感覺還有層紙,一直捅不破,就在成功的邊緣。PS/2協議的格式11個CLK信號,第一個DATA線上是START BIT,要為低電平,然后余下8個CLK是數據,再接下來兩個CLK是奇偶校驗位和STOP BIT,接收端的子程序也是網上看別人寫的,他們就很簡單的把第一個CLK和最后兩個CLK省略掉不判斷了,也是可以很好的成功接收判斷的,而且偶運用的時候一開始也是能夠接收好多是成功的。但是他們那種是對應PS/2接口的鍵盤做的,畢竟敲一個鍵下去才有數據傳輸,而且時間間隔比較久,不象偶這種情況一下子連續幾十個數據過來,頭腦里想想如果某個數據接收錯誤,判斷不到終止符,會重新讀幾遍會好的,但實際情況很糟糕,錯了一個后連續讀若干遍的數據都是錯誤的,又沒有仿真器,只能一步步摸索,后來發現接收過來的數據感覺老是會少右移若干位。想想以前接收無線電信號的碼頭,UART傳輸,都要嚴格判斷初始的碼頭或命令頭,于是嚴格按照PS/2的協議,第一次CLK產生后,下降沿中斷進去后,先判斷一下,DATA線上的START BIT是不是為0,如果不為0,就舍棄,結果昨晚試了上千下,證實下來有很多時候會判斷到START BIT是不為0的,但讀出來的數據準確率幾乎是99.9%以上了,就發現一次錯誤,還是第一位數字不正確,余下的都是正確的,而且程序也都能順利執行,不會中斷發生后老是捕捉不到終止符。積聚幾天的郁悶情緒一掃而光,現在才完成整個項目的1/6左右工作量,要加快進度了。
以下是接收的代碼。
void Receive_Data(void)
    {
if(Int_counter==0)
{
      if((DATA_STATUS)==0)
{
     Enable=1;
     Int_counter++;
}
        else
{
     Enable=0;
     LED_GREEN_ON;
         }
}
else
{
      if(Enable)
      {
                   if((Int_counter>0)&&(Int_counter<9)) //第1位起始位低電平拋棄,故從第2次中斷開始到第9次中斷是8位數據
                    {
                        Key_buf=Key_buf>>1;
                        if(DATA_STATUS)
                        Key_buf|=0x80;//如果數據線是高電平,則為1
                    }
                   Int_counter++;  
                   while(!(CLK_STATUS));//等待PS/2的CLK拉高  
     
                   if(Int_counter>10)
                    {
                        Int_counter=0;
      Enable=0;
                        Receive_status|=BIT(0);//成功接收一個數據后設置一個判斷位
                    }  
      }
        }
   }
LED_GREEN_ON還是會動作的,主程序里再把LED清掉,LED閃爍出現的頻率還是蠻多的,大概快速連續掃描幾十個條碼后會出現閃爍一下。但數據是成功正確的。
回復

使用道具 舉報

ID:68618 發表于 2014-11-22 16:09 | 顯示全部樓層
一個字,暈!
兩個字,真暈!
三個字,還是暈!
四個字,徹底的暈!
回復

使用道具 舉報

ID:80259 發表于 2015-5-17 15:13 | 顯示全部樓層
樓主,您好。請問您可不可以把您寫的關于CCD紅外掃描器與單片機的通信整個程序給我?謝謝
郵箱:2274074978@qq.com
回復

使用道具 舉報

ID:157626 發表于 2016-12-26 00:04 | 顯示全部樓層
樓主,我們也在做這個東西,可以幫我們做么,有償。郵箱:cwlong163@163.com
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本电影一区二区 | 日韩精品一区二区三区在线观看 | 97色在线视频 | 99精品免费久久久久久久久日本 | 国产精品a久久久久 | 蜜桃av鲁一鲁一鲁一鲁 | 欧美日韩国产一区二区 | 亚洲精品日韩综合观看成人91 | 午夜免费av | 久久国产综合 | 亚洲麻豆 | 日韩中文字幕 | 亚洲国产精品一区二区三区 | 久久久青草婷婷精品综合日韩 | 欧美日韩免费视频 | 精品国产一区二区三区性色av | 91亚洲国产成人久久精品网站 | 亚洲精品国产成人 | 一呦二呦三呦国产精品 | 精品一区二区久久久久久久网站 | 狠狠色狠狠色综合日日92 | 日韩三级在线 | 免费观看日韩精品 | 亚洲精品久久久久久久久久久 | 成人国产精品 | 国产精品久久久久久久久久 | 午夜精品视频在线观看 | 国产精品久久久久久久久久久久午夜片 | 国产日韩精品一区二区 | 国产在线一区二区 | 亚洲福利网站 | av天天澡天天爽天天av | 高清av电影 | 99亚洲 | 欧美精品在线观看 | 亚洲欧洲在线观看视频 | 精品国产欧美一区二区三区成人 | 日韩欧美在线观看 | 成人欧美一区二区三区在线观看 | 亚洲小说图片 | 日韩第一区 |