C# 编写串口程序
来源:互联网 发布:孔明棋算法 编辑:程序博客网 时间:2024/05/22 10:42
最近参考百度《C#编写串口程序》的pdf做了一个串口调试工具,以此为模版用于开发更复杂的上位机软件,PDF中叙述很完整。需要了解编写过程的请认真看资料。
下面阐述一下几点:
(1)需要调用serialPort类 https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(v=vs.110).aspx
示例代码:
public static void Main(){ string name; string message; StringComparer stringComparer = StringComparer.OrdinalIgnoreCase; Thread readThread = new Thread(Read); // Create a new SerialPort object with default settings. _serialPort = new SerialPort(); // Allow the user to set the appropriate properties. _serialPort.PortName = SetPortName(_serialPort.PortName); _serialPort.BaudRate = SetPortBaudRate(_serialPort.BaudRate); _serialPort.Parity = SetPortParity(_serialPort.Parity); _serialPort.DataBits = SetPortDataBits(_serialPort.DataBits); _serialPort.StopBits = SetPortStopBits(_serialPort.StopBits); _serialPort.Handshake = SetPortHandshake(_serialPort.Handshake); // Set the read/write timeouts _serialPort.ReadTimeout = 500; _serialPort.WriteTimeout = 500; _serialPort.Open(); _continue = true; readThread.Start(); Console.Write("Name: "); name = Console.ReadLine(); Console.WriteLine("Type QUIT to exit"); while (_continue) { message = Console.ReadLine(); if (stringComparer.Equals("quit", message)) { _continue = false; } else { _serialPort.WriteLine( String.Format("<{0}>: {1}", name, message)); } } readThread.Join(); _serialPort.Close();}public static void Read(){ while (_continue) { try { string message = _serialPort.ReadLine(); Console.WriteLine(message); } catch (TimeoutException) { } }}(2)serialDataReceivedEventHandler委托:https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport.datareceived(v=vs.110).aspx#示例
用来处理接受的数据。
using System;using System.IO.Ports;class PortDataReceived{ public static void Main() { SerialPort mySerialPort = new SerialPort("COM1"); mySerialPort.BaudRate = 9600; mySerialPort.Parity = Parity.None; mySerialPort.StopBits = StopBits.One; mySerialPort.DataBits = 8; mySerialPort.Handshake = Handshake.None; mySerialPort.RtsEnable = true; mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); mySerialPort.Open(); Console.WriteLine("Press any key to continue..."); Console.WriteLine(); Console.ReadKey(); mySerialPort.Close(); } private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); Console.WriteLine("Data Received:"); Console.Write(indata); }}
(3)try catch
try-catch 语句由一个 try 块后跟一个或多个 catch 子句构成,这些子句指定不同的异常处理程序。
下面是项目的完整代码:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.IO.Ports;namespace 串口配置工具{ public partial class FormMain : Form { SerialPort sp = null;//声明串口类 bool isOpen = false;//打开串口标志位 bool isSetProperty = false;//属性设置标志位 bool isHex = false;//十六进制显示标志位 public FormMain() { InitializeComponent(); } //初始化配置 private void FormMain_Load(object sender, EventArgs e) { this.MaximumSize = this.Size; this.MinimumSize = this.Size; this.MaximizeBox = false;//禁止用最大化 int i; for (i = 0; i < 15; i++)//最大支持到串口15,根据需求添加 { cbxCOMPort.Items.Add("COM" + (i + 1).ToString()); } cbxCOMPort.SelectedIndex = 0; //列出常用的波特率 cbxBaudRate.Items.Add("1200"); cbxBaudRate.Items.Add("2400"); cbxBaudRate.Items.Add("4800"); cbxBaudRate.Items.Add("9600"); cbxBaudRate.Items.Add("19200"); cbxBaudRate.Items.Add("38400"); cbxBaudRate.Items.Add("43000"); cbxBaudRate.Items.Add("56000"); cbxBaudRate.Items.Add("57600"); cbxBaudRate.Items.Add("115200"); cbxBaudRate.SelectedIndex = 3; //列出停止位 cbxStopBits.Items.Add("0"); cbxStopBits.Items.Add("1"); cbxStopBits.Items.Add("1.5"); cbxStopBits.Items.Add("2"); cbxStopBits.SelectedIndex = 1; //列出奇偶校验位 cbxParity.Items.Add("无"); cbxParity.Items.Add("奇校验"); cbxParity.Items.Add("偶校验"); cbxParity.SelectedIndex = 0; //列出数据位 cbxDataBits.Items.Add("8"); cbxDataBits.Items.Add("7"); cbxDataBits.Items.Add("6"); cbxDataBits.Items.Add("5"); cbxDataBits.SelectedIndex = 0; //默认显示char rbnChar.Checked = true; } //串口检测 private void btnCheckCOM_Click(object sender, EventArgs e)//检测那些串口可用 { bool comExistence = false;//有可用串口标志位 cbxCOMPort.Items.Clear(); for (int i = 0; i < 15; i++) { try { SerialPort sp = new SerialPort("COM" + (i + 1).ToString()); sp.Open(); sp.Close(); cbxCOMPort.Items.Add("COM" + (i + 1).ToString()); comExistence = true; } catch (Exception) { continue; } } if (comExistence) { cbxCOMPort.SelectedIndex = 0; } else { MessageBox.Show("没有找到串口!", "错误提示"); } } /////////私有函数 /* 检测串口是否设置 */ private bool CheckPortSetting() { if (cbxCOMPort.Text.Trim() == "") return false; if (cbxBaudRate.Text.Trim() == "") return false; if (cbxDataBits.Text.Trim() == "") return false; if (cbxParity.Text.Trim() == "") return false; if (cbxStopBits.Text.Trim() == "") return false; return true; } /////////私有函数 /* 检测发送数据 */ private bool CheckSendData() { if (cbxCOMPort.Text.Trim() == "") return false; return true; } /////////私有函数 /* 设置串口的属性 */ 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.5) { sp.StopBits = StopBits.OnePointFive; } else if (f == 1) { sp.StopBits = StopBits.One; } 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 == "无") { sp.Parity = Parity.None; } else if (s == "奇校验") { sp.Parity = Parity.Odd; } else if (s == "偶校验") { sp.Parity = Parity.Even; } else { sp.Parity = Parity.None; } sp.ReadTimeout = -1;//设置超时读取函数 sp.RtsEnable = true; //定义 DataReceive 事件 sp.ReceivedBytesThreshold = 1; sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);//该方法加载就运行, if (rbnHex.Checked) { isHex = true; } else { isHex = false; } } private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { System.Threading.Thread.Sleep(100);//延时100ms等待数据接收 this.Invoke((EventHandler)(delegate { if (isHex == false) { tbxRecvData.Text += sp.ReadLine(); } else { Byte[] ReceivedData = new Byte[sp.BytesToRead];//创建接受的数组 sp.Read(ReceivedData, 0, ReceivedData.Length); String RecvDataText = null; for (int i = 0; i < ReceivedData.Length - 1; i++) { RecvDataText += ("0x" + ReceivedData[i].ToString("X2") + " "); } tbxRecvData.Text += RecvDataText; } sp.DiscardInBuffer(); })); } //打开串口 private void btnOpenCOM_Click(object sender, EventArgs e) { if (isOpen == false) { if (!CheckPortSetting()) { MessageBox.Show("串口未设置!", "错误提示"); return; } if (!isSetProperty) { SetPortProperty(); isSetProperty = true; } try { sp.Open(); isOpen = true; btnCheckCOM.Text = "关闭串口"; cbxCOMPort.Enabled = false; cbxBaudRate.Enabled = false; cbxDataBits.Enabled = false; cbxParity.Enabled = false; cbxStopBits.Enabled = false; rbnChar.Enabled = false; rbnHex.Enabled = false; } catch (Exception) { isSetProperty = false; isOpen = false; MessageBox.Show("串口无效或已被占用!", "错误提示"); } } else { try { sp.Close(); isOpen = false; isSetProperty = false; btnCheckCOM.Text = "打开串口"; cbxCOMPort.Enabled = true; cbxBaudRate.Enabled = true; cbxDataBits.Enabled = true; cbxParity.Enabled = true; cbxStopBits.Enabled = true; rbnChar.Enabled = true; rbnHex.Enabled = true; } catch (Exception) { MessageBox.Show("关闭时发生错误!", "错误提示"); } } } //发送数据 private void btnSend_Click(object sender, EventArgs e) { if (isOpen) { try { sp.WriteLine(tbxSendData.Text); //MessageBox.Show("发送完成!", "错误提示"); } catch (Exception) { MessageBox.Show("发送数据时发送错误!", "错误提示"); return; } } else { MessageBox.Show("串口尚未打开!", "错误提示"); return; } if (!CheckSendData()) { MessageBox.Show("请输入要发送的数据!", "错误提示"); return; } } //清楚缓冲区 private void btnCleanData_Click(object sender, EventArgs e) { tbxRecvData.Text = ""; tbxSendData.Text = ""; } }}
源代码下载链接:
链接:http://pan.baidu.com/s/1o8iM0qQ 密码:tbii
阅读全文
0 0
- C# 编写串口程序
- C#编写串口程序(详细教程)
- 【转】使用Visual C# 2010编写串口程序
- C#编写的串口类
- C#编写串口小助手
- C# 串口通信程序
- Java串口并口程序编写
- VC串口助手程序编写
- linux 下串口程序编写
- python编写的串口程序
- 使用MSComm编写串口程序
- 串口通信程序的编写
- C# 串口通信程序 串口通信中转
- C#编写跳棋程序
- C# 编写服务程序
- c#程序编写规范
- C# WPF 串口发送程序
- c#串口自动扫描程序
- FPGA 中 IO 口时序分析(Input Delay /output Delay)
- 类的关系
- 22. Generate Parentheses
- java基础1:继承
- miscdevice结构体
- C# 编写串口程序
- nvme_data_struct 分析
- leetcode
- 3.3用变动数据做模拟
- 数据库错题库
- 从TimeQuest角度看set_max_delay
- HTML&CSS实验(4)
- JSONObject.fromObject--JSON与对象的转换
- Oracle 11g RAC 补丁升级时报ORA-01565: error in identifying spfileprod.ora 错误处理