基本信息
源码名称:C#控制器件(串口)实例源码
源码大小:0.23M
文件格式:.zip
开发语言:C#
更新时间:2019-01-25
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 2 元×
微信扫码支付:2 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
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;
using System.IO.Ports;
namespace 串口控制
{
public partial class Form1 : Form
{
int count;//用于定时器计数
int time;//存储设定的定时值
//device 1
const byte DeviceOpen1 = 0x01;
const byte DeviceClose1 = 0x81;
//device 2
const byte DeviceOpen2 = 0x02;
const byte DeviceClose2 = 0x82;
//device 3
const byte DeviceOpen3 = 0x03;
const byte DeviceClose3 = 0x83;
//device 4
const byte DeviceOpen4 = 0x04;
const byte DeviceClose4 = 0x84;
//SerialPort Write Buffer
bool Button1Statue;
byte[] SerialPortDataBuffer = new byte[1];
public Form1()
{
InitializeComponent(); //窗口构造
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
}
private void button1_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen) //串口打开就关闭
{
try
{
serialPort1.Close();
}
catch { } //确保万无一失
//button1.Text = "打开串口";
button1.BackgroundImage = Properties.Resources.Image2; //灭
Button1Statue = false; //按钮状态
}
else
{
try
{
serialPort1.PortName = comboBox1.Text; //端口号
serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);//十进制数据转换
serialPort1.Open(); //打开端口
//button1.Text = "关闭串口";
button1.BackgroundImage = Properties.Resources.Image1;//亮
Button1Statue = true; //按钮状态
}
catch
{
MessageBox.Show("串口打开失败","错误");
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
SearchAndAddSerialToComboBox(serialPort1, comboBox1);
serialPort1.DataReceived = new SerialDataReceivedEventHandler(port_DataReceived);//必须手动添加事件处理程序
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件
{
if (!radioButton3.Checked)//如果接收模式为字符模式
{
string str = serialPort1.ReadExisting();//字符串方式读
textBox3.AppendText(str);//添加内容
}
else
{ //如果接收模式为数值接收
byte data;
data = (byte)serialPort1.ReadByte();//此处需要强制类型转换,将(int)类型数据转换为(byte类型数据,不必考虑是否会丢失数据
string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串
textBox3.AppendText("0x" (str.Length == 1 ? "0" str : str) " ");//空位补“0”
//上一句等同为:if(str.Length == 1)
// str = "0" str;
// else
// str = str;
// textBox3.AppendText("0x" str);
}
}
private void WriteByteToSerialPort(byte data) //单字节写入串口
{
byte[] Buffer = new byte [2]{0x00, data }; //定义数组
if (serialPort1.IsOpen) //传输数据的前提是端口已打开
{
try
{
serialPort1.Write(Buffer, 0, 2); //写数据
}
catch
{
MessageBox.Show("串口数据发送出错,请检查.","错误");//错误处理
}
}
}
private void SearchAndAddSerialToComboBox(SerialPort MyPort,ComboBox MyBox)
{ //将可用端口号添加到ComboBox
string[] MyString = new string[20]; //最多容纳20个,太多会影响调试效率
string Buffer; //缓存
MyBox.Items.Clear(); //清空ComboBox内容
for (int i = 1; i < 20; i ) //循环
{
try //核心原理是依靠try和catch完成遍历
{
Buffer = "COM" i.ToString();
MyPort.PortName = Buffer;
MyPort.Open(); //如果失败,后面的代码不会执行
MyString[i - 1] = Buffer;
MyBox.Items.Add(Buffer); //打开成功,添加至下俩列表
MyPort.Close(); //关闭
}
catch
{
}
}
MyBox.Text = MyString[0]; //初始化
}
private void button2_Click(object sender, EventArgs e)
{
int i = 0;
try
{
i = Convert.ToInt32(textBox1.Text.Substring(0, 2)); //先处理两位数,如果出错就处理一位数
}
catch
{
try
{
i = Convert.ToInt32(textBox1.Text.Substring(0, 1));//处理一位数
}
catch
{
MessageBox.Show("请输入正确的数字"); //错误提示
return; //退出函数
}
}
if (serialPort1.IsOpen) //避免定时器浪费时间和用户等待
{
if (i == 0) //如果是0的话程序认为是定时模式关
{
//MessageBox.Show("请输入大于0的数字","提示");//WriteByteToSerialPort(DeviceOpen1);
return;
}
else
{
progressBar1.Value =0;
WriteByteToSerialPort(DeviceOpen1);
//timer1.Interval = i * 1000; //可以这样写,不需要计数器
time = i;//得到设定定时值(整形)
progressBar1.Maximum = time;//进度条最大数值
timer1.Start(); //开定时器
button2.Enabled = false; //开按钮不能按了…
}
}
}
private void button1_MouseHover(object sender, EventArgs e)
{
button1.BackgroundImage = Properties.Resources.Image3;//鼠标指上去则使用Image3
}
private void button1_MouseLeave(object sender, EventArgs e)
{
if (Button1Statue) //鼠标移开,返回原来状态
{
button1.BackgroundImage = Properties.Resources.Image1;
}
else
{
button1.BackgroundImage = Properties.Resources.Image2;
}
}
private void button3_Click(object sender, EventArgs e)
{
try
{
timer1.Stop(); //如果定时器没开,则错误处理
}
catch
{
}
button2.Enabled = true;
progressBar1.Value = 0;
WriteByteToSerialPort(DeviceClose1); //器件一关
count = 0;
}
private void button5_Click(object sender, EventArgs e)
{
WriteByteToSerialPort(DeviceOpen2); //器件二开
}
private void button4_Click(object sender, EventArgs e)
{
WriteByteToSerialPort(DeviceClose2); //器件二关
}
private void button7_Click(object sender, EventArgs e)
{
WriteByteToSerialPort(DeviceOpen3); //器件三开
}
private void button6_Click(object sender, EventArgs e)
{
WriteByteToSerialPort(DeviceClose3); //器件三关
}
private void button8_Click(object sender, EventArgs e)
{
SearchAndAddSerialToComboBox(serialPort1, comboBox1); //扫描并讲课用串口添加至下拉列表
}
private void timer1_Tick(object sender, EventArgs e)
{
count ;//记当前秒
progressBar1.Value = count;//设置进度条进度
if (count == time)
{
button2.Enabled = true; //开按钮可以按
timer1.Stop();//时间到,停止计时
WriteByteToSerialPort(DeviceClose1); //器件一关
count = 0;
}
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void label3_Click(object sender, EventArgs e)
{
}
private void button11_Click(object sender, EventArgs e)
{
byte[] Data = new byte[1];
if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
{
if (textBox2.Text != "")
{
if (!radioButton1.Checked)//如果发送模式是字符模式
{
try
{
serialPort1.WriteLine(textBox2.Text);//写数据
}
catch (Exception err)
{
MessageBox.Show("串口数据写入错误", "错误");//出错提示
serialPort1.Close();
}
}
else
{
for (int i = 0; i < (textBox2.Text.Length - textBox2.Text.Length % 2) / 2; i )//取余3运算作用是防止用户输入的字符为奇数个
{
Data[0] = Convert.ToByte(textBox2.Text.Substring(i * 2, 2), 16);
serialPort1.Write(Data, 0, 1);//循环发送(如果输入字符为0A0BB,则只发送0A,0B)
}
if (textBox2.Text.Length % 2 != 0)//剩下一位单独处理
{
Data[0] = Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length - 1, 1), 16);//单独发送B(0B)
serialPort1.Write(Data, 0, 1);//发送
}
}
}
}
}
private void label6_Click(object sender, EventArgs e)
{
}
private void button10_Click(object sender, EventArgs e)
{
WriteByteToSerialPort(DeviceOpen4);
}
private void button9_Click(object sender, EventArgs e)
{
WriteByteToSerialPort(DeviceClose4);
}
private void textBox3_TextChanged(object sender, EventArgs e)
{
}
private void progressBar1_Click(object sender, EventArgs e)
{
}
}
}