摘要:本文主要論述PC機與單片機之間實現異步串行通訊需要解決的問題以及如何利用C#提供的串行通訊SerialPort類來實現PC機與51單片機的通訊。
關鍵詞: SerialPort;串行通訊;波特率
1 引言
PC機具有強大的監控和管理功能,而單片機則具有快速及靈活的控制特點,通過PC機的RS-232串行接口與外部設備進行通訊,是許多測控系統中常用的一種通信解決方案。
在Microsoft.Net技術廣泛應用的今天人們采用了許多方法在Visual Studio.Net中來編寫串口通訊程序:第一種方法是通過采用Visual Studio 6.0中原來的MSComm控件,這是最簡單、最方便的方法,但需要注冊;第二種方法是自己用API寫串口通信;第三種方法是采用微軟推出的最新版本Visual Studio 2005開發工具,NET Framework 2.0類庫中包含的SerialPort類,方便地實現了所需要串口通訊的多種功能。本文著重討論了Visual Studio 2005開發工具中SerialPort類的設計方法。
2 SerialPort類常用屬性、方法和事件
2.1 命名空間
System.IO.Ports命名空間包含了控制串口重要的SerialPort類,該類提供了同步I/O 和事件驅動的I/O、對管腳和中斷狀態的訪問以及對串行驅動程序屬性的訪問。
2.2 串口的通訊參數
①通訊端口號:
[PortName]屬性獲取或設置通信端口,包括但不限于所有可用的COM端口,該屬性返回類型為String。
②通訊格式:
SerialPort類分別用[BaudRate]、[Parity]、[DataBits]、[StopBits]屬性設置通訊格式中的波特率、校驗位、數據位和停止位。
2.3 串口的打開和關閉
SerialPort類中打開關閉串口相應的是調用類的Open()和Close()方法。
2.4 數據的發送和讀取
SerialPort類調用重載的Write和WriteLine方法發送數據,其中WriteLine可發送字符串并在字符串末尾加入換行符。讀取串口緩沖區的方法有許多,其中除了ReadExisting和ReadTo,其余的方法都是同步調用,線程被阻塞直到緩沖區有相應的數據或大于ReadTimeOut屬性設定的時間值后,引發ReadExisting異常。
2.5 DataReceived事件
DataReceived事件在接收到了[ReceivedBytesThreshold]設置的字符個數或接收到了文件結束字符并將其放入了輸入緩沖區時被觸發。
3 PC機與8051實現串行通訊需要解決的問題
3.1 TTL電平與RS232電平的轉換
89C51單片機采用的是TTL電平且采用正邏輯[1],而PC機采用RS232與外部設備進行通訊,RS232采用負邏輯,因此MCS51單片機串行口與PC機的RS232接口相連進行通訊時必須進行電平的轉換。通常采用MAX232電平轉換芯片。
3.2 單片機與PC機通訊時波特率的設定
PC機與51單片機雙方進行通訊時必須采用相同的波特率,PC機的波特率默認為9600b/s, 51系列單片機有兩個定時/計數器,四種工作方式,一般用定時器工作于方式2(可重新裝載的8位定時器/計數器)作為定時波特率發生器。因此單片機與PC機進行異步通訊時的波特率可由公式3.1得出:
其中SMOD是單片機電源控制寄存器(PCON)中的位7,開機(RESET)時,SMOD的設定值為0,亦可用指令“ANL PCON,#7FH”清除為0。fosc為單片機的晶振頻率。根據需要的波特率即可得計數初值TH1。
4 單片機與PC機通訊時通訊協議的約定及部分初始化程序
在單片機與PC機的通訊中,單片機一般作為下位機負責從控制對象采集數據(如壓力、流量等),上位機則進行現場可視化檢測。傳輸數據采用二進制數據,上位機與下位機之間采用主從式通訊。以下給出單片機和VC# 環境下部分的通訊程序。
4.1 串口通訊協議約定
波特率為9600b/s,無奇偶校驗位,傳輸的數據位為8位,停止位為1位,用串行口工作于方式1。單片機的晶振頻率fosc=11.059MHz,定時器T1工作于方式2作為波特率發生器,根據計數初值的計算公式(3.1)可得計數初值TH1為0FDH 。
4.2 單片機的串行通訊程序
單片機串行通訊程序,給出了初始化程序:
ORG0000H
AJMP START;轉到初始化程序
ORG0023H
AJMP PGUART ;轉到串行中斷服務子程序
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:...... ;主程序處理其他任務,等待串口中斷
AJMP MAIN
PAUSE:...... ;串口中斷服務子程序,接收處理數據
RETI
END
4.3 上位機的串行通訊程序
例:發送及接收數據的程序:
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 結束語
單片機與上位機的通訊在工業現場中應用的比較廣泛,本文對C#提供的串行通訊SerialPort類來實現PC機與51單片機的通訊進行了探討。實踐證明,這種方案是可行的,能保證雙方通訊正常。
參考文獻
[1]蔡朝洋.單片機控制實習與專題制作.北京航空航天大學出版社.
[2]張洪潤,易濤.單片機應用技術教程.清華大學出版社.