|
楼主 |
发表于 2024-3-8 23:47:32
|
显示全部楼层
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.IO.Ports;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace 串口数据显示
{
public partial class Form1 : Form
{
private SerialPort serialPort = null;
private bool isSerialPortOpen = false;
public Form1()
{
InitializeComponent();
this.comboBox1.DropDown += new System.EventHandler(this.comboBox1_DropDown);
this.button1.Click += new System.EventHandler(this.button1_Click);
this.button2.Click += new System.EventHandler(this.button2_Click);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);
}
private void comboBox1_DropDown(object sender, EventArgs e)
{
string[] ports = SerialPort.GetPortNames();
comboBox1.Items.Clear();
foreach (string port in ports)
{
comboBox1.Items.Add(port);
}
if (comboBox1.Items.Count > 0)
{
comboBox1.SelectedIndex = 0;
}
}
private void button1_Click(object sender, EventArgs e)
{
if (isSerialPortOpen)
{
// 如果串口已打开,则关闭串口
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
serialPort.Dispose();
}
isSerialPortOpen = false;
button1.Text = "打开";
}
else
{
// 如果串口未打开,则打开串口
try
{
if (serialPort == null)
{
serialPort = new SerialPort();
}
if (!serialPort.IsOpen && comboBox1.SelectedItem != null)
{
serialPort.PortName = comboBox1.SelectedItem.ToString();
serialPort.BaudRate = 115200;
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.One;
serialPort.DataBits = 8;
serialPort.Handshake = Handshake.None;
serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
serialPort.Open();
isSerialPortOpen = true;
button1.Text = "关闭";
}
else
{
MessageBox.Show("请选择一个串口或串口已经打开");
}
}
catch (Exception ex)
{
MessageBox.Show("打开串口时出错: " + ex.Message);
if (serialPort != null)
{
serialPort.Close();
serialPort.Dispose();
}
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
serialPort.Dispose();
}
}
private void button3_Click(object sender, EventArgs e)
{
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
textBox4.Clear();
textBox5.Clear();
}
private void button4_Click(object sender, EventArgs e)
{
if (isSerialPortOpen)
{
try
{
// 定义要发送的16进制数据
byte[] sendData = { 0xFF, 0x99, 0x01, 0x00, 0x9A, 0xFE };
// 将发送的字节数组转换为字符串,方便显示在textBox1中
string sendStr = BitConverter.ToString(sendData).Replace("-", " ");
// 在textBox1中显示发送的数据
textBox1.AppendText("发送数据: " + sendStr + "\r\n");
// 通过串口发送数据
serialPort.Write(sendData, 0, sendData.Length);
}
catch (Exception ex)
{
// 显示发送数据时发生的错误
MessageBox.Show("发送数据时出错: " + ex.Message);
}
}
else
{
// 如果串口未打开,则提示用户先打开串口
MessageBox.Show("请先打开串口");
}
}
private void button5_Click(object sender, EventArgs e)
{
if (isSerialPortOpen)
{
try
{
// 定义要发送的16进制数据
byte[] sendData = { 0xFF, 0x33, 0x01, 0x00, 0x34, 0xFE };
// 将发送的字节数组转换为字符串,方便显示在textBox1中
string sendStr = BitConverter.ToString(sendData).Replace("-", " ");
// 在textBox1中显示发送的数据
textBox1.AppendText("发送数据: " + sendStr + "\r\n");
// 通过串口发送数据
serialPort.Write(sendData, 0, sendData.Length);
}
catch (Exception ex)
{
// 显示发送数据时发生的错误
MessageBox.Show("发送数据时出错: " + ex.Message);
}
}
else
{
// 如果串口未打开,则提示用户先打开串口
MessageBox.Show("请先打开串口");
}
}
private void button6_Click(object sender, EventArgs e)
{
if (isSerialPortOpen)
{
try
{
// 定义要发送的16进制数据
byte[] sendData = { 0xFF, 0x99, 0x02, 0x00, 0x9B, 0xFE };
// 将发送的字节数组转换为字符串,方便显示在textBox1中
string sendStr = BitConverter.ToString(sendData).Replace("-", " ");
// 在textBox1中显示发送的数据
textBox1.AppendText("发送数据: " + sendStr + "\r\n");
// 通过串口发送数据
serialPort.Write(sendData, 0, sendData.Length);
}
catch (Exception ex)
{
// 显示发送数据时发生的错误
MessageBox.Show("发送数据时出错: " + ex.Message);
}
}
else
{
// 如果串口未打开,则提示用户先打开串口
MessageBox.Show("请先打开串口");
}
}
private void button7_Click(object sender, EventArgs e)
{
if (isSerialPortOpen)
{
try
{
// 定义要发送的16进制数据
byte[] sendData = { 0xFF, 0x33, 0x02, 0x00, 0x35, 0xFE };
// 将发送的字节数组转换为字符串,方便显示在textBox1中
string sendStr = BitConverter.ToString(sendData).Replace("-", " ");
// 在textBox1中显示发送的数据
textBox1.AppendText("发送数据: " + sendStr + "\r\n");
// 通过串口发送数据
serialPort.Write(sendData, 0, sendData.Length);
}
catch (Exception ex)
{
// 显示发送数据时发生的错误
MessageBox.Show("发送数据时出错: " + ex.Message);
}
}
else
{
// 如果串口未打开,则提示用户先打开串口
MessageBox.Show("请先打开串口");
}
}
// 定义 DataReceivedHandler 方法
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
if (indata.StartsWith(""))
{
string[] dataParts = indata.Split(' ');
if (dataParts.Length >= 5)
{
UpdateTextBoxes(dataParts);
}
}
}
// 另一个方法来更新文本框,以避免代码重复
private void UpdateTextBoxes(string[] dataParts)
{
if (textBox2.InvokeRequired)
{
textBox2.Invoke(new MethodInvoker(delegate { textBox2.Text = dataParts[1]; }));
}
else
{
textBox2.Text = dataParts[1];
}
if (textBox3.InvokeRequired)
{
textBox3.Invoke(new MethodInvoker(delegate { textBox3.Text = dataParts[2]; }));
}
else
{
textBox3.Text = dataParts[2];
}
if (textBox4.InvokeRequired)
{
textBox4.Invoke(new MethodInvoker(delegate { textBox4.Text = dataParts[3]; }));
}
else
{
textBox4.Text = dataParts[3];
}
if (textBox5.InvokeRequired)
{
textBox5.Invoke(new MethodInvoker(delegate { textBox5.Text = dataParts[4]; }));
}
else
{
textBox5.Text = dataParts[4];
}
}
private void button8_Click(object sender, EventArgs e)
{
if (isSerialPortOpen)
{
try
{
// 定义要发送的字符串
string sendStr = "*1 2050 2121 510 004 ";
// 将字符串转换为字节数组
byte[] sendData = Encoding.ASCII.GetBytes(sendStr);
// 添加发送的字符串到 textBox1 中
textBox1.AppendText(sendStr + "\r\n");
// 发送数据到串口
serialPort.Write(sendData, 0, sendData.Length);
}
catch (Exception ex)
{
MessageBox.Show("发送数据时出错: " + ex.Message);
}
}
else
{
MessageBox.Show("请先打开串口");
}
}
private void button2_Click(object sender, EventArgs e)
{
if (isSerialPortOpen)
{
try
{
// 定义要发送的字符串
string sendStr = "*1 2048 3000 525 400";
// 将字符串转换为字节数组
byte[] sendData = Encoding.ASCII.GetBytes(sendStr);
// 添加发送的字符串到 textBox1 中
textBox1.AppendText(sendStr + "\r\n");
// 发送数据到串口
serialPort.Write(sendData, 0, sendData.Length);
}
catch (Exception ex)
{
MessageBox.Show("发送数据时出错: " + ex.Message);
}
}
else
{
MessageBox.Show("请先打开串口");
}
}
}
}
@FishC 我串口发送数据的时候,我的DataReceivedHandler函数,并没有触发到。请帮我检查一下代码不合理的地方。 |
|