咨詢電話
ENGLISH0755-88840386發(fā)布時間:2021-04-27 11:33:07 |來源:網(wǎng)絡(luò)轉(zhuǎn)載
本文介紹了單片機與PC機之間的串行通信和RS232串行通信總線標準,以稱重儀表作為下位機,以計算機作為上位機,以RS232作為兩者之間的通信總線。利用VC++的MSComm控件開發(fā)上位機程序,實現(xiàn)了稱重儀表與計算機的串行通信。
稱重儀表是人們生活中所見的最為廣泛的一種儀表,隨著電子科技,稱重技術(shù)等各門學(xué)科的發(fā)展,現(xiàn)在的稱重儀表已不僅僅是將重量顯示出來,而增加了許多新的功能,如串行通信、打印等。該文主要介紹稱重儀表的串行通信,在儀表與計算機的通信中,主要是利用單片機的串行口來實現(xiàn)串行通信,將單片機與計算機相連構(gòu)成上下位機的結(jié)構(gòu),以擴展控制界面,實現(xiàn)人機交互。稱重控制器所用的單片機是SYNCMOS-SM8958A,屬于8052系列單片機的派生產(chǎn)品。
1稱重儀表串行通信
1.1RS232電平轉(zhuǎn)換接口電路
單片機有一個串行通信接口,其接口標準為TTL標準,而計算機串口的接口標準為RS232C接口標準。它適合于數(shù)據(jù)傳輸率0~115200b/s范圍內(nèi)的通信。系統(tǒng)中串行通信在硬件上采用3線制RxD、TxD、GND軟握手的零MODEM方式,僅需要3根線就可在兩個數(shù)字設(shè)備之間實現(xiàn)全雙工的數(shù)據(jù)傳送,即將PC機和單片機的發(fā)送數(shù)據(jù)線TxD與接收數(shù)據(jù)RxD交叉連接,二者的地線GND直接相連,其他信號線可以不用,而采用軟件握手方式。這樣既可以實現(xiàn)預(yù)定的任務(wù),又可以簡化電路設(shè)計節(jié)約成本。但是計算機通過串行接口芯片,發(fā)送和接收的都是TTL電平表示的數(shù)字信息。它與TTLMOS邏輯電平完全不同,邏輯0電平規(guī)定為5~15V之間,邏輯1是電平為-5~-15V之間。因此在將計算機和單片機的RxD和TxD交叉連接時,必須進行電平轉(zhuǎn)換,采用MAXIM公司的MAX232來做電平轉(zhuǎn)換。MAX232屬于MAXIM公司的通用串行接收/發(fā)送驅(qū)動芯片。其外圍電路簡單,只需外接4個0.1μF的電容即可,MAX232將計算機的TxD端輸出的TTL電平信號轉(zhuǎn)換為RS232C電平,輸出到單片機的RxD引腳。
00方式0同步移位寄存器foso/1201方式110位異步收發(fā)由定時器控制10方式211位異步收發(fā)foso/32或foso/6411方式311位異步收發(fā)由定時器控制 SMO,SM1為串行口工作方式選擇位,在文中SM0、SM1為0、1,即串口工作在方式1,該方式為10位一幀的異步串行通信方式,其波特率是可變的,由定時器控制,1位起始位,8位數(shù)據(jù)位,1位停止位,無奇偶校驗位。
1.2單片機串行通信
SM8958A系列單片機通過外部引腳RxD(P3.0,串行數(shù)據(jù)接收端)、TxD(P3.1,串行數(shù)據(jù)發(fā)送端)向用戶提供一個可編程的全雙工串行通信接口。發(fā)送緩沖器和接收緩沖器都是以8031內(nèi)部特殊功能寄存器SBUF的名義存在的,兩個緩沖寄存器公用一個地址99H,可以用讀/寫指令區(qū)分。要發(fā)送數(shù)據(jù)時只需使用“MOV
SBUF,A”寫指令,CPU把累加器A的內(nèi)容寫入發(fā)送的SBUF(99H),再由TxD引腳一位一位地向外發(fā)送;串行接收數(shù)據(jù)時,接收端RxD一位一位地接收數(shù)據(jù)再通過“MOVA,SBUF”讀指令,CPU從接收的SBUF(99H)讀出數(shù)據(jù),送到累加器A中。發(fā)送和接,直到收到一個完整的字符數(shù)據(jù)后通知CPU,
收數(shù)據(jù)過程采用中斷方式,從而可以大大提高CPU的利用效率。
單片機的UART接口是一個全雙工的串行接口,它能同時發(fā)送和接收數(shù)據(jù)。單片機的UART接口有4種工作方式,需要對串行口控制寄存器SCON的設(shè)置來定義串行口的工作方式和控制它的功能。
SM0和SM1為工作方式選擇位
;RI為接收中斷標志;TI為發(fā)送中斷標志;RB8為接收數(shù)據(jù)第9位;TB8為發(fā)送數(shù)據(jù)第9位;REN為接收控制;SM2為多極通信。串行口的控制寄存器SCON控制串行口的工作方式和波特率,發(fā)送和接收過程采用中斷方式。
SCON的TI或RI引發(fā)內(nèi)部串行口中斷或通過內(nèi)部查詢完成中斷功能,波特率發(fā)生器可用定時器T/C1或T/C2設(shè)置。SM8958A有一個標準的串行口,有4種工作方式。通過對串口控制寄存器SCON進行編程完成串口的初始化。單片機可以采用匯編或者C語言,通過對單片機的串口編程,從串口把數(shù)據(jù)發(fā)送給計算機。
SMO,SM1為串行口工作方式選擇位,在文中SM0、SM1為0、1,即串口工作在方式1,該方式為10位一幀的異步串行通信方式,其波特率是可變的,由定時器控制,1位起始位,8位數(shù)據(jù)位,1位停止位,無奇偶校驗位。[page]
1.3單片機串行通信程序設(shè)計
稱重控制器儀表的單片機程序是在KeilC51編譯器下編寫,串行口輸入采用查詢方式,輸出采用中斷方式。voidIRQ_UartSio(void){if(SSR0_PER==1){SET_PARITY_ERROR; /3產(chǎn)生奇偶檢驗錯誤標志3/SSR0&=0x03;}/3奇偶檢驗錯誤標志位清零3/elseif(SSR0_OVE==1){SET_OVERRUN_ERROR; /3產(chǎn)生溢出位錯誤標志3/SSR0&=0x03;}/3溢出錯誤標志位清零3/elseif(SSR0_FER==1){SET_FRAMING_ERROR; /3產(chǎn)生數(shù)據(jù)幀位出錯標志3/SSR0&=0x03;00方式0同步移位寄存器foso/1201方式110位異步收發(fā)由定時器控制10方式211位異步收發(fā)foso/32或foso/6411方式311位異步收發(fā)由定時器控制
SM0SM1相應(yīng)工作方式說明所用波特率
}/3繼續(xù)接收數(shù)據(jù)}/3數(shù)據(jù)幀標志位清零3/
else
if((SSR0_RDRF==1)&&(!IS_RCVEND))
/3開始接收數(shù)據(jù)3/
{
temp=RDR0;
if((++uart.rbuf_len>40)||(temp==0x0A))
/3數(shù)據(jù)接收完畢3/
{
uart.rbuf_len--;
SET_RCVEND;
}
else
}
else
if(SSR0_TDRE==1)/3發(fā)送數(shù)據(jù)3/if((3uart.tbuf_index==’\0’)||((uart.tbuf_index-uart.tbuffer)>49)){SMC20_TXE=0;/3發(fā)送結(jié)束3/SET_SEDEND;}else{TDR0=3uart.tbuf_index;uart.tbuf_index++;}/3繼續(xù)發(fā)送數(shù)據(jù)3/}
上位機串行通信程序設(shè)計
利用MSComm控件進行上位機串口編程。
串行通信控件MSComm32.OCX是Windows下串行通信編程的32位ActiveX控件。事件驅(qū)動法是MSComm處理通信問題的一種方法。OnComm事件還可以檢查和處理通信錯誤。每當(dāng)有新的字符到達,或端口狀態(tài)改變或發(fā)生錯誤時,MSComm控件觸發(fā)OnComm事件,從而獲取并處理這些通信事件。同時CPU無需不斷測試串口,這種方式的優(yōu)點是程序響應(yīng)及時,可靠性高。
1)初始化并打開串口。對串口的初始化主要包括以下幾個屬性的設(shè)置:通過CommPort屬性設(shè)置通信端口號;通過HandShaking屬性設(shè)置通信協(xié)議;通過Setings屬性設(shè)置傳輸速率等參數(shù);再根據(jù)具體需要設(shè)置其他一些相關(guān)屬性。在初始化完串口后通過將PortOpen屬性設(shè)為True即打開了串口。
2)捕捉串口事件。采取比較廣泛使用的事件驅(qū)動的方式,在OnComm事件里捕捉通信事件并進行相應(yīng)的處理。3)串口數(shù)據(jù)的讀寫。串口的讀寫主要通過In2{put和Output屬性。從串口讀入的數(shù)據(jù)在Input里,3uart.rbuf_index=temp;直接調(diào)用即可讀取,而把要發(fā)送的數(shù)據(jù)賦值給Out2uart.rbuf_index++;3/put即可。注意這里的數(shù)據(jù)分兩種情況,字符串和二進制。
[page]4)串口的關(guān)閉。將PortOpen屬性設(shè)置為False即可關(guān)閉串口??丶闹饕獙傩栽O(shè)置如下:m_MSComm.SetCommPort(1);//選擇COM1m_MSComm.SetInBufferSize(1024);//接收緩沖區(qū)m_MSComm.SetOutBufferSize(1024);//發(fā)送緩沖區(qū)m_MSComm.SetInputLen(0);//設(shè)置當(dāng)前接收區(qū)的數(shù)據(jù)長度,為0表示全部讀取m_MSComm.SetInputMode(1);//以二進制方式讀寫數(shù)據(jù)m_MSComm.SetRThoushold(1);//接收緩沖區(qū)有一個及一個以上字符時,將引發(fā)OnComm事件m_MSComm.SetSettings(“9600,n,8,1”);//波特率9600,無奇偶校驗,8個數(shù)據(jù)位,1個停止位
voidCCommTestDlg::OnSend()
{
if(!m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE);//打開串口
UpdateData(TRUE);
m_Comm.SetOutput(COleVariant(m_SendDa2
ta));
//發(fā)送數(shù)據(jù)}voidCCommTestDlg::OnClear()
{m_ReceiveData.Empty();//清除接收對話框中的數(shù)據(jù)m_SendData.Empty();//清除發(fā)送對話框中的數(shù)據(jù)
UpdateData(FALSE);
}voidCCommTextDlg::OnComm(){
VARIANTm_Input1;COleSafeArraym_Input2;longlength,i;BYTEdata[1024];CStringstr;if(m_Comm.GetCommEvent()==2)
length=m_Input2.GetOneDimSize();
//確定數(shù)據(jù)長度
for(i=0;i
{
m_Input2.GetElement(&i,data+i);//將數(shù)據(jù)轉(zhuǎn)換為BYTE型數(shù)組
}
for(i=0;i
//將數(shù)組轉(zhuǎn)換為CString型變量
{
BYTEa=3(char3)(data+i);
str.Format("%c",a);
}
}
UpdateData(FALSE);//更新編輯框內(nèi)容
}
m//讀取緩沖區(qū)內(nèi)的數(shù)據(jù)_Input1=m_Comm.GetInput();
//接收緩沖區(qū)有字符m_Input2=m_Input1;//將Variant型變量轉(zhuǎn)換為COleSafeArray變量信。
{
3結(jié)論
該文以稱重儀表與計算機進行數(shù)據(jù)通信為例,著重介紹了單片機與計算機之間的串行通信和RS232串行通信總線標準,利用VisualC++的MSComm控件實現(xiàn)了雙方的串行通信。
本文源于網(wǎng)絡(luò)轉(zhuǎn)載,如有侵權(quán),請聯(lián)系刪除
深圳市卓禾儀器有限公司是一家專門從事稱重儀表和全自動包裝碼垛生產(chǎn)線的研發(fā)及生產(chǎn)的高新技術(shù)企業(yè),所生產(chǎn)的JY500系列稱重顯示控制器(包括配料秤儀表、皮帶秤儀表、包裝秤儀表、重量變送器等)高速高精度,使用壽命長。卓禾儀器有十?dāng)?shù)年的現(xiàn)場校驗經(jīng)驗,在業(yè)內(nèi)有良好的口碑,且有專門的售后工程師幫忙解決產(chǎn)品使用過程中遇到的技術(shù)問題,客戶可以放心省心順心的使用我司的產(chǎn)品。如果對我司的產(chǎn)品感興趣,歡迎咨詢。