C# 串口控件使用


P26枚举 P75枚举运算 P129事件 P194窗体与控件类 P322 try-catch语句

 


简介:微软的VS提供了SerialPort控件,也就是串行端口资源。

当然也可以添加引用 using System.IO.Ports; 通过实例化SerialPort对象就可以使用其属性和方法了。 SerialPort serialPort1 = new SerialPort();

最重要的几个属性: serialPort1.Open();打开串行端口连接 serialPort1.Close();关闭串行端口连接 serialPort1.PortName 获取或设置通信端口(COM) serialPort1.BaudRate 获取或设置串行波特率

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;
  }      
}