PC和单片机通信(一)---使用SerialPort控件

PC和单片机通信(一)---使用SerialPort控件


单个单片机与PC串口通信:
PC通过串行口将数字(00,01,02,03...,FF,十六进制)发送给单片机,单片机收到后回传这个数字,PC接收到回传数据后显示出来,若发送的数据和接收到的数据相等,则串行通信正确,否则有错误。启始符是数字00,结束符是数字FF。

1、C#界面与代码设计

(1)新建一个C#窗体应用程序,在界面上添加2个GroupBox控件,1个SerialPort控件,2个TextBox控件和2个label,发送和关闭按钮。

PC和单片机通信(一)---使用SerialPort控件_第1张图片

(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

PC和单片机通信(一)---使用SerialPort控件_第2张图片

PC和单片机通信(一)---使用SerialPort控件_第3张图片

你可能感兴趣的:(C#上位机)