20220101_HXSYS_upperpc/ZPYSerialPort/Form1.cs

367 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ZPYSerialPort
{
public partial class Form1 : Form
{
//private static SerialPort _serialPort;
public Form1()
{
InitializeComponent();
}
private void open_btn_Click(object sender, EventArgs e)
{
try
{
if (serialPort1.IsOpen == false)
{
serialPort1.PortName = portname_cbb.Text;
serialPort1.BaudRate = Convert.ToInt32(baudrate_cbb.Text);
serialPort1.DataBits = Convert.ToInt32(databit_cbb.Text);
//校验位
switch (parity_cbb.SelectedIndex)
{
case 0:
serialPort1.Parity = Parity.None;
break;
case 1:
serialPort1.Parity = Parity.Odd;
break;
case 2:
serialPort1.Parity = Parity.Even;
break;
}
//停止位
switch (stopbit_cbb.SelectedIndex)
{
case 0:
serialPort1.StopBits = StopBits.One;
break;
case 1:
serialPort1.StopBits = StopBits.OnePointFive;
break;
case 2:
serialPort1.StopBits = StopBits.Two;
break;
}
serialPort1.Open();
//serialPort1.DataReceived += SerialPort1_DataReceived;
portname_cbb.Enabled = false;
baudrate_cbb.Enabled = false;
databit_cbb.Enabled = false;
parity_cbb.Enabled = false;
stopbit_cbb.Enabled = false;
open_btn.Text = "关闭串口";
}
else
{
serialPort1.Close();
portname_cbb.Enabled = true;
baudrate_cbb.Enabled = true;
databit_cbb.Enabled = true;
parity_cbb.Enabled = true;
stopbit_cbb.Enabled = true;
open_btn.Text = "打开串口";
}
}
catch (Exception ee)
{
MessageBox.Show("Error" + ee.Message, "Error");
}
}
//private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
//{
// throw new NotImplementedException();
//}
private void Form1_Load(object sender, EventArgs e)
{
//获取本机串口
portname_cbb.Items.Clear();
portname_cbb.Items.AddRange(SerialPort.GetPortNames());
baudrate_cbb.Items.Add(2400);
baudrate_cbb.Items.Add(4800);
baudrate_cbb.Items.Add(9600);
baudrate_cbb.Items.Add(19200);
baudrate_cbb.Items.Add(38400);
baudrate_cbb.Items.Add(57600);
baudrate_cbb.Items.Add(115200);
baudrate_cbb.Items.Add(230400);
baudrate_cbb.Items.Add(460800);
baudrate_cbb.Items.Add(921600);
parity_cbb.Items.Add("none");
parity_cbb.Items.Add("odd");
parity_cbb.Items.Add("even");
databit_cbb.Items.Add(5);
databit_cbb.Items.Add(6);
databit_cbb.Items.Add(7);
databit_cbb.Items.Add(8);
stopbit_cbb.Items.Add(1);
stopbit_cbb.Items.Add(1.5);
stopbit_cbb.Items.Add(2);
//portname_cbb.SelectedIndex = 1;
baudrate_cbb.SelectedIndex = 2;
parity_cbb.SelectedIndex = 0;
databit_cbb.SelectedIndex = 3;
stopbit_cbb.SelectedIndex = 0;
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
int jishu = 0;
DateTime dateT = System.DateTime.Now;
string strRcv = null;
System.Threading.Thread.Sleep(100);
byte[] byteRead = new byte[serialPort1.BytesToRead];
serialPort1.Read(byteRead, 0, byteRead.Length);
serialPort1.DiscardInBuffer();
//CRC校验
//if (!CRC16(byteRead))
// return;
if (byteRead[2] == 0x04 && byteRead[3] == 0x00)
{
if (byteRead[4] == 0x00)//状态查询,返回未开机,即发送开机指令
{
Console.WriteLine("未开机!");
Invoke((EventHandler)(delegate
{
textBox1.Text += dateT + "" + "未开机!" + "\r\n" + "\r\n";
}));
serialPort1.Write(new byte[8] { 0x01, 0x03, 0x00, 0xB0, 0x00, 0x01, 0x85, 0xED }, 0, 8);
return;
}
if (byteRead[4] == 0x01)//状态查询开机中则直接return
{
Console.WriteLine("开机中!");
Invoke((EventHandler)(delegate
{
textBox1.Text += dateT + "" + "开机中!" + "\r\n" + "\r\n";
}));
return;
}
if (byteRead[4] == 0x02)//状态查询待机中没搁10s查询一次状态
{
Console.WriteLine("待机中!");
Invoke((EventHandler)(delegate
{
textBox1.Text += dateT + "" + "待机中!" + "\r\n" + "\r\n";
}));
Thread.Sleep(10000);
serialPort1.Write(new byte[8] { 0x01, 0x03, 0x00, 0xAE, 0x00, 0x02, 0xA5, 0xEA }, 0, 8);
return;
}
if (byteRead[4] == 0x03)//状态查询运行中则直接return
{
Console.WriteLine("运行中!");
Invoke((EventHandler)(delegate
{
textBox1.Text += dateT + "" + "运行中!" + "\r\n" + "\r\n";
}));
return;
}
if (byteRead[4] == 0x04)//状态查询关机中则直接return
{
Console.WriteLine("关机中!");
Invoke((EventHandler)(delegate
{
textBox1.Text += dateT + "" + "关机中!" + "\r\n" + "\r\n";
}));
return;
}
}
else
{
Invoke((EventHandler)(delegate
{
for (int i = 0; i < byteRead.Length; i++) //窗体显示
{
strRcv += byteRead[i].ToString("X2") + " "; //16进制显示
}
textBox1.Text += dateT + "" + strRcv + "\r\n" + "\r\n";
}));
List<byte> list = new List<byte>(byteRead);
list.RemoveRange(0, 3); //移除从0开始的3个元素即01 03和长度
list.RemoveAt(list.Count - 1); //移除最后一个删校验1
list.RemoveAt(list.Count - 1); //移除最后一个删校验2
list.RemoveAt(list.Count - 1); //移除最后一个删0A
list.RemoveAt(list.Count - 1); //移除最后一个,删最后一个\t
byteRead = list.ToArray();
string s = Encoding.Default.GetString(byteRead);
string[] s_data = s.Split('\t');
//字符串显示
//Invoke((EventHandler)(delegate
//{
// textBox1.Text += dateT + "" + s + "\r\n";
//}));
for (int i = 0; i < byteRead.Length; i++)
{
if (byteRead[i] == 0x09)
{
jishu = jishu + 1;
}
}
switch (jishu)
{
case 2:
Invoke((EventHandler)(delegate
{
label19.Text = s_data[0];
label20.Text = s_data[1];
label21.Text = s_data[2];
}));
break;
case 9:
Invoke((EventHandler)(delegate
{
label22.Text = s_data[0];
label23.Text = s_data[1];
label25.Text = s_data[2];
label24.Text = s_data[3];
label27.Text = s_data[4];
label26.Text = s_data[5];
label29.Text = s_data[6];
label28.Text = s_data[7];
label31.Text = s_data[8];
label30.Text = s_data[9];
}));
break;
default:
break;
}
}
}
catch
{
}
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Clear();
}
private void button2_Click(object sender, EventArgs e)
{
serialPort1.Write(new byte[8] { 0x01, 0x03, 0x00, 0xB1, 0x00, 0x01, 0xD4, 0x2D }, 0, 8);
}
public static bool CRC16(byte[] buffer)
{
if (buffer.Length <= 2)
return false;
List<byte> a = buffer.ToList<byte>();
byte[] c = new byte[2] { a[a.Count - 2], a[a.Count - 1] };
a.RemoveRange(a.Count - 2, 2);
if (c[0] == Crc16(a.ToArray(), a.Count)[0] && c[1] == Crc16(a.ToArray(), a.Count)[1])
return true;
return false;
}
#region CRC校验
private static readonly byte[] aucCRCHi = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40
};
private static readonly byte[] aucCRCLo = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7,
0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E,
0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9,
0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC,
0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32,
0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D,
0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38,
0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF,
0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1,
0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4,
0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB,
0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA,
0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0,
0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97,
0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E,
0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89,
0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83,
0x41, 0x81, 0x80, 0x40
};
public static byte[] Crc16(byte[] pucFrame, int usLen)
{
int i = 0;
byte crcHi = 0xFF;
byte crcLo = 0xFF;
UInt16 iIndex = 0x0000;
while (usLen-- > 0)
{
iIndex = (UInt16)(crcLo ^ pucFrame[i++]);
crcLo = (byte)(crcHi ^ aucCRCHi[iIndex]);
crcHi = aucCRCLo[iIndex];
}
return new byte[] { crcLo, crcHi };
}
#endregion
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (serialPort1.IsOpen == true)
{
serialPort1.Close();
}
}
private void button3_Click(object sender, EventArgs e)
{
serialPort1.Write(new byte[8] { 0x01,0x03,0x00,0xAE,0x00,0x02,0xA5,0xEA }, 0, 8);
}
}
}