C#中的串口转换器进程 [英] Serial Port Converter Process in C#

查看:78
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆