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,發送和關閉按鈕。


(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



發佈了296 篇原創文章 · 獲贊 188 · 訪問量 87萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章