C#中的串口转换器进程 [英] Serial Port Converter Process in C#
本文介绍了C#中的串口转换器进程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在研究串口转换器进程。如何将串口转换器连接到C#编码。任何人都可以给我一个解决方案。
问候
Balamurugan
解决方案
您需要创建并打开连接到机器的SerialPort实例,并从中读取数据 - 然后您可以将其转换为您的班级可以返回的权重。
查看MSDN页面:SerialPort类 [ ^ ] - 它包含一个基本的通信示例。
使用System;
使用System.Linq;
使用System.Data;
使用System.Text;
使用System.Drawing;
使用System.IO.Ports;
使用System.Windows.Forms;
使用System.ComponentModel;
使用System.Collections.Generic;
使用Converter.Properties;
使用System .Threading;
使用System.IO;
使用System.Data.OleDb;
namespace Converter
{
#region公共枚举
public enum DataMode {Text,Hex}
public enum LogMsgType {Incoming,Outgoing,Normal,Warning,Error} ;
#endregion
公共部分类SerialPort1:表格
{
#region Local Variables
private SerialPort comport = new SerialPort();
private Color [] LogMsgTypeColor = {Color.Blue,Color.Green,Color.Black,Color.Orange,Color.Red};
private bool KeyHandled = false;
private设置= Settings.Default;
OleDbCommand cmd;
OleDbConnection con ;
OleDbDataReade r博士;
#endregion
public SerialPort1()
{
InitializeComponent();
InitializeControlValues();
EnableControls();
comport.DataReceived + = new SerialDataReceivedEventHandler(port_DataReceived);
comport.PinChanged + = new SerialPinChangedEventHandler(comport_PinChanged);
InitializeControlValues();
}
void comport_PinChanged(object sender,SerialPinChangedEventArgs e)
{
//显示引脚的状态
UpdatePinState();
}
private void InitializeControlValues()
{
cmbParity.Items.Clear(); cmbParity.Items.AddRange(Enum.GetNames(typeof(Parity)));
cmbStopBits.Items.Clear(); cmbStopBits.Items.AddRange(Enum.GetNames(typeof(StopBits)));
cmbParity.Text = settings.Parity.ToString();
cmbStopBits.Text = settings .StopBits.ToString();
cmbDataBits.Text = settings.DataBits.ToString();
cmbParity.Text = settings.Parity.ToString();
cmbBaudRate.Text = settings.BaudRate.ToString();
chkClearOnOpen.Checked = settings.ClearOnOpen;
chkClearWithDTR.Checked = settings.ClearWithDTR;
//如果它仍然可用,选择最后使用的com端口
if(cmbPortName.Items.Contains(settings.PortName))cmbPortName.Text = settings.PortName;
else if(cmbPortName.Items.Count> 0)cmbPortName.SelectedIndex = cmbPortName.Items.Count - 1;
else
{
MessageBox.Show(这,没有COM端口检测特权在这台计算机上。\ n请安装COM端口并重新启动此应用。,没有安装COM端口,MessageBoxButtons.OK,MessageBoxIcon.Error);
this.Close(); < br $>
}
}
private void port_DataReceived(object sender,SerialDataReceivedEventArgs e)
{
//如果com端口已经关闭,什么都不做
如果(!comport.IsOpen)返回;
//这个当端口缓冲区中有数据等待时将调用方法
//确定用户所处的模式(字符串或二进制)
}
private void UpdatePinState()
{
this.Invoke(new ThreadStart(()=>
{
//显示引脚的状态
chkCD.Checked = comport.CDHolding;
chkCTS.Checked = comport.CtsHolding;
chkDSR.Checked = comport.DsrHolding;
}));
}
private void SaveSettings()
{
settings.BaudRate = int.Parse(cmbBaudRate.Text);
settings.DataBits = int.Parse(cmbDataBits.Text);
settings.Parity =(奇偶校验)Enum.Parse(typeof(奇偶校验),cmbParity.Text);
settings.StopBits = (StopBits)Enum.Parse(typeof(StopBits),cmbStopBits.Text);
settings.PortName = cmbPortName.Text;
settings.ClearOnOpen = chkClearOnOpen.Checked;
settings.ClearWithDTR = chkClearWithDTR.Checked;
settings.Save();
}
private void EnableControls()
{
//根据端口是否打开启用/禁用控件
gbPortSettings.Enabled =!comport.IsOpen;
txtSendData.Enabled = btnSend.Enabled = comport.IsOpen;
//chkDTR.Enabled = chkRTS.Enabled = comport.IsOpen;
if(comport.IsOpen)btnOpenPort.Text =&Close Port;
else btnOpenPort.Text =&Open Port;
}
private void gbMode_Enter(object sender,EventArgs e)
{
}
private void cmbPortName_SelectedIndexChanged(object sender,EventArgs e)
{
}
private void SendData()
{
//直接将用户的文本发送到端口
comport.Write(txtSendData.Text);
/ /在终端窗口中显示用户的文本
Log(LogMsgType.Outgoing,txtSendData.Text +\ n);
}
private void Log(LogMsgType msgtype,string msg)
{
rtfTerminal.Invoke(new EventHandler(delegate < br $>
{
rtfTerminal.SelectedText = string.Empty;
rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont,FontStyle.Bold);
rtfTerminal.SelectionColor = LogMsgTypeColor [(int)msgtype];
rtfTerminal.AppendText(msg);
rtfTerminal.ScrollToCaret();
}
)
);
}
private void chkDTR_CheckedChanged(object sender,EventArgs e)
{
comport.DtrEnable = chkDTR.Checked;
if(chkDTR.Checked && chkClearWithDTR .Checked)ClearTerminal();
}
private void ClearTermi nal()
{
rtfTerminal.Clear();
}
private void chkRTS_CheckedChanged(object sender,EventArgs e)
{
comport.RtsEnable = chkRTS.Checked;
}
private void chkCTS_CheckedChanged(object sender,EventArgs e)
{
}
private void SerialPort1_Load(object sender,EventArgs e)
{
}
private void btnOpenPort_Click_1(object sender,EventArgs e)
{
bool error = false;
//如果端口已打开,请将其关闭。
if(comport.IsOpen)comport.Close();
else
{
//设置port的设置
comport.BaudRate = int.Parse(cmbBaudRate.Text);
com port.DataBits = int.Parse(cmbDataBits.Text);
comport.StopBits =(StopBits)Enum.Parse(typeof(StopBits),cmbStopBits.Text);
comport.Parity =(Parity)Enum.Parse(typeof(Parity),cmbParity.Text);
comport.PortName = cmbPortName.Text;
尝试
{
//打开港口
comport.Open();
}
catch (UnauthorizedAccessException){error = true; }
catch(IOException){error = true; }
catch(ArgumentException){error = true; }
如果(错误)MessageBox.Show(这,无法打开COM端口。很可能它已经被使用,已被删除或不可用。,COM Port Unavalible ,MessageBoxButtons.OK,MessageBoxIcon.Stop);
else
{
//显示初始引脚状态
UpdatePinState();
chkDTR.Checked = comport.DtrEnable;
chkRTS.Checked = comport.RtsEnable;
}
}
//更改表单'控件的状态
EnableControls();
//如果是端口已打开,将焦点发送到发送数据框
if(comport.IsOpen)
{
txtSendData.Focus();
if(chkClearOnOpen.Checked)ClearTerminal();
}
}
}
}
Hi,
I''m working on Serial Port Converter Process.How to connect serial port converter to C# coding.Can any one give me a solution for this.
Regards
Balamurugan
解决方案
You need to create and open a SerialPort instance connected to the machine, and read the data from it - you can then convert that into weights which your class can return.
Look at the MSDN page: SerialPort Class[^] - it includes a basic example of communications.
using System;
using System.Linq;
using System.Data;
using System.Text;
using System.Drawing;
using System.IO.Ports;
using System.Windows.Forms;
using System.ComponentModel;
using System.Collections.Generic;
using Converter.Properties;
using System.Threading;
using System.IO;
using System.Data.OleDb;
namespace Converter
{
#region Public Enumerations
public enum DataMode { Text, Hex }
public enum LogMsgType { Incoming, Outgoing, Normal, Warning, Error };
#endregion
public partial class SerialPort1 : Form
{
#region Local Variables
private SerialPort comport = new SerialPort();
private Color[] LogMsgTypeColor = { Color.Blue, Color.Green, Color.Black, Color.Orange, Color.Red };
private bool KeyHandled = false;
private Settings settings = Settings.Default;
OleDbCommand cmd;
OleDbConnection con;
OleDbDataReader dr;
#endregion
public SerialPort1()
{
InitializeComponent();
InitializeControlValues();
EnableControls();
comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
comport.PinChanged += new SerialPinChangedEventHandler(comport_PinChanged);
InitializeControlValues();
}
void comport_PinChanged(object sender, SerialPinChangedEventArgs e)
{
// Show the state of the pins
UpdatePinState();
}
private void InitializeControlValues()
{
cmbParity.Items.Clear(); cmbParity.Items.AddRange(Enum.GetNames(typeof(Parity)));
cmbStopBits.Items.Clear(); cmbStopBits.Items.AddRange(Enum.GetNames(typeof(StopBits)));
cmbParity.Text = settings.Parity.ToString();
cmbStopBits.Text = settings.StopBits.ToString();
cmbDataBits.Text = settings.DataBits.ToString();
cmbParity.Text = settings.Parity.ToString();
cmbBaudRate.Text = settings.BaudRate.ToString();
chkClearOnOpen.Checked = settings.ClearOnOpen;
chkClearWithDTR.Checked = settings.ClearWithDTR;
// If it is still avalible, select the last com port used
if (cmbPortName.Items.Contains(settings.PortName)) cmbPortName.Text = settings.PortName;
else if (cmbPortName.Items.Count > 0) cmbPortName.SelectedIndex = cmbPortName.Items.Count - 1;
else
{
MessageBox.Show(this, "There are no COM Ports detected on this computer.\nPlease install a COM Port and restart this app.", "No COM Ports Installed", MessageBoxButtons.OK, MessageBoxIcon.Error);
this.Close();
}
}
private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// If the com port has been closed, do nothing
if (!comport.IsOpen) return;
// This method will be called when there is data waiting in the port''s buffer
// Determain which mode (string or binary) the user is in
}
private void UpdatePinState()
{
this.Invoke(new ThreadStart(() =>
{
// Show the state of the pins
chkCD.Checked = comport.CDHolding;
chkCTS.Checked = comport.CtsHolding;
chkDSR.Checked = comport.DsrHolding;
}));
}
private void SaveSettings()
{
settings.BaudRate = int.Parse(cmbBaudRate.Text);
settings.DataBits = int.Parse(cmbDataBits.Text);
settings.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);
settings.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);
settings.PortName = cmbPortName.Text;
settings.ClearOnOpen = chkClearOnOpen.Checked;
settings.ClearWithDTR = chkClearWithDTR.Checked;
settings.Save();
}
private void EnableControls()
{
// Enable/disable controls based on whether the port is open or not
gbPortSettings.Enabled = !comport.IsOpen;
txtSendData.Enabled = btnSend.Enabled = comport.IsOpen;
//chkDTR.Enabled = chkRTS.Enabled = comport.IsOpen;
if (comport.IsOpen) btnOpenPort.Text = "&Close Port";
else btnOpenPort.Text = "&Open Port";
}
private void gbMode_Enter(object sender, EventArgs e)
{
}
private void cmbPortName_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void SendData()
{
// Send the user''s text straight out the port
comport.Write(txtSendData.Text);
// Show in the terminal window the user''s text
Log(LogMsgType.Outgoing, txtSendData.Text + "\n");
}
private void Log(LogMsgType msgtype, string msg)
{
rtfTerminal.Invoke(new EventHandler(delegate
{
rtfTerminal.SelectedText = string.Empty;
rtfTerminal.SelectionFont = new Font(rtfTerminal.SelectionFont, FontStyle.Bold);
rtfTerminal.SelectionColor = LogMsgTypeColor[(int)msgtype];
rtfTerminal.AppendText(msg);
rtfTerminal.ScrollToCaret();
}
)
);
}
private void chkDTR_CheckedChanged(object sender, EventArgs e)
{
comport.DtrEnable = chkDTR.Checked;
if (chkDTR.Checked && chkClearWithDTR.Checked) ClearTerminal();
}
private void ClearTerminal()
{
rtfTerminal.Clear();
}
private void chkRTS_CheckedChanged(object sender, EventArgs e)
{
comport.RtsEnable = chkRTS.Checked;
}
private void chkCTS_CheckedChanged(object sender, EventArgs e)
{
}
private void SerialPort1_Load(object sender, EventArgs e)
{
}
private void btnOpenPort_Click_1(object sender, EventArgs e)
{
bool error = false;
// If the port is open, close it.
if (comport.IsOpen) comport.Close();
else
{
// Set the port''s settings
comport.BaudRate = int.Parse(cmbBaudRate.Text);
comport.DataBits = int.Parse(cmbDataBits.Text);
comport.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmbStopBits.Text);
comport.Parity = (Parity)Enum.Parse(typeof(Parity), cmbParity.Text);
comport.PortName = cmbPortName.Text;
try
{
// Open the port
comport.Open();
}
catch (UnauthorizedAccessException) { error = true; }
catch (IOException) { error = true; }
catch (ArgumentException) { error = true; }
if (error) MessageBox.Show(this, "Could not open the COM port. Most likely it is already in use, has been removed, or is unavailable.", "COM Port Unavalible", MessageBoxButtons.OK, MessageBoxIcon.Stop);
else
{
// Show the initial pin states
UpdatePinState();
chkDTR.Checked = comport.DtrEnable;
chkRTS.Checked = comport.RtsEnable;
}
}
//Change the state of the form''s controls
EnableControls();
//If the port is open, send focus to the send data box
if (comport.IsOpen)
{
txtSendData.Focus();
if (chkClearOnOpen.Checked) ClearTerminal();
}
}
}
}
这篇关于C#中的串口转换器进程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文