微控制器 並口 控制愛普生印表機開發流程記錄

2021-10-08 06:01:08 字數 4087 閱讀 4130

最近做乙個專案,需求是通過崑崙通態的組態觸控螢幕作為上位機監測資料,然後將資料整合最後列印報表輸出。崑崙通態以前可以直接將預覽頁的所有資料都列印出來,包括整屏未顯示完全的。但是現在崑崙通態將win平台換為linux了(據說是因為版權授權問題),於是就沒有這個功能了。因為需求量不夠,也不能獲得廠家的直接支援,於是只能想辦法通過自己下位機去驅動印表機,直接完成資料的列印輸出。

市面上目前主要是惠普與愛普生印表機用得比較多,都有usb與並口兩種介面,因為通過usb控制需要單獨協議,對電路的外圍設計與程式編寫都麻煩許多,於是打算用並口。其實並口好像是專門為印表機而生的,愛普生的針式印表機還保留並口。

最後選用了愛普生的lq-630ii,查詢資料,其使用的是esc語言。

問題1:微控制器如何與印表機通過並口連線起來?

答:印表機的並口線分為兩端,一端連線印表機36針,一端連線pc或者微控制器等控制端25針,這裡作為控制端操作我們就只關心25針介面。

25針控制端接線說明如下:

pcb電路設計接線說明:

問題一總結:

1.25針接線並沒有完全用到,

引腳18~25:8根引腳都是gnd。

引腳1:stb,作為資料選通,也就是當stb從高電平變化為低電平時,資料引腳的資料才會被印表機讀取,也就是告訴印表機資料已經準備完成,可以讀取。

引腳14:feed,自動進紙與否,控制端控制印表機狀態。

引腳15:error,印表機出錯與否,控制端讀取印表機狀態。

引腳16:init,硬體上重啟印表機,大於50us的低電平就將重啟印表機,回到初始狀態,比如清除印表機快取區。

引腳11:busy,印表機忙標誌位,高電平表示印表機正在處理資料,不能接收新的資料,直到變為低電平為止。

引腳10:ack,我暫時沒用到。

引腳2~9:共8位作為並口資料傳輸位,也就是一次傳輸8位資料(1byte)。

注意:1.也就是說其實我們只需要 stb、busy、data 幾組引腳就可以控制印表機了。

2.各個引腳上拉電阻不能少!

問題2:控制端的資料是如何到達印表機的?

答:1.並口8根資料線賦值需要傳送的資料,比如0x80。

2.判斷busy引腳狀態,是否空閒,若忙則等待。

3.空閒狀態時,stb從低電平到高電平脈衝,告訴 印表機可以讀取資料了。

4.印表機獲取資料存於列印緩衝區,遇到換行或者回車資料,或者快取區滿則自動列印資料。

問題3:乙個8位資料如何傳送給印表機?

答:1.其實就是前面問題2的解讀過程,具體**我在測試階段使用了死迴圈while來等待busy空閒,這樣保證資料不丟失,每個位元組都要等待印表機接收到。

void printbyte(unsigned char ch)

2.其實很明顯,上面的死迴圈在作業系統使用多執行緒還可以,如果是純微控制器那就是完全不能用的,所以後來改進了一下,採用輪訓方式,傳送成功返回1下次傳送下乙個資料,失敗返回0並且下次繼續傳送該資料。

unsigned char printbyte(unsigned char ch)

return 0;

}

問題4:一次傳送多個資料是如何操作的?需要注意些什麼?

答:1.首先是前面提到的資料到達印表機過程,也就是先解決了傳送乙個位元組資料的問題(見問題3過程)。

2.其實多個位元組傳送的實質也是乙個個位元組傳送的,第乙個位元組傳送完成,判斷忙狀態,空閒則繼續傳送下乙個位元組。

3.為了保證每乙個資料都到達印表機,不存在控制端傳送了,不管印表機是否正確接收。我想的方法是:用乙個本地buf將我這次需要傳送的n個位元組資料一次存入其中,給乙個從0開始的buf下標計數值,採用輪訓去傳送該buf,每次傳送成功則下標加1,即傳送下乙個資料,否則下標保持不變,繼續傳送該資料。

#define _print_buf_num_ 250

unsigned int print_sign = 0;

unsigned char print_buf[_print_buf_num_]; //

//將指定一位元組資料存入print_buf中,其存入資料個數與下標對應

void printdatatobuf(unsigned int *dataaddr, unsigned char byte)

//將指定字串存入print_buf中,注意不能包含0x00,字串會自動切斷

void printdatatobufs(unsigned int *dataaddr, unsigned char mydata)

}}

問題5:這兩個函式怎麼使用的?

答:1.主函式中對命令等資料操作都是乙個乙個存入buf中的,而對於字串則使用第二個函式一次存入。

#define _gjjlbb_ "列印測試內容\r\n"

print_sign = 0;//每次存入前復位下標,表示從0開始

//設定左邊界

printdatatobuf(&print_sign, 0x1b);

printdatatobuf(&print_sign, 0x6c);

printdatatobuf(&print_sign, 0x01);

//設定下劃線

printdatatobuf(&print_sign, 0x1c);

printdatatobuf(&print_sign, 0x2d);

printdatatobuf(&print_sign, 1);

printdatatobufs(&print_sign, _gjjlbb_); //真實列印資料

//取消下劃線

printdatatobuf(&print_sign, 0x1c);

printdatatobuf(&print_sign, 0x2d);

printdatatobuf(&print_sign, 0);

printdatatobufs(&print_sign, "\r\n"); //印表機遇到回車換行才回去馬上列印出來

rowdatacombinationok = 1; //本次資料組合完成,需要開始列印標誌

2.到這裡有沒有發現,我本次需要列印的資料都存在print_buf中,從下標0開始,一共存入了多少資料呢?其實就是print_sign的值,因為傳入的指標,所以每次存資料後其值也會對應改變。

問題6:資料已經存入buf中,個數也已經知道,如何輪訓傳送給印表機呢?

答:1.關鍵步驟如下,具體在**輪訓需要根據你自己的程式需求。

//printdatareadaddr 是從0 開始的讀取buf資料的下標位址

//print_sign代表本次buf中乙個有多少資料

if(printdatareadaddr < print_sign)

//將讀取值傳送給印表機,成功才累加讀取位址

if(printbyte(readprintbufdata)) }

//本次一行資料寫入完成

else

問題7:上位機有很多資料需要傳送給印表機列印,怎能操作呢?

答:1.印表機是接收到一行資料(若該行資料中包含回車換行則自動立即列印),否則需要等待印表機的快取區滿才自動列印。

2.lq-630ii印表機快取區 32k。

3.為了保證印表機每次完整列印一行資料後再去列印下一行,我們使用的是應答方式,也就是下位機作為直接驅動印表機的控制端,在印表機完成一行列印後主動請求下一行資料,上位機收到新的資料請求後將資料傳送給下位機。這中間最重要的是通訊協議中需要定義行標誌,上下統一,從而保證請求與接收資料的唯一性。

總結:下位機需要列印第一行,則向上位機傳送1,上位機收到1則將第一行資料按照特定格式與編號1一起傳送給下位機,下位機收到1與自己請求編號1相同,則獲取該訊息後的資料報,解析資料,列印出來。接著將請求編號設定為2,去請求第二行資料,依次類推。

51微控制器系列知識4 並口 1

一 l 51微控制器有4個並行輸入 輸出口,每個口有8根口線,因而4個埠共有32根口線。每個都是雙向口,既可以做輸入口,又可以做輸出口用。每個口都包含乙個鎖存器和1個輸入緩衝器及輸出驅動器。單片微機實用技術 第二版.王桂良 孫明義編著.四川大學出版社 1 po口 l 埠和其中的鎖存器 p0 p3 有...

微控制器控制繼電器

一 什麼是繼電器 繼電器 英文名稱 relay 是一種電控制器件,是當輸入量 激勵量 的變化達到規定要求時,在電氣輸出電路中使被控量發生預定的階躍變化的一種電器。網上找了幾張實物圖 二 繼電器的應用與型別 應用 通常應用於自動化的控制電路中,它實際上是用小電流去控制大電流運作的一種 自動開關 故在電...

51微控制器控制引腳

一般情況下,微控制器的引腳當中,除了電源引腳和晶振引腳,其它的都是io口。當我們控制微控制器的引腳高低時,我們把引腳當做輸出引腳 當我們需要檢測連線到微控制器引腳上的電平時,我們把引腳當做輸入引腳使用。使引腳p1.5輸出高電平,可以這樣寫 p1 0x20 或者 sbit p1 5 1 第一種寫法,在...