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# 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