C# 串口控件使用
简介:微软的VS提供了SerialPort控件,也就是串行端口资源。
当然也可以添加引用 using System.IO.Ports; 通过实例化SerialPort对象就可以使用其属性和方法了。 SerialPort serialPort1 = new SerialPort();
最重要的几个属性: serialPort1.Open();打开串行端口连接 serialPort1.Close();关闭串行端口连接 serialPort1.PortName 获取或设置通信端口(COM)
serialPort1.DataBits 获取或设置每个字节的标准数据位长度 serialPort1.StopBits 获取或设置每个字节的标准停止位数 serialPort1.Parity 获取或设置奇偶校验检查协议 serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 数据接收事件的方法
.close() 关闭端口连接,将isOpen属性设置为false,并释放stream对象 .open() 打开一个新的串行端口连接
.read() 从serialport输入缓存区中读取 .readbyte() 从serialport输入缓存区中读取一个字节 .readchar() 从serialport输入缓存区中读取一个字符 .readline() 一直读到输入缓存区中的newline值 .readto() 一直读到输入缓存区指定value的字符串
.write() 已重载,将数据写入串行端口输出缓冲区 .writeline() 将指定的字符串和newline值写入输出缓存区
关于串口接收事件
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 串口接收事件会自动创建线程(也就是说它已经不在主线程了)!!!
对于C#来说,默认是不能在其它线程中对非本线程创建的控件进行访问的(一般情况下控件都是主线程中的),
如果你的这个事件代码中不操作控件(比如文本框之类的),那可以不用invoke, 否则就要用委托了,不然在运行中就会报错,具体内容可以再百度一下 C# 跨线程 控件
private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{ //这个是多线程,在执行主线程的同时,另开一个线程区执行DisplayText函数。
data= serialPort1.ReadExisting();
this.Invoke(new EventHandler(DisplayText));
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string Recievestr;
?
Recievestr = serialPort1.ReadExisting();
textBox1.AppendText(Recievestr);
//this.Invoke(new EventHandler(DisplayText));
///括号内为绘制窗口的方法的委托,采用的是标准事件的委托
}
private void DisplayText(object sender, EventArgs e)
{
}
byte[] data = Encoding.Default.GetBytes(str1);
serialPort1.Write(data, 0, data.Length);
?
String str1 = comboBox1.Text;
String str2 = comboBox2.Text;
String str3 = comboBox4.Text;
String str4 = comboBox5.Text;
Int32 int2 = Convert.ToInt32(str2);
Int32 int3 = Convert.ToInt32(str3);
?
serialPort1.PortName = str1;
serialPort1.BaudRate = int2;
serialPort1.DataBits = int3;
switch (comboBox5.Text)
{
case "1":
serialPort1.StopBits = StopBits.One;
break;
case "1.5":
serialPort1.StopBits = StopBits.OnePointFive;
break;
case "2":
serialPort1.StopBits = StopBits.Two;
break;
default:
MessageBox.Show("Error:参数不正确", "Error");
break;
}
?
?
//判断文本框中是否为空,不为空则将其添加到组合框中
if (textBox1.Text != "")
{
//判断文本框中的值是否与组合框中的的值重复
if ( comboBox1.Items.Contains(textBox1.Text) )
{
MessageBox.Show("该专业已存在!");
}
else
{
comboBox1.Items.Add(textBox1.Text);
}
}
else
{
MessageBox.Show("请输入专业!", "提示");
}
//判断组合框中是否存在文本框中输入的值
if (comboBox1.Items.Contains(textBox1.Text))
{
comboBox1.Items.Remove(textBox1.Text);
}
//16进制显示接收结果
string str;
for (int i = 0; i < 256; i++)
{
str = i.ToString("x").ToUpper();
if (str.Length == 1)
{
str = "0" + str;
textBox1.Text = "0x" + str;
}
textBox1.Text = "0xff";
}
private void SetPortProperty () // 设置串口名
{
sp = new SerialPort();
sp.PortName = cbxComPort.Text.Trim(); //设置串口名
sp.BaudRate = Convert.ToInt32(cbxBaudRate.Text.Trim()); //设置串口波特率
float f = Convert.ToSingle(cbxStopBits.Text.Trim()); //设置停止位
if(f==0)
{
sp.StopBits = StopBits.None;
}
else if(f==1)
{
sp.StopBits = StopBits.One;
}
else if(f==1.5)
{
sp.StopBits = StopBits.OnePointFive;
}
else if (f == 2)
{
sp.StopBits = StopBits.Two;
}
else
{
sp.StopBits = StopBits.One;
}
sp.DataBits = Convert.ToInt16(cbxDataBits.Text.Trim()); //设置数据位
string s = cbxParity.Text.Trim(); //设置奇偶校验
if (s.CompareTo("无") == 0)
{
sp.Parity = Parity.None;
}
else if (s.CompareTo("奇校验") == 0)
{
sp.Parity = Parity.Odd;
}
else if (s.CompareTo("偶校验") == 0)
{
sp.Parity = Parity.Even;
}
else
{
sp.Parity = Parity.None;
}
sp.ReadTimeout = -1; // 设置超时读取时间
sp.RtsEnable = true;
?
// 定义Data Received 事件 , 当串口收到数据后触发事件
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
if (rbnHex.Checked)
{
isHex = true;
}
else
{
isHex = false;
}
}