实例介绍
【实例简介】
【实例截图】
【核心代码】
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;
using System.IO.Ports;
using System.Runtime.InteropServices;
using UniLua;
namespace SerialHelper
{
public partial class frmMain : Form
{
private SerialPort serial = new SerialPort();
private System.Timers.Timer time_timer = new System.Timers.Timer();
private System.Timers.Timer loop_timer = new System.Timers.Timer();
private int in_loop_timer = 0;
private int tn_show_time = 0;
private long count_send = 0, count_recv = 0;
private string recv_file_path, send_file_path;
private bool _recv_file = false;
private bool _file_should_stop = false;
private System.Threading.Thread file_thread = null;
private bool _lua_should_stop = false;
private System.Threading.Thread lua_thread = null;
private AppConfig config = new AppConfig();
private ILuaState lua;
private Queue<byte> read_buffer = new Queue<byte>();
#region 检测USB串口的热拔插
// usb消息定义
public const int WM_DEVICE_CHANGE = 0x219;
public const int DBT_DEVICEARRIVAL = 0x8000;
public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004;
public const UInt32 DBT_DEVTYP_PORT = 0x00000003;
[StructLayout(LayoutKind.Sequential)]
struct DEV_BROADCAST_HDR
{
public UInt32 dbch_size;
public UInt32 dbch_devicetype;
public UInt32 dbch_reserved;
}
[StructLayout(LayoutKind.Sequential)]
protected struct DEV_BROADCAST_PORT_Fixed
{
public uint dbcp_size;
public uint dbcp_devicetype;
public uint dbcp_reserved;
// Variable?length field dbcp_name is declared here in the C header file.
}
/// <summary>
/// 检测USB串口的拔插
/// </summary>
/// <param name="m"></param>
protected override void WndProc(ref Message m)
{
DEV_BROADCAST_HDR dbhdr;
if (m.Msg == WM_DEVICE_CHANGE) // 捕获USB设备的拔出消息WM_DEVICECHANGE
{
switch (m.WParam.ToInt32())
{
case DBT_DEVICE_REMOVE_COMPLETE: // USB拔出
dbhdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
if (dbhdr.dbch_devicetype == DBT_DEVTYP_PORT)
{
string portName = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
Console.WriteLine("Port '" portName "' removed.");
if (portName.CompareTo(serial.PortName) == 0)
{
serial_port_close();
}
}
break;
case DBT_DEVICEARRIVAL: // USB插入获取对应串口名称
dbhdr = (DEV_BROADCAST_HDR)Marshal.PtrToStructure(m.LParam, typeof(DEV_BROADCAST_HDR));
if (dbhdr.dbch_devicetype == DBT_DEVTYP_PORT)
{
string portName = Marshal.PtrToStringUni((IntPtr)(m.LParam.ToInt32() Marshal.SizeOf(typeof(DEV_BROADCAST_PORT_Fixed))));
Console.WriteLine("Port '" portName "' arrived.");
}
break;
}
}
base.WndProc(ref m);
}
#endregion
public frmMain()
{
InitializeComponent();
//////////////////////////////////////////////////////////////////////////////
string[] checks = { "XOR异或校验", "SUM8累加校验", "ModBusLRC校验", "CRC16低字节在前", "CRC16高字节在前", "SUM16低字节在前", "SUM16高字节在前", "ModBusCRC低字节在前", "ModBusCRC高字节在前" };
cbo_pack_check.Items.AddRange(checks);
cbo_pack_check.Text = "XOR异或校验";
string[] port_names = SerialPort.GetPortNames();
Array.Sort(port_names, new CustomComparer());
cbo_port_name.Items.AddRange(port_names);
cbo_port_name.SelectedIndex = cbo_port_name.Items.Count > 0 ? 0 : -1;
string[] baud_rates = { "110", "300", "600", "1200", "2400", "4800", "9600", "14400", "19200", "38400", "56000", "57600", "115200", "128000", "256000" };
cbo_port_baud_rate.Items.AddRange(baud_rates);
cbo_port_baud_rate.Text = "9600";
string[] paritys = { "None", "Odd", "Even", "Mark", "Space" };
cbo_port_parity.Items.AddRange(paritys);
cbo_port_parity.Text = "None";
string[] data_bits = { "5", "6", "7", "8" };
cbo_port_data_bits.Items.AddRange(data_bits);
cbo_port_data_bits.Text = "8";
string[] stop_bits = { "1", "1.5", "2" };
cbo_port_stop_bits.Items.AddRange(stop_bits);
cbo_port_stop_bits.Text = "1";
//////////////////////////////////////////////////////////////////////////////
chk_recv_show.Checked = true;
//////////////////////////////////////////////////////////////////////////////
lua = LuaAPI.NewState();
lua.L_OpenLibs();
lua.RegisterGlobalFunc("read", lua_read);
lua.RegisterGlobalFunc("write", lua_write);
lua.RegisterGlobalFunc("send", lua_send);
lua.RegisterGlobalFunc("sleep", lua_sleep);
lua.RegisterGlobalFunc("show", lua_show);
lua.RegisterGlobalFunc("help", lua_help);
//////////////////////////////////////////////////////////////////////////////
time_timer.Interval = 1;
time_timer.Start();
serial.DataReceived = serial_DataReceived;
time_timer.Elapsed = time_timer_ElapsedEventHandler;
loop_timer.Elapsed = loop_timer_ElapsedEventHandler;
cbo_port_name.SelectionChangeCommitted = new System.EventHandler(cbo_port_SelectionChangeCommitted);
cbo_port_baud_rate.SelectionChangeCommitted = new System.EventHandler(cbo_port_SelectionChangeCommitted);
cbo_port_parity.SelectionChangeCommitted = new System.EventHandler(cbo_port_SelectionChangeCommitted);
cbo_port_data_bits.SelectionChangeCommitted = new System.EventHandler(cbo_port_SelectionChangeCommitted);
cbo_port_stop_bits.SelectionChangeCommitted = new System.EventHandler(cbo_port_SelectionChangeCommitted);
}
public class CustomComparer : System.Collections.IComparer
{
public int Compare(object x, object y)
{
string s1 = (string)x;
string s2 = (string)y;
if (s1.Length > s2.Length) return 1;
if (s1.Length < s2.Length) return -1;
return s1.CompareTo(s2);
}
}
void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytes = serial.BytesToRead;
int i;
try
{
if (bytes > 0)
{
byte[] buffer = new byte[bytes]; // 声明一个临时数组存储当前来的串口数据
serial.Read(buffer, 0, bytes); // 读取缓冲数据
for (i = 0; i < bytes; i )
{
if (read_buffer.Count() >= 65536)
{
read_buffer.Dequeue();
}
read_buffer.Enqueue(buffer[i]);
}
this.BeginInvoke((EventHandler)(delegate
{
count_recv = buffer.Length;
slab_recv.Text = "接收:" count_recv.ToString();
if (chk_recv_show.Checked)
{
serial_recv_data(buffer);
}
}));
}
}
catch (Exception ex)
{
this.BeginInvoke((EventHandler)(delegate
{
serial_port_close();
MessageBoxEx.Show(this, ex.Message, "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}));
}
}
void time_timer_ElapsedEventHandler(object sender, EventArgs e)
{
if (tn_show_time > 0)
{
tn_show_time--;
}
}
void loop_timer_ElapsedEventHandler(object sender, EventArgs e)
{
if (System.Threading.Interlocked.Exchange(ref in_loop_timer, 1) == 0)
{
serial_send_start();
System.Threading.Interlocked.Exchange(ref in_loop_timer, 0);
}
}
private void serial_port_open()
{
try
{
if (serial.IsOpen)
{
serial.Close();
}
serial.PortName = cbo_port_name.Text;
serial.BaudRate = int.Parse(cbo_port_baud_rate.Text);
serial.Parity = (Parity)Enum.Parse(typeof(Parity), cbo_port_parity.Text);
serial.DataBits = int.Parse(cbo_port_data_bits.Text);
StopBits[] stop_bits = { StopBits.One, StopBits.OnePointFive, StopBits.Two };
serial.StopBits = stop_bits[cbo_port_stop_bits.SelectedIndex];
serial.Open();
}
catch (Exception ex)
{
MessageBoxEx.Show(this, ex.Message, "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
if (serial.IsOpen)
{
btn_port_open.Image = Properties.Resources.open;
btn_port_open.Text = " 关闭串口";
}
else
{
btn_port_open.Image = Properties.Resources.close;
btn_port_open.Text = " 打开串口";
}
}
private void serial_port_close()
{
try
{
if (loop_timer.Enabled)
{
send_loop_stop();
}
if (serial.IsOpen)
{
serial.Close();
}
}
catch
{
}
btn_port_open.Image = Properties.Resources.close;
btn_port_open.Text = " 打开串口";
}
private void btn_port_open_Click(object sender, EventArgs e)
{
if (serial.IsOpen)
{
serial_port_close();
}
else
{
serial_port_open();
}
}
private void cbo_port_name_DropDown(object sender, EventArgs e)
{
string port_name_old = cbo_port_name.Text;
string[] port_names = SerialPort.GetPortNames();
Array.Sort(port_names, new CustomComparer());
cbo_port_name.Items.Clear();
cbo_port_name.Items.AddRange(port_names);
cbo_port_name.Text = port_name_old;
if ((cbo_port_name.Items.Count > 0) && (cbo_port_name.SelectedIndex < 0))
{
cbo_port_name.SelectedIndex = 0;
}
}
private void cbo_port_SelectionChangeCommitted(object sender, EventArgs e)
{
if (serial.IsOpen)
{
serial_port_open();
}
}
private void txt_show_send_KeyDown(object sender, KeyEventArgs e)
{
if ((e.KeyCode == Keys.Enter) && (e.Modifiers == Keys.Control))
{
serial_send_start();
}
}
private void txt_show_recv_KeyDown(object sender, KeyEventArgs e)
{
if (serial.IsOpen)
{
if (e.KeyCode == Keys.Up)
{
byte[] bytes = { 0x1B, 0x5B, 0x41 };
serial_send_data(bytes);
e.Handled = true;
}
else if (e.KeyCode == Keys.Down)
{
byte[] bytes = { 0x1B, 0x5B, 0x42 };
serial_send_data(bytes);
e.Handled = true;
}
else if (e.KeyCode == Keys.Right)
{
byte[] bytes = { 0x1B, 0x5B, 0x43 };
serial_send_data(bytes);
e.Handled = true;
}
else if (e.KeyCode == Keys.Left)
{
byte[] bytes = { 0x1B, 0x5B, 0x44 };
serial_send_data(bytes);
e.Handled = true;
}
else if (e.KeyCode == Keys.Escape)
{
byte[] bytes = { 0x1B };
serial_send_data(bytes);
e.Handled = true;
}
else if (e.KeyCode == Keys.Delete)
{
byte[] bytes = { 0x7F };
serial_send_data(bytes);
e.Handled = true;
}
}
}
private void txt_show_recv_KeyPress(object sender, KeyPressEventArgs e)
{
if (serial.IsOpen)
{
string str_tmp = e.KeyChar.ToString();
byte[] bytes = Encoding.Default.GetBytes(str_tmp);
serial_send_data(bytes);
}
e.Handled = true;
}
private void txt_show_send_clear()
{
if (chk_send_file.Checked)
{
chk_send_file.Checked = false;
}
else
{
txt_show_send.Clear();
}
}
private void lbl_send_clear_Click(object sender, EventArgs e)
{
txt_show_send_clear();
}
private void txt_show_recv_clear()
{
if (chk_recv_file.Checked)
{
chk_recv_file.Checked = false;
}
else
{
txt_show_recv.Clear();
}
count_recv = 0;
slab_recv.Text = "接收:" count_recv.ToString();
count_send = 0;
slab_send.Text = "发送:" count_send.ToString();
}
private void lbl_recv_clear_Click(object sender, EventArgs e)
{
txt_show_recv_clear();
}
private void chk_send_hex_CheckedChanged(object sender, EventArgs e)
{
try
{
if (!chk_send_file.Checked)
{
if (!chk_send_lua.Checked)
{
if (chk_send_hex.Checked)
{
txt_show_send.Text = byte_to_hex(Encoding.Default.GetBytes(txt_show_send.Text));
}
else
{
txt_show_send.Text = Encoding.Default.GetString(hex_to_byte(txt_show_send.Text));
}
}
}
}
catch (Exception ee)
{
MessageBoxEx.Show(this, ee.Message, "消息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private byte[] calc_modbus_crc(byte[] buffer)
{
UInt16 crc = 0xFFFF;
int i, j;
for (i = 0; i < buffer.Length; i )
{
crc ^= buffer[i];
for (j = 0; j < 8; j )
{
if ((crc & 0x0001) != 0)
{
crc >>= 1;
crc ^= 0xA001;
}
else
{
crc >>= 1;
}
}
}
return BitConverter.GetBytes(crc);
}
private byte[] calc_crc_16(UInt16 polynomials, byte[] buffer)
{
UInt16 crc = 0x0000;
int i, j;
for (i = 0; i < buffer.Length; i )
{
crc ^= (UInt16)((UInt16)buffer[i] << 8);
for (j = 0; j < 8; j )
{
if ((crc & 0x8000) != 0)
{
crc <<= 1;
crc ^= polynomials;
}
else
{
crc <<= 1;
}
}
}
return BitConverter.GetBytes(crc);
}
private byte[] calc_sum_16(byte[] buffer)
{
UInt16 sum = 0;
int i;
for (i = 0; i < buffer.Length; i )
{
sum = buffer[i];
}
return BitConverter.GetBytes(sum);
}
private byte[] calc_xor(byte[] buffer)
{
byte xor = 0;
int i;
for (i = 0; i < buffer.Length; i )
{
xor ^= buffer[i];
}
return new byte[] { xor };
}
private byte[] hex_to_byte(string str_hex)
{
List<byte> buffer = new List<byte>();
int len;
str_hex = str_hex.Trim();
while (str_hex.Length > 0)
{
len = str_hex.Length;
if (len > 2) len = 2;
buffer.Add(byte.Parse(str_hex.Substring(0, len), System.Globalization.NumberStyles.HexNumber));
str_hex = str_hex.Substring(len).TrimStart();
}
return buffer.ToArray();
}
private string byte_to_hex(byte[] buffer)
{
int i;
string str_tmp = "";
for (i = 0; i < buffer.Length; i )
{
str_tmp = buffer[i].ToString("X2") " ";
}
return str_tmp;
}
private void serial_recv_data(byte[] buffer)
{
string str_tmp = "";
if (chk_recv_time.Checked)
{
if (tn_show_time == 0)
{
if (txt_show_recv.Text.Length > 0)
{
str_tmp = "\r\n";
}
str_tmp = "【" DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") "】";
}
tn_show_time = 10;
}
if (chk_recv_hex.Checked)
{
str_tmp = byte_to_hex(buffer);
}
else
{
str_tmp = Encoding.Default.GetString(buffer);
}
if (_recv_file)
{
File.AppendAllText(recv_file_path, str_tmp);
}
else
{
string[] strs = str_tmp.Split('\b');
int i;
for (i = 0; i < strs.Count(); i )
{
if ((txt_show_recv.TextLength >= 1) && (i > 0))
{
string str_select = "";
txt_show_recv.Select(txt_show_recv.TextLength - 1, 1);
if (txt_show_recv.SelectedText[0] == '\n')
{
if ((txt_show_recv.TextLength >= 2) && (txt_show_recv.Text[txt_show_recv.TextLength - 2] == '\r'))
{
txt_show_recv.Select(txt_show_recv.TextLength - 2, 2);
}
}
else
{
byte[] byte_tmp = Encoding.Default.GetBytes(txt_show_recv.SelectedText);
if (byte_tmp.Length > 1)
{
byte[] byte_select = new byte[byte_tmp.Length - 1];
Array.Copy(byte_tmp, byte_select, byte_select.Length);
str_select = Encoding.Default.GetString(byte_select);
}
}
txt_show_recv.SelectedText = str_select;
}
if (strs[i].LastIndexOf("\x1B[2K") >= 0)
{
strs[i] = strs[i].Substring(strs[i].LastIndexOf("\x1B[2K") "\x1B[2K".Length);
int pos = txt_show_recv.Text.LastIndexOf("\r\n");
if (pos >= 0)
{
pos = "\r\n".Length;
txt_show_recv.Select(pos, txt_show_recv.Text.Length - pos);
txt_show_recv.SelectedText = "";
}
else
{
txt_show_recv.Text = "";
}
}
txt_show_recv.AppendText(strs[i]);
}
}
}
private void serial_send_data(byte[] buffer)
{
if (buffer.Length > 0)
{
if (serial.IsOpen)
{
serial.Write(buffer, 0, buffer.Length);
this.BeginInvoke((EventHandler)(delegate
{
count_send = buffer.Length;
slab_send.Text = "发送:" count_send.ToString();
if (chk_send_show.Checked)
{
serial_recv_data(buffer);
}
}));
}
else
{
serial_recv_data(buffer);
}
}
}
private void send_file_thread()
{
FileStream file_reader = new FileStream(send_file_path, FileMode.Open, FileAccess.Read);
long length = file_reader.Length;
long offset = 0, count = 0;
try
{
while ((!_file_should_stop) && (offset < length))
{
count = length - offset;
if (count > 32)
{
count = 32;
}
byte[] buffer = new byte[count];
file_reader.Read(buffer, 0, (int)count);
if (chk_send_hex.Checked)
{
buffer = hex_to_byte(Encoding.Default.GetString(buffer));
}
serial_send_data(buffer);
offset = count;
}
}
catch (Exception ex)
{
this.BeginInvoke((EventHandler)(delegate
{
serial_send_stop();
MessageBoxEx.Show(this, ex.Message, "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}));
}
finally
{
file_reader.Close();
file_thread = null;
this.BeginInvoke((EventHandler)(delegate
{
if (!chk_pack_loop.Checked)
{
btn_show_send.Text = "发送";
}
}));
}
}
private void serial_send_text(string text)
{
byte[] buffer_tmp;
List<byte> buffer = new List<byte>();
try
{
if (chk_pack_head.Checked)
{
if (chk_send_hex.Checked)
{
buffer.AddRange(hex_to_byte(txt_pack_head.Text));
}
else
{
buffer.AddRange(Encoding.Default.GetBytes(txt_pack_head.Text));
}
}
if (chk_send_hex.Checked)
{
buffer_tmp = hex_to_byte(text);
}
else
{
buffer_tmp = Encoding.Default.GetBytes(text);
}
buffer.AddRange(buffer_tmp);
if (chk_pack_check.Checked)
{
byte[] check_buffer;
byte byte_tmp;
int check_type = 0;
this.Invoke((EventHandler)(delegate
{
check_type = cbo_pack_check.SelectedIndex;
}));
switch (check_type)
{
case 0: // XOR异或校验
check_buffer = calc_xor(buffer_tmp);
buffer.AddRange(check_buffer);
break;
case 1: // SUM8校验
check_buffer = calc_sum_16(buffer_tmp);
buffer.Add(check_buffer[0]);
break;
case 2: // ModBusLRC校验
check_buffer = calc_sum_16(buffer_tmp);
buffer.AddRange(new byte[] { (byte)(-check_buffer[0]) });
break;
case 3: // CRC16低字节在前
check_buffer = calc_crc_16(0x1021, buffer_tmp);
buffer.AddRange(check_buffer);
break;
case 4: // CRC16高字节在前
check_buffer = calc_crc_16(0x1021, buffer_tmp);
byte_tmp = check_buffer[0];
check_buffer[0] = check_buffer[1];
check_buffer[1] = byte_tmp;
buffer.AddRange(check_buffer);
break;
case 5: // SUM16校验和低字节在前
check_buffer = calc_sum_16(buffer_tmp);
buffer.AddRange(check_buffer);
break;
case 6: // SUM16校验和高字节在前
check_buffer = calc_sum_16(buffer_tmp);
byte_tmp = check_buffer[0];
check_buffer[0] = check_buffer[1];
check_buffer[1] = byte_tmp;
buffer.AddRange(check_buffer);
break;
case 7: // ModBusCRC低字节在前
check_buffer = calc_modbus_crc(buffer_tmp);
buffer.AddRange(check_buffer);
break;
case 8: // ModBusCRC高字节在前
check_buffer = calc_modbus_crc(buffer_tmp);
byte_tmp = check_buffer[0];
check_buffer[0] = check_buffer[1];
check_buffer[1] = byte_tmp;
buffer.AddRange(check_buffer);
break;
}
}
if (chk_pack_end.Checked)
{
if (chk_send_hex.Checked)
{
buffer.AddRange(hex_to_byte(txt_pack_end.Text));
}
else
{
buffer.AddRange(Encoding.Default.GetBytes(txt_pack_end.Text));
}
}
serial_send_data(buffer.ToArray());
}
catch (Exception ex)
{
this.BeginInvoke((EventHandler)(delegate
{
serial_send_stop();
MessageBoxEx.Show(this, ex.Message, "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}));
}
}
private int lua_read(ILuaState state)
{
if (read_buffer.Count() > 0)
{
state.PushBoolean(true);
state.PushInteger(read_buffer.Dequeue());
}
else
{
state.PushBoolean(false);
state.PushInteger(0);
}
return 2;
}
private int lua_write(ILuaState state)
{
int n_tmp = state.L_CheckInteger(1);
byte[] buffer = { (byte)n_tmp };
try
{
serial_send_data(buffer);
}
catch (Exception ex)
{
this.BeginInvoke((EventHandler)(delegate
{
serial_send_stop();
MessageBoxEx.Show(this, ex.Message, "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}));
}
return 0;
}
private int lua_send(ILuaState state)
{
string text = state.L_CheckString(1);
serial_send_text(text);
return 0;
}
private int lua_sleep(ILuaState state)
{
int timeout = state.L_CheckInteger(1);
System.Threading.Thread.Sleep(timeout);
return 0;
}
private int lua_show(ILuaState state)
{
string text = state.L_CheckString(1);
this.Invoke((EventHandler)(delegate
{
txt_show_recv.AppendText(text);
}));
return 0;
}
private int lua_help(ILuaState state)
{
this.Invoke((EventHandler)(delegate
{
txt_show_recv.AppendText("///////////////////////////////////////////////" "\r\n");
txt_show_recv.AppendText("valid,value read(void);" "\r\n");
txt_show_recv.AppendText("void write(int value);" "\r\n");
txt_show_recv.AppendText("void send(string text);" "\r\n");
txt_show_recv.AppendText("void sleep(int timeout);" "\r\n");
txt_show_recv.AppendText("void show(string text);" "\r\n");
txt_show_recv.AppendText("void help();" "\r\n");
txt_show_recv.AppendText("///////////////////////////////////////////////" "\r\n");
}));
return 0;
}
private void send_lua_thread()
{
try
{
var status = lua.L_DoString(txt_show_send.Text);
if (status != ThreadStatus.LUA_OK)
{
throw new Exception(lua.ToString(-1));
}
}
catch (Exception ex)
{
if (!_lua_should_stop)
{
this.BeginInvoke((EventHandler)(delegate
{
serial_send_stop();
MessageBoxEx.Show(this, ex.Message, "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}));
}
}
finally
{
lua_thread = null;
if (!_lua_should_stop)
{
this.BeginInvoke((EventHandler)(delegate
{
if (!chk_pack_loop.Checked)
{
btn_show_send.Text = "发送";
}
}));
}
}
}
private void serial_send_start()
{
try
{
if (chk_send_lua.Checked)
{
if (lua_thread == null)
{
lua_thread = new System.Threading.Thread(send_lua_thread);
_lua_should_stop = false;
lua_thread.Start();
if (!chk_pack_loop.Checked)
{
btn_show_send.Text = "停止";
}
}
}
else if (chk_send_file.Checked)
{
if (file_thread == null)
{
file_thread = new System.Threading.Thread(send_file_thread);
_file_should_stop = false;
file_thread.Start();
if (!chk_pack_loop.Checked)
{
btn_show_send.Text = "停止";
}
}
}
else
{
serial_send_text(txt_show_send.Text);
if (chk_send_clear.Checked)
{
txt_show_send.Clear();
}
}
}
catch (Exception ex)
{
serial_send_stop();
MessageBoxEx.Show(this, ex.Message, "消息", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
private void send_loop_start()
{
loop_timer.Enabled = true;
btn_show_send.Text = "停止";
}
private void send_loop_stop()
{
if (lua_thread != null)
{
_lua_should_stop = true;
lua_thread.Abort();
while (lua_thread != null)
{
Application.DoEvents();
}
btn_show_send.Text = "发送";
}
else if (file_thread != null)
{
while (file_thread != null)
{
_file_should_stop = true;
Application.DoEvents();
}
}
loop_timer.Enabled = false;
btn_show_send.Text = "发送";
}
private bool serial_send_stop()
{
if (loop_timer.Enabled)
{
send_loop_stop();
return true;
}
else if (lua_thread != null)
{
_lua_should_stop = true;
lua_thread.Abort();
while (lua_thread != null)
{
Application.DoEvents();
}
btn_show_send.Text = "发送";
return true;
}
else if (file_thread != null)
{
while (file_thread != null)
{
_file_should_stop = true;
Application.DoEvents();
}
return true;
}
read_buffer.Clear();
return false;
}
private void btn_show_send_Click(object sender, EventArgs e)
{
if (!serial_send_stop())
{
if (chk_pack_loop.Checked)
{
send_loop_start();
}
serial_send_start();
}
}
private void chk_pack_loop_CheckedChanged(object sender, EventArgs e)
{
if (chk_pack_loop.Checked)
{
num_pack_loop.Enabled = false;
loop_timer.Interval = (int)num_pack_loop.Value;
}
else
{
send_loop_stop();
num_pack_loop.Enabled = true;
}
}
private void chk_recv_file_CheckedChanged(object sender, EventArgs e)
{
if (chk_recv_file.Checked)
{
SaveFileDialog fileDialog = new SaveFileDialog();
fileDialog.Title = "接收转向文件...";
fileDialog.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
recv_file_path = fileDialog.FileName;
}
else
{
chk_recv_file.Checked = false;
}
}
if (chk_recv_file.Checked)
{
txt_show_recv.Text = "文件路径: \"" recv_file_path "\"";
txt_show_recv.BackColor = System.Drawing.SystemColors.Control;
}
else
{
txt_show_recv.Clear();
txt_show_recv.BackColor = System.Drawing.SystemColors.Window;
}
_recv_file = chk_recv_file.Checked;
}
private void chk_send_file_CheckedChanged(object sender, EventArgs e)
{
if (chk_send_file.Checked)
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Title = "发送文件数据...";
fileDialog.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
send_file_path = fileDialog.FileName;
}
else
{
chk_send_file.Checked = false;
}
}
if (chk_send_file.Checked)
{
txt_show_send.Text = "文件路径: \"" send_file_path "\"\r\n" "文件长度: " new FileInfo(send_file_path).Length.ToString() "字节";
txt_show_send.ReadOnly = true;
chk_send_lua.Enabled = false;
chk_send_lua.Checked = false;
}
else
{
chk_send_lua.Enabled = true;
txt_show_send.Clear();
txt_show_send.ReadOnly = false;
if (file_thread != null)
{
while (file_thread != null)
{
_file_should_stop = true;
Application.DoEvents();
}
}
}
}
private void slab_info_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("http://www.mysoow.com"); // 在浏览器中打开链接
}
private void lbl_recv_save_Click(object sender, EventArgs e)
{
SaveFileDialog fileDialog = new SaveFileDialog();
fileDialog.Title = "保存数据";
fileDialog.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
File.WriteAllText(fileDialog.FileName, txt_show_recv.Text);
}
}
private void lbl_send_load_Click(object sender, EventArgs e)
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Title = "载入数据";
fileDialog.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
chk_send_file.Checked = false;
txt_show_send.Text = File.ReadAllText(fileDialog.FileName);
}
}
private void config_load()
{
config.Reload();
cbo_port_name.Text = config.cbo_port_name;
cbo_port_baud_rate.Text = config.cbo_port_baud_rate;
cbo_port_parity.Text = config.cbo_port_parity;
cbo_port_data_bits.Text = config.cbo_port_data_bits;
cbo_port_stop_bits.Text = config.cbo_port_stop_bits;
chk_recv_time.Checked = config.chk_recv_time;
chk_recv_hex.Checked = config.chk_recv_hex;
chk_send_show.Checked = config.chk_send_show;
chk_recv_show.Checked = config.chk_recv_show;
chk_send_clear.Checked = config.chk_send_clear;
chk_send_hex.Checked = config.chk_send_hex;
chk_send_lua.Checked = config.chk_send_lua;
chk_pack_head.Checked = config.chk_pack_head;
txt_pack_head.Text = config.txt_pack_head;
chk_pack_check.Checked = config.chk_pack_check;
cbo_pack_check.Text = config.cbo_pack_check;
chk_pack_end.Checked = config.chk_pack_end;
txt_pack_end.Text = config.txt_pack_end;
num_pack_loop.Value = config.num_pack_loop;
chk_pack_loop.Checked = config.chk_pack_loop;
spc_back.Panel1Collapsed = config.chk_show_left;
spc_show.Panel2Collapsed = config.chk_show_down;
txt_show_send.Text = config.txt_show_send;
}
private void config_save()
{
config.cbo_port_name = cbo_port_name.Text;
config.cbo_port_baud_rate = cbo_port_baud_rate.Text;
config.cbo_port_parity = cbo_port_parity.Text;
config.cbo_port_data_bits = cbo_port_data_bits.Text;
config.cbo_port_stop_bits = cbo_port_stop_bits.Text;
config.chk_recv_time = chk_recv_time.Checked;
config.chk_recv_hex = chk_recv_hex.Checked;
config.chk_send_show = chk_send_show.Checked;
config.chk_recv_show = chk_recv_show.Checked;
config.chk_send_clear = chk_send_clear.Checked;
config.chk_send_hex = chk_send_hex.Checked;
config.chk_send_lua = chk_send_lua.Checked;
config.chk_pack_head = chk_pack_head.Checked;
config.txt_pack_head = txt_pack_head.Text;
config.chk_pack_check = chk_pack_check.Checked;
config.cbo_pack_check = cbo_pack_check.Text;
config.chk_pack_end = chk_pack_end.Checked;
config.txt_pack_end = txt_pack_end.Text;
config.chk_pack_loop = chk_pack_loop.Checked;
config.num_pack_loop = num_pack_loop.Value;
config.chk_show_left = spc_back.Panel1Collapsed;
config.chk_show_down = spc_show.Panel2Collapsed;
config.txt_show_send = txt_show_send.Text;
config.Save();
}
private void frmMain_Load(object sender, EventArgs e)
{
config_load();
}
private void frmMain_FormClosed(object sender, FormClosedEventArgs e)
{
serial_send_stop();
config_save();
}
private void CopyToolStripMenuItem_Click(object sender, EventArgs e)
{
if (txt_show_recv.SelectionLength > 0)
{
Clipboard.SetText(txt_show_recv.SelectedText);
}
}
private void PasteToolStripMenuItem_Click(object sender, EventArgs e)
{
if (serial.IsOpen)
{
serial_send_data(Encoding.Default.GetBytes(Clipboard.GetText()));
}
}
private void SelectAllToolStripMenuItem_Click(object sender, EventArgs e)
{
txt_show_recv.SelectAll();
}
private void ClearToolStripMenuItem_Click(object sender, EventArgs e)
{
txt_show_recv_clear();
}
private void menu_show_recv_Opened(object sender, EventArgs e)
{
CopyToolStripMenuItem.Enabled = txt_show_recv.SelectionLength > 0;
PasteToolStripMenuItem.Enabled = Clipboard.ContainsText();
SelectAllToolStripMenuItem.Enabled = txt_show_recv.SelectionLength < txt_show_recv.Text.Length;
ClearToolStripMenuItem.Enabled = txt_show_recv.TextLength > 0;
}
private void lbl_hide_left_Click(object sender, EventArgs e)
{
spc_back.Panel1Collapsed = !spc_back.Panel1Collapsed;
}
private void lbl_hide_left_MouseEnter(object sender, EventArgs e)
{
lbl_hide_left.Image = spc_back.Panel1Collapsed ? Properties.Resources.right : Properties.Resources.left;
}
private void lbl_hide_left_MouseLeave(object sender, EventArgs e)
{
lbl_hide_left.Image = null;
}
private void lbl_hide_down_Click(object sender, EventArgs e)
{
spc_show.Panel2Collapsed = !spc_show.Panel2Collapsed;
}
private void lbl_hide_down_MouseEnter(object sender, EventArgs e)
{
lbl_hide_down.Image = spc_show.Panel2Collapsed ? Properties.Resources.up : Properties.Resources.down;
}
private void lbl_hide_down_MouseLeave(object sender, EventArgs e)
{
lbl_hide_down.Image = null;
}
}
}
好例子网口号:伸出你的我的手 — 分享!
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论