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