摘 要:提出基于AVR單片機的下位機數據采集系統與Delphi環境下PC機的串行通訊的軟硬件實現方法。簡要介紹系統的工作流程和通訊控制原理,詳細介紹單片機與PC機通訊的硬件控制電路、通訊協議以及上下位機軟件實現過程,重點介紹Delphi語言中SPComm控件的使用方法。采用軟硬件相結合的方法進行仿真和調試,成功實現了功能要求。實際應用表明,這種通訊方案穩定可靠且控制簡單,具有很強的工程實用性和廣泛的應用前景。
關鍵詞:AVR單片機;RS 232;串行通訊;Delphi;SPComm
中圖分類號:TP336 文獻標識碼:B 文章編號:1004-373X(2008)02-123-03
Serial Communication between PC and AVR Single Chip under Environment of Delphi
LIAO Ping,CHEN Feng,MA Hongqiu
(College of Mechanical and Electronic Engineering,Central South University,Changsha,410083,China)
Abstract:This paper introduces the hardware and software actualization method of serial communication between computer under environment of Delphi and the data collecting system based on AVR single chip processor.Simply introduces the workflow of the system and the control principle of communication.Detailedly introduces the hardware circuit chart,communication agreement and actualization method of software of serial communication between computer and single chip.It specially places emphasis on the Operation of SPComm component in the programme language of Delphi,adoptes combining software and hardware to carry out emulation and debugging and succeeded to realize the required function.Physically application indicates that this proposal of communication got powerful stability and credibility and simple control,possess of strong engineering practicability and extensive market foreground.
Keywords:AVR single chip;RS 232;serial communication;Delphi;SPComm
1 引 言
隨著現代計算機技術和電子技術的發展,采用價格低廉、現場控制能力強的單片機作為下位機直接對控制對象進行驅動控制和實時數據的采集、處理,并通過串口與上位PC機進行串行通訊,在現代工業測控領域中得到了廣泛的應用。近些年,在監測與控制軟件系統的開發設計中,由于Delphi具有可視化開發環境,強大的數據庫開發功能,包含功能豐富的VCL庫,而且封裝了大量的Windows API函數等特點,使得Delphi在處理大量數據和實現PC機與單片機的串行通訊等方面應用十分方便。
本文即介紹了X射線板材測厚系統中上下位機的串行通訊。下位機采用AVR單片機ATmega16進行數據采集,前置電路對3路檢測信號進行光電轉換和放大處理后送入到ATmega16單片機自帶的10位A/D轉換器中進行A/D轉換,單片機再將三路轉換值以16進制通過串行通訊發往PC機;上位機中采用Delphi編寫軟件,利用Delphi的強大數據庫功能管理下位機發送的數據,供圖表顯示和產量、成品計算等;并在Delphi中利用SPComm控件實現與下位機的串行通訊。
2 硬件電路圖
串口是微機上的標準設備,在進行串行通訊時不需要給微機增加額外的硬件,電路簡單且技術可靠。在PC機與單片機構成的上下位機系統中,若采用軟件實現握手協議,則利用基本3線制(TXD,RXD,GND)的連接即可實現單片機與PC機的通訊,硬件電路如圖1所示。由于AVR單片機信號電平(TTL電平)與PC機配置的串行接口電平(RS 232電平)兩者電氣規范不一致,故采用MAX 232電平轉換芯片進行電平轉換。
3 下位機軟件設計
AVR單片機ATmega16的USART是一個高度靈活的串行通訊設備,能進行全雙工操作,可工作在異步方式或同步方式下,并具有多處理器通訊模式、倍速異步通訊模式等增強型通信功能。下位機的軟件設計主要是通訊協議的設定和相關程序的設計。
(1) 通訊協議
給上下位機設置適當的通訊協議是保證上下位機能正常通訊的基礎。系統采用全雙工異步通訊模式,通訊協議設置如下:
波特率 采用9 600幀格式,數據格式采用8位數據位,1位起始位,1位停止位。為使通訊更可靠,使能了奇偶校驗功能,采用奇校驗。但如果上位機檢測出所接收的數據錯誤,則丟棄不用,不再給下位機發信號請求重新發送數據,以保證單片機穩定的采樣頻率。
握手協議 采用軟件實現上下位機的握手,下位機要往上位機發送數據時,先發送一個握手信號:aa;上位機收到后回發一個信號:bb,表示已經做好數據接收準備。
(2) 程序設計
下位機通訊的程序采用C語言編寫,主要任務是完成USART的初始化、采集數據的A/D轉換、握手的實現和數據的發送。這里主要介紹串口的初始化程序以及通訊程序的流程圖。
串口的初始化程序:主要設置相關的通信協議。
void usart-init(void)[JY]//USART 初始化
{
UCSRB = 0x00;[JY]//初始化時先關閉USART
UCSRC = (1< UBRRL = 0x33; UBRRH = 0x00;[JY]//波特率設為9600 UCSRA = 0x00;[JY]//單機通訊 UCSRB = < } 通訊流程簡介:在完成相關的初始化工作后,啟動A/D轉換,當3路信號都轉換完成后單片機往上位機發握手信號,等待上位機的應答。串口發送采用查詢方式,即CPU不停地查詢數據寄存器是否為空,若為空則裝載新的數據開始發送;而接收則采用中斷方式,在數據接收結束后進入中斷服務程序,為使程序盡量少地在中斷中停留,中斷服務程序中僅完成對握手信號的判別和發送標志的置位。當握手成功后,單片機把轉換的數據往上位機發送,數據全部發送完成后即進入下一輪的采樣、轉換和發送。串行通訊流程如圖2所示: 圖2 串行通訊流程圖 4 上位機軟件設計 Delphi是一種采用事件驅動方式、面向對象的可視化高級編程語言,本系統的通訊軟件設計采用Delphi 7.0。在Delphi可以利用的眾多串行通信控件中,SPComm控件是最簡單,功能比較強大的一種。該控件具有豐富的與串口通信密切相關的屬性及事件,提供對串口的各種操作。 4.1 SPComm的主要屬性、方法和事件 (1) 屬性 Commonage:串口名,填寫COM1,COM2等串口的名字,字符型變量; Baud Rate:設定波特率。如9 600,19 200等,在串口打開后也可更改波特率; ParityCheck:是否使能奇偶校驗; ByteSize:字節長度。根據實際情況可設定為5,6,7或8位; Parity:奇偶校驗位; StopBits:停止位的位數; SendDataEmpty:這是一個布爾屬性,為True時表示發送緩存為空,或者發送隊列里沒有信息;為False時表示發送緩存不為空,或者發送隊列里有信息。 (2) 方法 Startcomm:用于打開串口,若打開失敗通常會報錯; StopComm:用于關閉串口,沒有返回值。 (3) 函數 WriteCommData(pDataToWrite:PChar;dwSizeofDataToWrite:Word):boolean:用于發送一個字符串到寫線程,發送成功返回True,失敗則返回False,執行此函數將立即得到返回值,發送操作隨后執行。函數有2個參數,其中pDataToWrite是需要發送的字符串,dwSizeofDataToWrite是發送的字符串的長度。 (4) 事件 OnReceiveData:procedure(Sender:TObject;Buffer:Pointer;Bufferlength:Word)of object:當輸入緩存有數據時觸發該事件,在這里可以對從串口收到的數據進行處理。Buffer中是收到的數據,Bufferlength是收到的數據長度。 OnReceiveError:procedure(Sender:TObject;EventMask:DW()RD):當接收數據時出現錯誤將觸發該事件。 4.2 程序關鍵部分的實現 Delphi中用于串口通訊的程序較少,集中在簡單的串口打開和關閉、握手信號的測試和下位機采集數據的接收這幾大板塊,以下僅做簡單介紹。 (1) 打開串口并初始化 procedure TForm1.Opencomm(Sender:TObject); begin Comm1.CommName:=comm;[JY]//選擇串口 Comm1.BaudRage:=9600;[JY]//設定波特率為9 600 Comm1.Parity:=odd;[JY]//奇校驗 Comm1.StopBits:=-1;[JY]//1位停止位 Comm1.ByteSize:=-8;[JY]//8位數據位 Comm1.StartComm;[JY]//打開串口 end; (2) 測試握手信號 procedure TForm1.ButtonlClick(Sender:TObject); var i:byte; commflg:boolean;[JY]//變量定義 begin sbuf[1]:=byte(aa); commflg:=true;[JY]//若信號正確標志設定true if not TForm1.comm1.writecommdata(@sbuf[1],1) then begin commflg:=1;[JY]//若接收的握手信號錯誤,標志設為1 end; end; (3) 數據接收事件 procedure TForm1.CommlReceiveData(Sender:TObject;Buffer:Pointer;BufferLength:Word); var i,j:integer; commRevstr:shortstring; RevP:RecData[1..1024] of byte;[JY]//變量定義 begin SetLength(CommRevStr,BufferLength);[JY]//設置字符串長度與緩沖區大小相等; move(buffer,pchar(@rbuf),bufferlength);[JY]//將緩沖區內容拷貝到字符串地址上; for i:=1 to bufferlength do begin viewstring:=viewstring+inttohex(rbuf[i],2)+””;[JY]//接收到的數據在窗體中顯示 RecData[i]:=integer(S[i]);[JY]//存儲接收到的數據 ……[JY]//限于篇幅和論述目的,接收到的數據的后續處理程序在此省略 end; end; (4) 關閉串口 procedure TForm1.Button3Click(Sender:TObject); begin Comm1.StopComm;[JY]//關閉Comml end; 5 結 語 本文對實現上位機與單片機之間串行通信的方法進行了詳細的討論。通訊程序編程容易實現,在實際X射線實時板材測厚系統應用中,這種串口通信方法表現出了很強的工程實用性,通訊穩定可靠且成本低廉。同時由于上下位機軟件都是用高級語言編寫,稍加修改便可方便地移植到其他相類似的工程系統中,故在測控工程領域有著廣泛的應用前景。 參 考 文 獻 [1]黃軍,熊勇.Delphi串口通信編程[M].北京:人民郵電出版社,2002. [2]范逸之,陳立元.Delphi與RS 232串行通信控制[M].北京:清華大學出版社,2004. [3]孫濱,宋健.用Delphi實現上位機與PIC單片機的串行通訊[J].現代電子技術,2004,27(16):92-93. [4]桑開勇,陳鐵軍.Delphi環境下利用SPComm控件進行單片機串口通信[J].現代電子技術,2006,24(15):26-28. [5]徐新華,任曉,呂濤.基于Delphi的PC機與PIC單片機的串行通信[J].電子工程師,2006(3):58-59. [6]倪倩,程勇,高繪玲.Delphi環境下油泵測控系統PC機與單片機通訊的實現[J].福建電腦,2005(12):120-121. [7]丁易新.PC機與AVR單片機之間串行通信的實現[J].現代電子技術,2005,28(12):32-34. 注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。