基于C#的串口通信上位机和下位机源程序
基于单片机串口通信的上位机和下位机实践
串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial
Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
首先亮出C#的源程序吧。
主要界面:
只是作为简单的运用,可以扩展的。
源代码:
using System;
using System.Collections.Generic; using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
using System.Timers;
namespace 单片机功能控制
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort sp = new SerialPort();
private void button1_Click(object sender, EventArgs e)
{
String str1 = comboBox1.Text;//串口号
String str2 = comboBox2.Text;//波特率
String str3 = comboBox3.Text;//校验位
String str4 = comboBox5.Text;//停止位
String str5 = comboBox4.Text;//数据位
Int32 int2 = Convert.ToInt32(str2);//将字符串转为整型
Int32 int5 = Convert.ToInt32(str5);//将字符串转为整型
groupBox3.Enabled = true;//LED控制界面变可选
try
{
if (button1.Text == "打开串口")
{
if (str1 == null)
{
MessageBox.Show("请先选择串口~", "Error");
return;
}
sp.Close();
sp = new SerialPort();
sp.PortName = comboBox1.Text;//串口编号
sp.BaudRate = int2;//波特率
switch (str4)//停止位
{
case "1":
sp.StopBits = StopBits.One;
break;
case "1.5":
sp.StopBits = StopBits.OnePointFive;
break;
case "2":
sp.StopBits = StopBits.Two;
break;
default:
MessageBox.Show("Error:参数不正确", "Error");
break;
}
switch (str3)
{
case "NONE":
sp.Parity = Parity.None; break;
case "ODD":
sp.Parity = Parity.Odd; break;
case "EVEN":
sp.Parity = Parity.Even; break;
default:
MessageBox.Show("Error:参数不正确", "Error");
break;
}
sp.DataBits = int5;//数据位
sp.Parity = Parity.Even;//设置串口属性
sp.Open();//打开串口
button1.Text = "关闭串口";
textBox1.Text = Convert.ToString(sp.PortName) + "已开启~";
}
else
{
sp.Close();
button1.Text = "打开串口";
groupBox3.Enabled = false;//LED控制界面变灰色
textBox1.Text = Convert.ToString(sp.PortName) + "已关闭~";
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void Form1_Load(object sender, EventArgs e)
{
//初始化
textBox1.Text = "欢迎使用简易的串口助手~";
groupBox3.Enabled = false;//LED控制界面变灰色
groupBox6.Enabled = false;
groupBox7.Enabled = false;
groupBox8.Enabled = false;
button3.Enabled = false;
button6.Enabled = false;
timer1.Start();
try
{
foreach (string com in System.IO.Ports.SerialPort.GetPortNames()) //自动
获取串行口名称
this.comboBox1.Items.Add(com);
//默认设置
comboBox1.SelectedIndex = 0;//选择第一个com口
comboBox2.SelectedIndex = 4;//波特率4800
comboBox3.SelectedIndex = 0;//校验位NONE
comboBox4.SelectedIndex = 0;//停止位为1
comboBox5.SelectedIndex = 0;//数据位为8
}
catch
{
MessageBox.Show("找不到通讯端口~", "串口调试助手");
}
}
private void timer1_Tick(object sender, EventArgs e)
{
label6.Text = DateTime.Now.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
try {
if (button2.Text == "开启")
{
groupBox6.Enabled = true;
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
button3.Enabled = true;
textBox2.Text = String.Empty;
button2.Text = "关闭";
}
else
{
groupBox6.Enabled = false;
button3.Enabled = false;
button2.Text = "开启";
textBox2.Text = String.Empty;
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void button3_Click(object sender, EventArgs e)
{
groupBox6.Enabled = true;
label7.Text = "已发送";
if (textBox2.Text == "")
MessageBox.Show("发送失败,请选择发送的数据~");
else
sp.WriteLine(textBox2.Text);//往串口写数据
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
try {
if (checkBox1.Checked)
{
checkBox1.Checked = true;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
label7.Text = "准备发送";
textBox2.Text = "1";
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void checkBox2_CheckedChanged(object sender, EventArgs e)
{
try {
if (checkBox2.Checked)
{
checkBox1.Checked = false;
checkBox2.Checked = true;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
label7.Text = "准备发送";
textBox2.Text = "2";
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void checkBox3_CheckedChanged(object sender, EventArgs e)
{
try
{
if (checkBox3.Checked)
{
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = true;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
label7.Text = "准备发送";
textBox2.Text = "3";
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void checkBox4_CheckedChanged(object sender, EventArgs e)
{
try
{
if (checkBox4.Checked)
{
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = true;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
label7.Text = "准备发送";
textBox2.Text = "4";
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void checkBox5_CheckedChanged(object sender, EventArgs e)
{
try
{
if (checkBox5.Checked)
{
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = true;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
label7.Text = "准备发送";
textBox2.Text = "5";
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void checkBox6_CheckedChanged(object sender, EventArgs e)
{
try
{
if (checkBox6.Checked)
{
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = true;
checkBox7.Checked = false;
checkBox8.Checked = false;
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
label7.Text = "准备发送";
textBox2.Text = "6";
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void checkBox7_CheckedChanged(object sender, EventArgs e)
{
try
{
if (checkBox7.Checked)
{
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = true;
checkBox8.Checked = false;
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
label7.Text = "准备发送";
textBox2.Text = "7";
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void checkBox8_CheckedChanged(object sender, EventArgs e)
{
try
{
if (checkBox8.Checked)
{
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = true;
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
label7.Text = "准备发送";
textBox2.Text = "8";
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void button5_Click(object sender, EventArgs e)
{
try
{
if (button5.Text == "开启")
{
radioButton1.Checked = false;
radioButton2.Checked = false;
radioButton3.Checked = false;
radioButton4.Checked = false;
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
groupBox7.Enabled = true;
button6.Enabled = true;
textBox2.Text = String.Empty;
button5.Text = "关闭";
}
else
{
groupBox7.Enabled = false;
button6.Enabled = false;
button5.Text = "开启";
textBox2.Text = String.Empty;
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void button6_Click(object sender, EventArgs e)
{
label7.Text = "已发送";
if (textBox2.Text == "")
MessageBox.Show("发送失败。请选择发送的数据~");
else
sp.WriteLine(textBox2.Text);//往串口写数据
}
private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
try
{
if (radioButton1.Checked)
{
label7.Text = "准备发送";
textBox2.Text = "9";
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void radioButton2_CheckedChanged(object sender, EventArgs e)
{
try
{
if (radioButton2.Checked)
{
label7.Text = "准备发送";
textBox2.Text = "a";
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void radioButton3_CheckedChanged(object sender, EventArgs e)
{
try
{
if (radioButton3.Checked)
{
label7.Text = "准备发送";
textBox2.Text = "b";
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
private void radioButton4_CheckedChanged(object sender, EventArgs e)
{
try
{
if (radioButton4.Checked)
{
label7.Text = "准备发送";
textBox2.Text = "c";
checkBox1.Checked = false;
checkBox2.Checked = false;
checkBox3.Checked = false;
checkBox4.Checked = false;
checkBox5.Checked = false;
checkBox6.Checked = false;
checkBox7.Checked = false;
checkBox8.Checked = false;
}
}
catch (Exception er)
{
MessageBox.Show("Error:" + er.Message, "Error");
return;
}
}
}
}
下位机程序:
#include
#include
#include
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
uchar b; //用来接收数据存储
uchar j=0;
uint i=0; //用来判断相应的子程序
uchar LED1= 0xfe; //作为流水灯的开始
uchar LED2=0Xfe; //作为跑马灯的开始
uchar LED3 = 0xfE; //作为二进制加法灯的开始
uchar LED4=0XFF; //作为花样灯的开始
uchar code table[]=
{0xff,//全灭
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,//依次逐个点亮
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,//依次逐个叠加
0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,//依次逐个递减
0x7e,0xbd,0xdb,0xe7,0xe7,0xdb,0xbd,0x7e,//两边靠拢后分开
0x7e,0x3c,0x18,0x00,0x00,0x18,0x3c,0x7e,//两边叠加后递减
0x00};//全亮
void delay(void); //延时函数的声明
void liushuideng(void); //流水灯的声明
void paomadeng(void); //跑马灯的声明
void huayangdeng(void); //花样灯的声明
void erjinzhideng(void); //二进制加法灯的声明
void xianshi(uint j); //显示程序
void init(void); //初始化函数
void main (void)
{
init(); //初始化
while(1)
{
xianshi(i); //显示
}
}
void init(void) //初始化函数的定义
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无 (11.0592)
TH1 = 0xF3; //baud*2 /* 波特率4800、数据位8、停止位1。效验位无 (12M)
TL1 = 0xF3;
TR1 = 1; //开启定时器
PS=1; //把串口中断的优先级设为最高
ES = 1; //开串口中断
EA = 1; // 开总中断
// IE = 0x0;
}
void delay(void) //延时函数的定义
{
uchar i;
uchar ms=250;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void liushuideng(void) //流水灯 {
P2 = LED1;
delay();
LED1 = LED1 << 1; //循环右移1位,点亮下一个LED "<<"为左移位
if(P2 ==0X00 )
{
LED1 = 0xfe;
} // 0xfe = 1111 1110
}
void paomadeng(void) //跑马灯 {
P2 = LED2;
LED2 = _crol_(LED2,1); //循环右移1位,点亮下一个LED 此函数位库函数
delay();
}
void huayangdeng(void) //花样灯 { P2=table[j++];
delay();
if(j==42)
j=0;
}
void erjinzhideng(void) //二进制加法灯 {
P2 = LED4;
delay();
LED4--;
}
void xianshi(uint j) //调用相对应的程序 {
if(j==1)
P2=0xfe; //点亮第一个LED
if(j==2)
P2=0xfd; //点亮第二个LED
if(j==3)
P2=0xfb; //点亮第三个LED
if(j==4)
P2=0xf7; //点亮第四个LED
if(j==5)
P2=0xef; //点亮第五个LED
if(j==6)
P2=0xdf; //点亮第六个LED
if(j==7)
P2=0xbf; //点亮第七个LED
if(j==8)
P2=0x7f; //点亮第八个LED
if(j==9)
liushuideng(); //流水灯
if(j==10)
paomadeng(); //跑马灯
if(j==11)
huayangdeng(); //花样灯
if(j==12)
erjinzhideng(); //二进制加法灯 }
void com_isr(void) interrupt 4 //串口中断入口函数 {
ES=0; //再中断进行处理程序的时候关闭串口中断
b=SBUF; //将接收的数据存于变量中
switch(b) //分支语句,进行判断 {
case '1':i=1;break; //点亮第一个LED的赋值
case '2':i=2;break; //点亮第二个LED的赋值
case '3':i=3;break; //点亮第三个LED的赋值
case '4':i=4;break; //点亮第四个LED的赋值
case '5':i=5;break; //点亮第五个LED的赋值
case '6':i=6;break; //点亮第六个LED的赋值
case '7':i=7;break; //点亮第七个LED的赋值
case '8':i=8;break; //点亮第八个LED的赋值
case '9':i=9;break; //流水灯的赋值
case 'a':i=10;break; //跑马灯的赋值
case 'b':i=11;break; //花样灯的赋值
case 'c':i=12;break; //二进制加法灯的赋值
default:
break;
}
RI=0; //清除中断标志位
ES=1; //处理完中断程序再开启串口中断
}