PC和單片機通信(一)---使用SerialPort控件
單個單片機與PC串口通信:
PC通過串行口將數字(00,01,02,03...,FF,十六進制)發送給單片機,單片機收到後回傳這個數字,PC接收到回傳數據後顯示出來,若發送的數據和接收到的數據相等,則串行通信正確,否則有錯誤。啓始符是數字00,結束符是數字FF。
1、C#界面與代碼設計
(1)新建一個C#窗體應用程序,在界面上添加2個GroupBox控件,1個SerialPort控件,2個TextBox控件和2個label,發送和關閉按鈕。
(2)爲窗體添加Load事件
private void Form1_Load(object sender, EventArgs e) //串口初始化 { serialPort1.PortName = "COM1"; //通信端口 serialPort1.BaudRate = 9600; //設置波特率 serialPort1.Open();//打開串口 }
(3)爲發送按鈕添加Click事件
private void button1_Click(object sender, EventArgs e) //發送數據 { dataout = textBox1.Text; serialPort1.Write(dataout); }
(4)爲SerialPort1添加數據接收事件
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//讀取返回數據 { datain = serialPort1.ReadExisting(); this.Invoke(new EventHandler(DisplayText)); } //定義返回數據函數 private void DisplayText(object sender, EventArgs e) { textBox2.Text = datain; if (dataout==datain) { label2.Text = "通信正常!"; } else { label2.Text = "通信不正常!"; } }
(5)爲TextBox1添加添加TextChanged和Click事件。
private void textBox1_TextChanged(object sender, EventArgs e) { textBox1.Text = textBox1.Text.ToUpper(); } private void textBox1_Click(object sender, EventArgs e) { textBox1.Text = ""; }
(6)爲關閉按鈕添加Click事件
private void button2_Click(object sender, EventArgs e)//關閉串口,退出程序 { serialPort1.Close(); Close(); }(7)爲窗體添加FormClosing事件
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (serialPort1.IsOpen) serialPort1.Close(); }
完整代碼爲:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace PC機和單片機通信 { public partial class Form1 : Form { string dataout; //發送數據變量 string datain; //返回數據變量 public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) //串口初始化 { serialPort1.PortName = "COM7"; //通信端口 serialPort1.BaudRate = 9600; //設置波特率 serialPort1.Open();//打開串口 } private void button1_Click(object sender, EventArgs e) //發送數據 { dataout = textBox1.Text; serialPort1.Write(dataout); } private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//讀取返回數據 { datain = serialPort1.ReadExisting(); this.Invoke(new EventHandler(DisplayText)); } //定義返回數據函數 private void DisplayText(object sender, EventArgs e) { textBox2.Text = datain; if (dataout==datain) { label2.Text = "通信正常!"; } else { label2.Text = "通信不正常!"; } } private void textBox1_TextChanged(object sender, EventArgs e) { textBox1.Text = textBox1.Text.ToUpper(); } private void textBox1_Click(object sender, EventArgs e) { textBox1.Text = ""; } private void button2_Click(object sender, EventArgs e)//關閉串口,退出程序 { serialPort1.Close(); Close(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (serialPort1.IsOpen) //判斷窗口是否打開,打開要先關閉 serialPort1.Close(); } } }
2、單片機程序
/*PC機通過串行口將數字(1,2,3...255)傳給單片機,單片機收到後回傳這個數字, 並存入自己內部一段連續的空間中,PC機接收到回傳數據後顯示出來,直至傳送完結束符255*/ # pragma db code # include<reg51.h> # define uchar unsigned char void rece(void); void init(void); uchar re[17];
/*主程序*/ void main(void) { uchar temp; init(); do{ while(RI==0); temp=SBUF; if(temp==0x00) {rece();} else break; }while(1); } /*串口初始化*/ void init(void) { TMOD=0x20; //定時器1--方式2 PCON=0x80; //電源控制 SCON=0x50; //方式1 TR1=1; //啓動定時 } /*接收返回數據*/ void rece(void) { char i; i=0; do{
while(RI==0); re[i]=SBUF; RI=0; SBUF=re[i]; while(TI==0); TI=0; i++; }while(re[i-1]!=255); }
3、代碼運行
可以看到這裏串口在電腦上顯示的是COM7,將程序中的串口名稱改爲COM7