PC和单片机通信(一)---使用SerialPort控件
2019-04-15 18:16发布
生成海报
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
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮