通过代理接收,实现串口通信
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using static Userlogin.UserManager; //空间.类
//本窗体的难度在于如何把数据送到主窗体中。
//设置好配置以后,点击“保存”,通过委托的方式,把SerialportConfigure这个集合送到主页面
//也可以把这个SerialportConfigure集合序列到一个文件中,保存后,通知主页
//主页再反序列化获得串口配置
//在FORM4建立委托
namespace ABS测试台
{
public partial class Form4 : Form
{
public delegate void ShowMessageService(string text);//定义一个委托
public MyDelegate showMessageChild;
public string SerialPortRxdata;
public string SerialPortTxdata;
public const int WM_DEVICE_CHANGE = 0x219; //设备改变
public const int DBT_DEVICEARRIVAL = 0x8000; //设备插入
public const int DBT_DEVICE_REMOVE_COMPLETE = 0x8004; //设备移除
List<SerialCongfigure> ComConfig = new List<SerialCongfigure>
{
new SerialCongfigure(){ },
};
//获取串口号
private bool SearchSerialComm(System.IO.Ports.SerialPort MySerialPort, ListBox mycombobox)
{
#if (false)
//这个部分的代码有个问题,不能根本上支持热插拔,拔出以后
//导致出问题,这个代码作为演示,或者可以
mycombobox.Items.Clear();
for (int i = 1; i < 20; i++)
{
try
{
MySerialPort.PortName = "COM" + i.ToString();
MySerialPort.Open();
mycombobox.Items.Add(MySerialPort.PortName);
MySerialPort.Close();
}
catch { }
}
#else
mycombobox.SelectedIndex = -1;
mycombobox.Items.Clear();
string[] serial_list = SerialPort.GetPortNames();
if (serial_list.Length > 0)
{
Array.Sort(serial_list);
mycombobox.Items.AddRange(serial_list);
mycombobox.SelectedIndex = 0;
return true;
}
else { return false; }
#endif
}
public Form4()
{
InitializeComponent();
listBox1.SelectedIndex = 0;
listBox2.SelectedIndex = 0;
listBox3.SelectedIndex = 0;
listBox4.SelectedIndex = 0;
listBox5.SelectedIndex = 0;
listBox6.SelectedIndex = 0;
}
private void test_Load(object sender, EventArgs e)
{
//this.WindowState = FormWindowState.Maximized;//子窗体最大化
this.FormBorderStyle = FormBorderStyle.None;//
//Serial
//this.serialPort2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort2_DataReceived);
// serialPort2.DataReceived += SerialDataReceivedEventHandler();
if (SearchSerialComm(serialPort2, listBox1))//获取当前可用的端口号到LISTBOX1,如果没有,提示“当前没有串口可用”
{
//启动委托线程
serialPort2.Encoding = Encoding.GetEncoding("GB2312");
bAccpet = true;
getRecevice = new Thread(new ThreadStart(testDelegate));
//getRecevice.IsBackground = true;
getRecevice.Start();
}
else
{
MessageBox.Show("没有可用的串口!");
}
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
}
//退出
private void button3_Click(object sender, EventArgs e)
{
bAccpet = false;
try
{ //停止主监听线程
if (null != getRecevice)
{
if (getRecevice.IsAlive)
{
if (!getRecevice.Join(100))
{
//关闭线程
getRecevice.Abort();
}
}
getRecevice = null;
}
}
catch { }
serialPort2.Close();//关闭
this.Close();
this.Dispose();
}
//保存
private void button2_Click(object sender, EventArgs e)
{
//把面板上的数据全部获取到SerialPortConfigure
ComConfig[0].PortName = listBox1.Text; //获取当前的可用的串口号
ComConfig[0].DataRate = listBox2.Text;
ComConfig[0].ByteCount = listBox3.Text;
ComConfig[0].CrcCheck = listBox4.Text;
ComConfig[0].StopBitCount = listBox5.Text;
ComConfig[0].StreamControl = listBox6.Text;
//把配置序列化到serial_configure.ins文件中
if (File.Exists(@"d:\C#\SerialConfigure.ins") == false) File.Delete(@"d:\C#\SerialConfigure.ins");
using (FileStream fs = new FileStream(@"d:\C#\SerialConfigure.ins", FileMode.Create, FileAccess.Write))
{
BinaryFormatter Format = new BinaryFormatter();
Format.Serialize(fs, ComConfig);//把listuser序列化到pwd.ins文件中
fs.Close();
}
//再反序列化读出到comconfig
if (File.Exists(@"d:\C#\SerialConfigure.ins") == true )
{
try
{
using (FileStream fs = new FileStream(@"d:\C#\SerialConfigure.ins", FileMode.Open, FileAccess.Read))
{
BinaryFormatter Format = new BinaryFormatter();
ComConfig = (List<SerialCongfigure>)Format.Deserialize(fs);
MessageBox.Show("SerialConfigure反序列化测试完成");//弹出对话框,等待用户确认
fs.Close();
}
}
catch (Exception)
{
MessageBox.Show("SerialConfigure文件读取存在异常");
}
}
//输出在发射区
textBox1.Text += ComConfig[0].PortName;
textBox1.Text += "\r\n";//换行
textBox1.Text += ComConfig[0].DataRate;
textBox1.Text += "\r\n";//换行
textBox1.Text += ComConfig[0].ByteCount;
textBox1.Text += "\r\n";//换行
textBox1.Text += ComConfig[0].CrcCheck;
textBox1.Text += "\r\n";//换行
textBox1.Text += ComConfig[0].StopBitCount;
textBox1.Text += "\r\n";//换行
textBox1.Text += ComConfig[0].StreamControl;
//通知主窗体,通信设置完成,有必要吗,没有必要!!!
//按照配置打开串口
try
{
if (serialPort2.IsOpen == false)
{
serialPort2.BaudRate = 38400;
serialPort2.PortName = ComConfig[0].PortName ;
serialPort2.Open();
MessageBox.Show("串口已经打开");
}
else
{
serialPort2.Close ();
serialPort2.BaudRate = 38400;
serialPort2.PortName = ComConfig[0].PortName ;
serialPort2.Open();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
this.BeginInvoke(showMessageChild, "serialconfigure saved");//通知主页配置成功
//提示保存成功,发送数据到主页,提示设置完成,主页反序列化获得数据
DialogResult dr = MessageBox.Show("保存成功");//弹出对话框,等待用户确认
//if (dr == DialogResult.OK) this.Close();
}
//发送
private void button1_Click(object sender, EventArgs e)
{
byte[] Txdata=new byte[10];
if (serialPort2.IsOpen == true)
{
Txdata[0] = 0x90;
try
{
serialPort2 .Encoding = System.Text.Encoding.GetEncoding("GB2312");
SerialPortTxdata = textBox1.Text;
serialPort2.Write(textBox1.Text);
//serialPort2.Write(Txdata ,0,10);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("串口未打开", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
// if (this.textBox1.InvokeRequired) MessageBox.Show("被其他线程暂用");
// else MessageBox.Show("没有被其他线程暂用");
}
//接收这个是在后台一直保持运行的
private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//byte[] Buffer = new byte[10];
//serialPort2.Read(Buffer ,0, serialPort2.ReadBufferSize);
}
bool bAccpet = false;
private Thread getRecevice;
string strRecieve;
delegate void DelegateAcceptData();
delegate void reaction();
private void testDelegate()
{
reaction r = new reaction(fun);
r();
}
void fun()
{
while (bAccpet)
{
AcceptData();
}
}
void AcceptData()
{
if (textBox2.InvokeRequired)
{
try
{
DelegateAcceptData ddd = new DelegateAcceptData(AcceptData);
this.Invoke(ddd, new object[] { });
}
catch { }
}
else
{
try
{
strRecieve = serialPort2 .ReadExisting();
textBox2.AppendText(strRecieve);
}
catch (Exception ex) { }
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
// SearchSerialComm(serialPort2, listBox1);//获取当前可用的端口号到LISTBOX1,如果没有,提示“当前没有串口可用”
ComConfig[0].PortName = listBox1.Text; //获取当前的可用的串口号
}
private void listBox2_SelectedIndexChanged(object sender, EventArgs e)
{
ComConfig[0].DataRate = listBox2.Text;
}
private void listBox3_SelectedIndexChanged(object sender, EventArgs e)
{
ComConfig[0].ByteCount = listBox3.Text;
}
private void listBox4_SelectedIndexChanged(object sender, EventArgs e)
{
ComConfig[0].CrcCheck = listBox4.Text;
}
private void listBox5_SelectedIndexChanged(object sender, EventArgs e)
{
ComConfig[0].StopBitCount = listBox5.Text;
}
private void listBox6_SelectedIndexChanged(object sender, EventArgs e)
{
ComConfig[0].StreamControl = listBox6.Text;
}
//是否显示发送
private void checkBox6_CheckedChanged(object sender, EventArgs e)
{
ComConfig[0].IsDisplayTxDataForRx = checkBox6.Checked;
}
//是否显示时间
private void checkBox4_CheckedChanged(object sender, EventArgs e)
{
ComConfig[0].IsDisplayTimeForRx = checkBox4.Checked;
}
//显示是否换行
private void checkBox5_CheckedChanged(object sender, EventArgs e)
{
ComConfig[0].IsAutoHHForRx = checkBox5.Checked;
}
private void radioButton4_CheckedChanged(object sender, EventArgs e)
{
MessageBox.Show("radioButton4");
}
private void radioButton5_CheckedChanged(object sender, EventArgs e)
{
MessageBox.Show("radioButton5");
}
///字符串转换16进制字节数组
private byte[] StringToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0) hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Replace(" ", ""), 16);
return returnBytes;
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
}
}
浙公网安备 33010602011771号