485 lines
15 KiB
C#
485 lines
15 KiB
C#
using Microsoft.Win32;
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
|
|
namespace C_Windows_1
|
|
{
|
|
public partial class PortSetting : Form
|
|
{
|
|
public PortSetting()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void PortSetting_Load(object sender, EventArgs e)
|
|
{
|
|
string[] ports = System.IO.Ports.SerialPort.GetPortNames();//获得有效端口号
|
|
PortNum.Items.AddRange(ports);
|
|
CodePort1.Items.AddRange(ports);
|
|
Baudrate.SelectedIndex = 0;
|
|
Read();
|
|
if (Form1.f1.CH1.IsOpen())
|
|
{
|
|
label6.Text = "已连接";
|
|
label6.ForeColor = Color.Green;
|
|
label5.Text = "已连接";
|
|
label5.ForeColor = Color.Green;
|
|
Form1.f1.label6.Text = "已连接";
|
|
|
|
BtnCon1.Enabled = false;
|
|
PortNum.Enabled = false;
|
|
Baudrate.Enabled = false;
|
|
}
|
|
else
|
|
{
|
|
label6.Text = "未连接";
|
|
label6.ForeColor = Color.Red;
|
|
|
|
label5.Text = "未连接";
|
|
label5.ForeColor = Color.Red;
|
|
|
|
|
|
Form1.f1.label6.Text = "未连接";
|
|
|
|
BtnCon1.Enabled = true;
|
|
|
|
PortNum.Enabled = true;
|
|
Baudrate.Enabled = true;
|
|
}
|
|
|
|
|
|
|
|
if (Form1.f1.SerialPort1.IsOpen)
|
|
{
|
|
CodeIsComm1.Text = "已连接";
|
|
CodeIsComm1.ForeColor = Color.Green;
|
|
PortBtnCon1.Enabled = false;
|
|
}
|
|
else
|
|
{
|
|
CodeIsComm1.Text = "未连接";
|
|
CodeIsComm1.ForeColor = Color.Red;
|
|
PortBtnCon1.Enabled = true;
|
|
}
|
|
|
|
}
|
|
|
|
private void BtnCon1_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
|
|
if (Form1.f1.CH1.IsOpen())
|
|
{
|
|
Form1.f1.CH1.Close();
|
|
}
|
|
Form1.f1.ModbusRtuint(Form1.f1.CH1, Convert.ToByte(Form1.f1.Station.Text), PortNum.Text, Convert.ToInt32(Baudrate.Text), 8, System.IO.Ports.StopBits.One, System.IO.Ports.Parity.None);
|
|
|
|
if (Form1.f1.CH1.IsOpen())
|
|
{
|
|
Form1.f1.label6.Text = "已连接";
|
|
Form1.f1.BtnCon1.Enabled = false;
|
|
Form1.f1.label6.ForeColor = Color.Green;
|
|
|
|
label6.Text = "已连接";
|
|
label6.ForeColor = Color.Green;
|
|
label5.Text = "已连接";
|
|
label5.ForeColor = Color.Green;
|
|
BtnCon1.Enabled = false;
|
|
PortNum.Enabled = false;
|
|
Baudrate.Enabled = false;
|
|
SetPort();
|
|
Form1.f1.PortNum.Text = PortNum.Text;
|
|
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("连接失败,请检查端口占用情况");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
}
|
|
|
|
private void BtnRefresh_Click(object sender, EventArgs e)
|
|
{
|
|
PortNum.Items.Clear();
|
|
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
|
|
PortNum.Items.AddRange(ports);
|
|
}
|
|
|
|
private void BtnBreak_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
if (Form1.f1.CH1.IsOpen())
|
|
{
|
|
Form1.f1.CH1.Close();
|
|
if (Form1.f1.CH1.IsOpen() is false)
|
|
{
|
|
label6.Text = "未连接";
|
|
label6.ForeColor = Color.Red;
|
|
label5.Text = "未连接";
|
|
label5.ForeColor = Color.Red;
|
|
Form1.f1.label6.Text = "未连接";
|
|
Form1.f1.label6.ForeColor = Color.Red;
|
|
BtnCon1.Enabled = true;
|
|
PortNum.Enabled = true;
|
|
Baudrate.Enabled = true;
|
|
Form1.f1.BtnCon1.Enabled = true;
|
|
}
|
|
}
|
|
//else
|
|
//{
|
|
// ////读取启动信号需停止
|
|
// //Form1.f1.Timer1.Stop();
|
|
// //Form1.f1.Timer1.Dispose();
|
|
// //if (Form1.f1.Timer1.Enabled is true)
|
|
// //{
|
|
// // Form1.f1.Timer1.Stop();
|
|
// //}
|
|
// Form1.f1.SerialPort1.Close();
|
|
// if (Form1.f1.SerialPort1.IsOpen is false)
|
|
// {
|
|
// label6.Text = "未连接";
|
|
// label6.ForeColor = Color.Red;
|
|
// BtnCon1.Enabled = true;
|
|
|
|
// label5.Text = "未连接";
|
|
// label5.ForeColor = Color.Red;
|
|
|
|
// Form1.f1.label6.Text = "未连接";
|
|
|
|
// PortNum.Enabled = true;
|
|
// Baudrate.Enabled = true;
|
|
// }
|
|
//}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
}
|
|
|
|
//发送过程
|
|
private void Send()
|
|
{
|
|
try
|
|
{
|
|
//将CRC冗余码添加进指令中
|
|
String str = Form1.f1.Station.Text + "0300190001";
|
|
byte[] byt = StrtoHexbyte(str);
|
|
int str2;
|
|
str2 = Crc16_Modbus(byt, byt.Length);
|
|
|
|
string str3;
|
|
|
|
str3 = Convert.ToString((str2 >> 8) & 0xff, 16);
|
|
string str4;
|
|
str4 = Convert.ToString(str2 & 0xff, 16);
|
|
|
|
if (str3.Length == 1)
|
|
{
|
|
str3 = "0" + str3;
|
|
}
|
|
if (str4.Length == 1)
|
|
{
|
|
str4 = "0" + str4;
|
|
}
|
|
SendText.Text = str + str4 + str3;
|
|
String str5 = SendText.Text;
|
|
if (str5.Length > 0)
|
|
{
|
|
byte[] byt2 = StrtoHexbyte(str5);
|
|
TestPort1.Write(byt2, 0, byt2.Length);//发送数据
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
}
|
|
|
|
//计算CRC冗余码
|
|
private int Crc16_Modbus(byte[] modbusdata, int length)
|
|
{
|
|
int i, j;
|
|
int crc = 0xffff;//0xffff or 0
|
|
for (i = 0; i < length; i++)
|
|
{
|
|
crc ^= modbusdata[i] & 0xff;
|
|
for (j = 0; j < 8; j++)
|
|
{
|
|
if ((crc & 0x01) == 1)
|
|
{
|
|
crc = (crc >> 1) ^ 0xa001;
|
|
}
|
|
else
|
|
{
|
|
crc >>= 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return crc;
|
|
}
|
|
|
|
//将发送数据转为十六进制数据
|
|
private static byte[] StrtoHexbyte(String hexstring)
|
|
{
|
|
int i;
|
|
hexstring = hexstring.Replace(" ", "");
|
|
byte[] returnBytes = new byte[(hexstring.Length) / 2];
|
|
try
|
|
{
|
|
for (i = 0; i < returnBytes.Length; i++)
|
|
{
|
|
returnBytes[i] = Convert.ToByte(hexstring.Substring(i * 2, 2), 16);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
return null;
|
|
}
|
|
return returnBytes;
|
|
}
|
|
|
|
//接收数据
|
|
private void TestPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
System.Threading.Thread.Sleep(100);
|
|
int len = TestPort1.BytesToRead;//获取可以读取的字节数
|
|
if (len > 1)
|
|
{
|
|
byte[] buff = new byte[len];//创建缓存数据数组
|
|
TestPort1.Read(buff, 0, len);//把数据读取到buff数组
|
|
//string str = Encoding.Default.GetString(buff);
|
|
Invoke((new System.Action(() => //串口接收事件会自动创建线程
|
|
{
|
|
ReceiveText.Clear();
|
|
ReceiveText.Text = ByteToHexStr(buff);
|
|
TestPort1.DiscardInBuffer();
|
|
}
|
|
)));
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show(ex.Message);
|
|
}
|
|
}
|
|
|
|
private void ReceiveText_TextChanged(object sender, EventArgs e)
|
|
{
|
|
//if (ReceiveText.Text.Length > 0)
|
|
//{
|
|
// timer1.Interval = 200;
|
|
// timer1.Start();
|
|
//}
|
|
}
|
|
|
|
private void Stagenum()
|
|
{
|
|
string testresult = ReceiveText.Text.Replace(" ", "");
|
|
if (testresult.Length > 10 && testresult.Substring(2, 2) == "03")
|
|
{
|
|
//设置端口的参数,包括波特率等
|
|
Form1.f1.SerialPort1.BaudRate = int.Parse(Baudrate.Text);
|
|
Form1.f1.SerialPort1.PortName = PortNum.Text;
|
|
Form1.f1.SerialPort1.DataBits = 8;
|
|
Form1.f1.SerialPort1.StopBits = System.IO.Ports.StopBits.One;
|
|
Form1.f1.SerialPort1.Parity = System.IO.Ports.Parity.None;
|
|
|
|
Form1.f1.SerialPort1.Open();
|
|
if (Form1.f1.SerialPort1.IsOpen)
|
|
{
|
|
label5.Text = "已连接";
|
|
label5.ForeColor = Color.Green;
|
|
|
|
Form1.f1.label6.Text = "已连接";
|
|
Form1.f1.label6.ForeColor = Color.Green;
|
|
|
|
Form1.f1.PortNum.Text = Form1.f1.SerialPort1.PortName;
|
|
|
|
Form1.f1.Timer1.Interval = 800;
|
|
Form1.f1.Timer1.Start();
|
|
Form1.f1.stage = 1;
|
|
|
|
Form1.f1.BtnCon1.Enabled = false;
|
|
|
|
|
|
//stage = 1;
|
|
SetPort();
|
|
}
|
|
}
|
|
}
|
|
|
|
//十六进制接收
|
|
public static string ByteToHexStr(byte[] bytes)
|
|
{
|
|
string returnStr = "";
|
|
try
|
|
{
|
|
if (bytes != null)
|
|
{
|
|
for (int i = 0; i < bytes.Length; i++)
|
|
{
|
|
returnStr += bytes[i].ToString("X2");//每个字节转换成两位十六进制
|
|
returnStr += " ";//两个16进制用空格隔开,方便看数据
|
|
}
|
|
}
|
|
return returnStr;
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return returnStr;
|
|
}
|
|
}
|
|
|
|
//端口写入
|
|
private void SetPort()
|
|
{
|
|
RegistryKey regName;
|
|
|
|
regName = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\PMD\\1.0\\User-LL18-Set", true);
|
|
|
|
if (regName is null)
|
|
{
|
|
regName = Registry.CurrentUser.CreateSubKey("SOFTWARE\\Microsoft\\PMD\\1.0\\User-LL18-Set");
|
|
}
|
|
|
|
regName.SetValue("port", PortNum.Text);
|
|
regName.SetValue("Baudrate", Baudrate.Text);
|
|
regName.Close();
|
|
}
|
|
|
|
|
|
private void SetcodePort()
|
|
{
|
|
RegistryKey regName;
|
|
|
|
regName = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\PMD\\1.0\\User-LL18-Set", true);
|
|
|
|
if (regName is null)
|
|
{
|
|
regName = Registry.CurrentUser.CreateSubKey("SOFTWARE\\Microsoft\\PMD\\1.0\\User-LL18-Set");
|
|
}
|
|
|
|
regName.SetValue("codeport", CodePort1.Text);
|
|
regName.SetValue("codeBaudrate", CodeBaud1.Text);
|
|
regName.Close();
|
|
}
|
|
|
|
private void Read()
|
|
{
|
|
RegistryKey regName;
|
|
|
|
regName = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\PMD\\1.0\\User-LL18-Set", true);
|
|
|
|
if (regName is null)
|
|
{
|
|
regName = Registry.CurrentUser.CreateSubKey("SOFTWARE\\Microsoft\\PMD\\1.0\\User-LL18-Set");
|
|
}
|
|
|
|
regName.OpenSubKey("User");
|
|
if (regName.GetValue("port") is null)
|
|
{
|
|
PortNum.Text = "";
|
|
}
|
|
else
|
|
{
|
|
PortNum.Text = regName.GetValue("port").ToString();
|
|
}
|
|
if (regName.GetValue("Baudrate") is null)
|
|
{
|
|
Baudrate.Text = "9600";
|
|
}
|
|
else
|
|
{
|
|
Baudrate.Text = regName.GetValue("Baudrate").ToString();
|
|
}
|
|
if (regName.GetValue("codeport") is null)
|
|
{
|
|
CodePort1.Text = "COM8";
|
|
}
|
|
else
|
|
{
|
|
CodePort1.Text = regName.GetValue("codeport").ToString();
|
|
}
|
|
CodeBaud1.Text = "9600";
|
|
|
|
|
|
|
|
regName.Close();
|
|
}
|
|
|
|
private void timer1_Tick(object sender, EventArgs e)
|
|
{
|
|
//try
|
|
//{
|
|
// timer1.Stop();
|
|
// TestPort1.Close();
|
|
// Stagenum();
|
|
//}
|
|
//catch (Exception ex)
|
|
//{
|
|
// timer1.Stop();
|
|
//}
|
|
}
|
|
|
|
private void PortBtnCon1_Click(object sender, EventArgs e)
|
|
{
|
|
try
|
|
{
|
|
Form1.f1.CodePort1.Close();
|
|
//设置端口的参数,包括波特率等
|
|
Form1.f1.CodePort1.BaudRate = int.Parse(CodeBaud1.Text);
|
|
Form1.f1.CodePort1.PortName = CodePort1.Text;
|
|
Form1.f1.CodePort1.DataBits = 8;
|
|
Form1.f1.CodePort1.StopBits = System.IO.Ports.StopBits.One;
|
|
Form1.f1.CodePort1.Parity = System.IO.Ports.Parity.None;
|
|
Form1.f1.CodePort1.Open();
|
|
if (Form1.f1.CodePort1.IsOpen)
|
|
{
|
|
CodeIsComm1.Text = "已连接";
|
|
CodeIsComm1.ForeColor = Color.Green;
|
|
CodePort1.Enabled = false;
|
|
PortBtnCon1.Enabled = false;
|
|
CodeBaud1.Enabled = false;
|
|
SetcodePort();
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
//MessageBox.Show(ex.Message);
|
|
MessageBox.Show(ex.StackTrace);
|
|
}
|
|
}
|
|
|
|
private void PortBtnRefresh_Click(object sender, EventArgs e)
|
|
{
|
|
CodePort1.Items.Clear();
|
|
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
|
|
CodePort1.Items.AddRange(ports);
|
|
}
|
|
|
|
private void PortBtnBreak_Click(object sender, EventArgs e)
|
|
{
|
|
Form1.f1.CodePort1.Close();
|
|
if (!Form1.f1.CodePort1.IsOpen)
|
|
{
|
|
CodeIsComm1.Text = "未连接";
|
|
CodeIsComm1.ForeColor = Color.Red;
|
|
CodePort1.Enabled = true;
|
|
PortBtnCon1.Enabled = true;
|
|
CodeBaud1.Enabled = true;
|
|
}
|
|
}
|
|
}
|
|
} |