C# 串口通信

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO.Ports;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace BXHSerialPort

{

public partial class frmSerialPort : Form

{

private SerialPort ComDevice = new SerialPort();

public frmSerialPort()

{

InitializeComponent();

this.init();

}

public void init()

{

btnSend.Enabled = false;

cbbComList.Items.AddRange(SerialPort.GetPortNames());

if (cbbComList.Items.Count > 0)

{

cbbComList.SelectedIndex = 0;

}

cbbBaudRate.SelectedIndex = 5;

cbbDataBits.SelectedIndex = 0;

cbbParity.SelectedIndex = 0;

cbbStopBits.SelectedIndex = 0;

pictureBox1.BackgroundImage = Properties.Resources.red;

ComDevice.DataReceived += new SerialDataReceivedEventHandler(Com_DataReceived);//绑定事件

}

/// <summary>

/// 打开串口

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnOpen_Click(object sender, EventArgs e)

{

if (cbbComList.Items.Count <= 0)

{

MessageBox.Show("没有发现串口,请检查线路!");

return;

}

if (ComDevice.IsOpen == false)

{

ComDevice.PortName = cbbComList.SelectedItem.ToString();

ComDevice.BaudRate = Convert.ToInt32(cbbBaudRate.SelectedItem.ToString());

ComDevice.Parity = (Parity)Convert.ToInt32(cbbParity.SelectedIndex.ToString());

ComDevice.DataBits = Convert.ToInt32(cbbDataBits.SelectedItem.ToString());

ComDevice.StopBits = (StopBits)Convert.ToInt32(cbbStopBits.SelectedItem.ToString());

try

{

ComDevice.Open();

btnSend.Enabled = true;

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

return;

}

btnOpen.Text = "关闭串口";

pictureBox1.BackgroundImage = Properties.Resources.green;

}

else

{

try

{

ComDevice.Close();

btnSend.Enabled = false;

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

btnOpen.Text = "打开串口";

pictureBox1.BackgroundImage = Properties.Resources.red;

}

cbbComList.Enabled = !ComDevice.IsOpen;

cbbBaudRate.Enabled = !ComDevice.IsOpen;

cbbParity.Enabled = !ComDevice.IsOpen;

cbbDataBits.Enabled = !ComDevice.IsOpen;

cbbStopBits.Enabled = !ComDevice.IsOpen;

}

/// <summary>

/// 关闭串口

/// </summary>

public void ClearSelf()

{

if (ComDevice.IsOpen)

{

ComDevice.Close();

}

}

/// <summary>

/// 发送数据

/// </summary>

/// <param name="sender"></param>

/// <param name="data"></param>

public bool SendData(byte[] data)

{

if (ComDevice.IsOpen)

{

try

{

ComDevice.Write(data, 0, data.Length);//发送数据

return true;

}

catch (Exception ex)

{

MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

else

{

MessageBox.Show("串口未打开", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

return false;

}

/// <summary>

/// 发送数据button事件

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnSend_Click(object sender, EventArgs e)

{

byte[] sendData = null;

if (rbtnSendHex.Checked)

{

sendData = strToHexByte(txtSendData.Text.Trim());

}

else if (rbtnSendASCII.Checked)

{

sendData = Encoding.ASCII.GetBytes(txtSendData.Text.Trim());

}

else if (rbtnSendUTF8.Checked)

{

sendData = Encoding.UTF8.GetBytes(txtSendData.Text.Trim());

}

else if (rbtnSendUnicode.Checked)

{

sendData = Encoding.Unicode.GetBytes(txtSendData.Text.Trim());

}

else

{

sendData = Encoding.ASCII.GetBytes(txtSendData.Text.Trim());

}

if (this.SendData(sendData))//发送数据成功计数

{

lblSendCount.Invoke(new MethodInvoker(delegate

{

lblSendCount.Text = (int.Parse(lblSendCount.Text) + txtSendData.Text.Length).ToString();

}));

}

else

{

}

}

/// <summary>

/// 字符串转换16进制字节数组

/// </summary>

/// <param name="hexString"></param>

/// <returns></returns>

private byte[] strToHexByte(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;

}

/// <summary>

/// 接收数据

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void Com_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

Console.WriteLine("c# b debug ");

Console.WriteLine(ComDevice.BytesToRead);

byte[] ReDatas = new byte[ComDevice.BytesToRead];

ComDevice.Read(ReDatas, 0, ReDatas.Length);//读取数据

Console.WriteLine(ReDatas.Length);

Console.WriteLine("c# end debug ");

this.AddData(ReDatas);//输出数据

}

/// <summary>

/// 添加数据

/// </summary>

/// <param name="data">字节数组</param>

public void AddData(byte[] data)

{

if (rbtnHex.Checked)

{

StringBuilder sb = new StringBuilder();

for (int i = 0; i < data.Length; i++)

{

sb.AppendFormat("{0:x2}" + " ", data[i]);

}

AddContent(sb.ToString().ToUpper());

}

else if (rbtnASCII.Checked)

{

AddContent(new ASCIIEncoding().GetString(data));

}

else if (rbtnUTF8.Checked)

{

AddContent(new UTF8Encoding().GetString(data));

}

else if (rbtnUnicode.Checked)

{

AddContent(new UnicodeEncoding().GetString(data));

}

else

{}

lblRevCount.Invoke(new MethodInvoker(delegate

{

lblRevCount.Text = (int.Parse(lblRevCount.Text) + data.Length).ToString();

}));

}

/// <summary>

/// 输入到显示区域

/// </summary>

/// <param name="content"></param>

private void AddContent(string content)

{

this.BeginInvoke(new MethodInvoker(delegate

{

if(chkAutoLine.Checked && txtShowData.Text.Length>0)

{

txtShowData.AppendText("\r\n");

}

Console.WriteLine("c# debug1");

Console.WriteLine(content);

txtShowData.AppendText(content);

}));

}

/// <summary>

/// 清空接收区

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnClearRev_Click(object sender, EventArgs e)

{

Console.WriteLine("c# debug");

txtShowData.Clear();

}

/// <summary>

/// 清空发送区

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void btnClearSend_Click(object sender, EventArgs e)

{

txtSendData.Clear();

}

}

}

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

using System.Runtime.InteropServices;

namespace BXHSerialPort

{

static class Program

{

[DllImport("kernel32.dll")]

public static extern bool AllocConsole();

[DllImport("kernel32.dll")]

static extern bool FreeConsole();

/// <summary>

/// 应用程序的主入口点。

/// </summary>

[STAThread]

static void Main()

{

AllocConsole();

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new frmSerialPort());

FreeConsole();

}

}

}

C#

https://www.bilibili.com/video/BV12b411e7Nm?p=1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值