摘要:本文主要論述PC機(jī)與單片機(jī)之間實現(xiàn)異步串行通訊需要解決的問題以及如何利用C#提供的串行通訊SerialPort類來實現(xiàn)PC機(jī)與51單片機(jī)的通訊。
關(guān)鍵詞: SerialPort;串行通訊;波特率
1 引言
PC機(jī)具有強(qiáng)大的監(jiān)控和管理功能,而單片機(jī)則具有快速及靈活的控制特點,通過PC機(jī)的RS-232串行接口與外部設(shè)備進(jìn)行通訊,是許多測控系統(tǒng)中常用的一種通信解決方案。
在Microsoft.Net技術(shù)廣泛應(yīng)用的今天人們采用了許多方法在Visual Studio.Net中來編寫串口通訊程序:第一種方法是通過采用Visual Studio 6.0中原來的MSComm控件,這是最簡單、最方便的方法,但需要注冊;第二種方法是自己用API寫串口通信;第三種方法是采用微軟推出的最新版本Visual Studio 2005開發(fā)工具,NET Framework 2.0類庫中包含的SerialPort類,方便地實現(xiàn)了所需要串口通訊的多種功能。本文著重討論了Visual Studio 2005開發(fā)工具中SerialPort類的設(shè)計方法。
2 SerialPort類常用屬性、方法和事件
2.1 命名空間
System.IO.Ports命名空間包含了控制串口重要的SerialPort類,該類提供了同步I/O 和事件驅(qū)動的I/O、對管腳和中斷狀態(tài)的訪問以及對串行驅(qū)動程序?qū)傩缘脑L問。
2.2 串口的通訊參數(shù)
①通訊端口號:
[PortName]屬性獲取或設(shè)置通信端口,包括但不限于所有可用的COM端口,該屬性返回類型為String。
②通訊格式:
SerialPort類分別用[BaudRate]、[Parity]、[DataBits]、[StopBits]屬性設(shè)置通訊格式中的波特率、校驗位、數(shù)據(jù)位和停止位。
2.3 串口的打開和關(guān)閉
SerialPort類中打開關(guān)閉串口相應(yīng)的是調(diào)用類的Open()和Close()方法。
2.4 數(shù)據(jù)的發(fā)送和讀取
SerialPort類調(diào)用重載的Write和WriteLine方法發(fā)送數(shù)據(jù),其中WriteLine可發(fā)送字符串并在字符串末尾加入換行符。讀取串口緩沖區(qū)的方法有許多,其中除了ReadExisting和ReadTo,其余的方法都是同步調(diào)用,線程被阻塞直到緩沖區(qū)有相應(yīng)的數(shù)據(jù)或大于ReadTimeOut屬性設(shè)定的時間值后,引發(fā)ReadExisting異常。
2.5 DataReceived事件
DataReceived事件在接收到了[ReceivedBytesThreshold]設(shè)置的字符個數(shù)或接收到了文件結(jié)束字符并將其放入了輸入緩沖區(qū)時被觸發(fā)。
3 PC機(jī)與8051實現(xiàn)串行通訊需要解決的問題
3.1 TTL電平與RS232電平的轉(zhuǎn)換
89C51單片機(jī)采用的是TTL電平且采用正邏輯[1],而PC機(jī)采用RS232與外部設(shè)備進(jìn)行通訊,RS232采用負(fù)邏輯,因此MCS51單片機(jī)串行口與PC機(jī)的RS232接口相連進(jìn)行通訊時必須進(jìn)行電平的轉(zhuǎn)換。通常采用MAX232電平轉(zhuǎn)換芯片。
3.2 單片機(jī)與PC機(jī)通訊時波特率的設(shè)定
PC機(jī)與51單片機(jī)雙方進(jìn)行通訊時必須采用相同的波特率,PC機(jī)的波特率默認(rèn)為9600b/s, 51系列單片機(jī)有兩個定時/計數(shù)器,四種工作方式,一般用定時器工作于方式2(可重新裝載的8位定時器/計數(shù)器)作為定時波特率發(fā)生器。因此單片機(jī)與PC機(jī)進(jìn)行異步通訊時的波特率可由公式3.1得出:
其中SMOD是單片機(jī)電源控制寄存器(PCON)中的位7,開機(jī)(RESET)時,SMOD的設(shè)定值為0,亦可用指令“ANL PCON,#7FH”清除為0。fosc為單片機(jī)的晶振頻率。根據(jù)需要的波特率即可得計數(shù)初值TH1。
4 單片機(jī)與PC機(jī)通訊時通訊協(xié)議的約定及部分初始化程序
在單片機(jī)與PC機(jī)的通訊中,單片機(jī)一般作為下位機(jī)負(fù)責(zé)從控制對象采集數(shù)據(jù)(如壓力、流量等),上位機(jī)則進(jìn)行現(xiàn)場可視化檢測。傳輸數(shù)據(jù)采用二進(jìn)制數(shù)據(jù),上位機(jī)與下位機(jī)之間采用主從式通訊。以下給出單片機(jī)和VC# 環(huán)境下部分的通訊程序。
4.1 串口通訊協(xié)議約定
波特率為9600b/s,無奇偶校驗位,傳輸?shù)臄?shù)據(jù)位為8位,停止位為1位,用串行口工作于方式1。單片機(jī)的晶振頻率fosc=11.059MHz,定時器T1工作于方式2作為波特率發(fā)生器,根據(jù)計數(shù)初值的計算公式(3.1)可得計數(shù)初值TH1為0FDH 。
4.2 單片機(jī)的串行通訊程序
單片機(jī)串行通訊程序,給出了初始化程序:
ORG0000H
AJMP START;轉(zhuǎn)到初始化程序
ORG0023H
AJMP PGUART ;轉(zhuǎn)到串行中斷服務(wù)子程序
START: MOVSP,#60H ;堆棧指針初始化
MOVP0,#0FFH ;端口初始化
MOVP1,#0FFH
MOVP2,#0FFH
MOVP3,#0FFH
MOVTMOD,#20H;定時器T1工作于模式2,自動重裝載
MOVTH1,#0FDH;TH1、TL1初值為\"0FDH\",9600bps
MOVTL1,#0FDH
MOVSCON,#50H;串行口工作于方式1,允許接收
SETB TR1 ;啟動定時器T1
SETB ES ;允許串行口中斷
SETB EA ;開總中斷
MAIN:...... ;主程序處理其他任務(wù),等待串口中斷
AJMP MAIN
PAUSE:...... ;串口中斷服務(wù)子程序,接收處理數(shù)據(jù)
RETI
END
4.3 上位機(jī)的串行通訊程序
例:發(fā)送及接收數(shù)據(jù)的程序:
private void button1_Click(object sender, EventArgs e)
{
string a;
SerialPort Ser1 = new SerialPort(\"com1\", 9600, Parity.None, 8, StopBits.One);
Try
{
Ser1.Open();
}
catch (InvalidOperationException ex)
{
MessageBox.Show(ex.ToString());
}
if (textBox1.Text == \"\")
{
MessageBox.Show(\"Err\");
Ser1.Close();
}
else
{
a=textBox1.Text;
try
{
//p.WriteLine(a);
p.Write(a);
}
catch(InvalidOperationException ex)
{
MessageBox.Show(ex.ToString());
}
textBox2.Text = Ser1.ReadByte().ToString();
Ser1.Close();
}
}
5 結(jié)束語
單片機(jī)與上位機(jī)的通訊在工業(yè)現(xiàn)場中應(yīng)用的比較廣泛,本文對C#提供的串行通訊SerialPort類來實現(xiàn)PC機(jī)與51單片機(jī)的通訊進(jìn)行了探討。實踐證明,這種方案是可行的,能保證雙方通訊正常。
參考文獻(xiàn)
[1]蔡朝洋.單片機(jī)控制實習(xí)與專題制作.北京航空航天大學(xué)出版社.
[2]張洪潤,易濤.單片機(jī)應(yīng)用技術(shù)教程.清華大學(xué)出版社.