亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標題:
CCD紅外掃描槍 PS/2接口協議的郁悶
[打印本頁]
作者:
aabbcc
時間:
2014-11-22 16:08
標題:
CCD紅外掃描槍 PS/2接口協議的郁悶
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);
}
}
}
}
}
作者:
aabbcc
時間:
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閃爍出現的頻率還是蠻多的,大概快速連續掃描幾十個條碼后會出現閃爍一下。但數據是成功正確的。
作者:
aabbcc
時間:
2014-11-22 16:09
一個字,暈!
兩個字,真暈!
三個字,還是暈!
四個字,徹底的暈!
作者:
yl129921
時間:
2015-5-17 15:13
樓主,您好。請問您可不可以把您寫的關于CCD紅外掃描器與單片機的通信整個程序給我?謝謝
郵箱:
2274074978@qq.com
作者:
cwlong
時間:
2016-12-26 00:04
樓主,我們也在做這個東西,可以幫我們做么,有償。郵箱:
cwlong163@163.com
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1