serialPort.RtsEnable = true;
serialPort.DtrEnable = true;
serialPort.ReceivedBytesThreshold = 1;
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialDataReceivedEvent);
把这2个enable开启, ReceivedBytesThreshold=1是有一个接收到的数据就触发
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.Threading.Tasks;
using System.Windows.Forms;
namespace SerialDemo
{
public partial class Form1 : Form
{
public SerialPort serialPort = new SerialPort();
public bool isSerialPortOpen = false;//是否已经打开了串口
List<byte> portBufferByteList = new List<byte>(1024);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
initUserCOMControl();
}
public void initUserCOMControl()
{
initSerialPort();
//初始化波特率
int[] btl = { 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200 };
for (int i = 0; i < btl.Length; i++)
{
cmbb_btl.Items.Add(btl[i]);
}
cmbb_btl.SelectedItem = 9600;
//初始化数据位
//int[] databit = { 5, 6, 7, 8 };
int[] databit = { 8 };
for (int i = 0; i < databit.Length; i++)
{
cmbb_databit.Items.Add(databit[i]);
}
cmbb_databit.SelectedItem = 8;
//初始化校验位
string[] verifybit = { "None", "Odd", "Even" };
for (int i = 0; i < verifybit.Length; i++)
{
cmbb_verifybit.Items.Add(verifybit[i]);
}
cmbb_verifybit.SelectedItem = "None";
//初始化停止位
float[] stopbit = { 1, 1.5f, 2 };
for (int i = 0; i < stopbit.Length; i++)
{
cmbb_stopbit.Items.Add(stopbit[i]);
}
cmbb_stopbit.SelectedItem = 1f;//用1f,而不能用1
}
private void initSerialPort()
{
try
{
string[] portNames = SerialPort.GetPortNames();
for (int i = 0; i < portNames.Length; i++)
{
cmbb_port.Items.Add(portNames[i]);
}
if (portNames != null && portNames.Length > 0)
{
cmbb_port.SelectedItem = portNames[0];
}
}
catch (Exception e)
{
MessageBox.Show("初始化串口端口异常:" + e.Message);
}
}
/// <summary>
/// 打开串口
/// </summary>
private void openSerialPort()
{
if (cmbb_port.Text.Trim().Equals(""))
{
MessageBox.Show("请选择串口端口");
return;
}
serialPort.PortName = cmbb_port.Text.Trim(); //端口名称
serialPort.BaudRate = Int32.Parse(cmbb_btl.Text); //波特率
if (cmbb_verifybit.Text.Trim().Equals("None"))
{
serialPort.Parity = Parity.None;//奇数偶数校验位
}
else if (cmbb_verifybit.Text.Trim().Equals("Odd"))
{
serialPort.Parity = Parity.Odd;//奇数偶数校验位
}
else if (cmbb_verifybit.Text.Trim().Equals("Even"))
{
serialPort.Parity = Parity.Even;//奇数偶数校验位
}
serialPort.DataBits = Int32.Parse(cmbb_databit.Text.Trim());//标准数据位长度
if (cmbb_stopbit.Text.Trim().Equals("1"))
{
serialPort.StopBits = StopBits.One;//标准停止位数
}
else if (cmbb_stopbit.Text.Trim().Equals("1.5"))
{
serialPort.StopBits = StopBits.OnePointFive;
}
else if (cmbb_stopbit.Text.Trim().Equals("2"))
{
serialPort.StopBits = StopBits.Two;
}
serialPort.ReceivedBytesThreshold = 1;
serialPort.ReadBufferSize = 1024;
serialPort.WriteTimeout = 3000;
serialPort.ReadTimeout = 3000;
serialPort.RtsEnable = true;
serialPort.DtrEnable = true;
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialDataReceivedEvent);
serialPort.Open();
}
/// <summary>
/// 关闭串口
/// </summary>
private void closeSerialPort()
{
if (serialPort != null && serialPort.IsOpen)
{
serialPort.Close();
}
}
/// <summary>
/// 串口接收到数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void serialDataReceivedEvent(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
try
{
do
{
int count = port.BytesToRead;
if (count <= 0) break;
byte[] bytebuffer = new byte[count];//serialport读取串口数据
port.Read(bytebuffer, 0, bytebuffer.Length);//串口读取到数据
Console.WriteLine("接收到的数据");
writeConsole(bytebuffer);
addByteToByteList(bytebuffer);
} while (port.BytesToRead > 0);
Console.WriteLine("接收完毕处理");
receiveFinishDoWith();
}
catch (Exception ex)
{
}
//var com = sender as SerialPort;
//var lst = new List<byte>();
//if (com != null)
//{
// lock (com)
// {
// do
// {
// if (com.BytesToRead == 0) break;
// int one = com.ReadByte();
// if (one >= 0 && one < 256) lst.Add(Convert.ToByte(one));
// } while (one >= 0 && one < 256);
// // lst.ToArray(); // get bytes
// }
// // ... // do something with received data
//}
//SerialPort port = (SerialPort)sender;
//byte[] bytebuffer = new byte[port.BytesToRead];//serialport读取串口数据
//port.Read(bytebuffer, 0, bytebuffer.Length);//串口读取到数据
//try
//{
// lock (this)
// {
// writeConsole(bytebuffer);
// }
//}
//catch (Exception ex)
//{
// MessageBox.Show("接口串口数据失败" + ex.Message);
//}
}
private void receiveFinishDoWith() {
try
{
if (checkRecvData()) {
byte[] buffer = portBufferByteList.ToArray();
writeConsole(buffer);
delByteToByteList(buffer);
}
}
catch (Exception ex) {
Console.WriteLine("receiveFinishDoWith"+ex.Message);
}
}
private void btn_openserial_Click(object sender, EventArgs e)
{
if (btn_openserial.Text.Trim().Equals("打开串口"))
{
try
{
openSerialPort();
btn_openserial.Text = "关闭串口";
isSerialPortOpen = true;
}
catch (Exception ex)
{
MessageBox.Show("打开端口失败,请确认改端口是否已经被使用");
isSerialPortOpen = false;
}
}
else if (btn_openserial.Text.Trim().Equals("关闭串口"))
{
try
{
closeSerialPort();
btn_openserial.Text = "打开串口";
isSerialPortOpen = false;
}
catch (Exception ex)
{
MessageBox.Show("关闭端口失败,请确认改端口是否被打开");
isSerialPortOpen = true;
}
}
}
private void btn_send_fs_zigbee_Click(object sender, EventArgs e)
{
string strCmd = "FE 01 21 2B 00 0B";
byte[] cmdBytes = ByteCalculator.stringCmdConvertBytes(strCmd);
serialPort.Write(cmdBytes, 0, cmdBytes.Length);
Console.WriteLine("数据已发送");
}
private void writeConsole(byte[] buffer)
{
Console.WriteLine(ByteCalculator.ByteToHexStr(buffer));
}
private void addByteToByteList(byte[] buffer)
{
portBufferByteList.AddRange(buffer);
}
private void delByteToByteList(byte[] buffer)
{
portBufferByteList.RemoveRange(0, buffer.Length);
}
public static bool checkSumFEBufferData(byte[] buffer)
{
if (buffer[0] == 0XFE)
{
if ((buffer[1] + 5) <= buffer.Length)
{
int length = buffer[1] + 5;
byte[] buffer2 = new byte[length];
Array.Copy(buffer, 0, buffer2, 0, length);
return checkSumXOR(buffer2);
}
}
return false;
}
private bool checkRecvData()
{
byte[] tmp = portBufferByteList.ToArray();
if (tmp[0] == 0xFE)
{
if (tmp.Length > 1)
{
return checkSumFEBufferData(tmp);
}
return false;
}
else
{//不是7E开头则删除
delByteToByteList(tmp);
return false;
}
}
public static bool checkSumXOR(byte[] buffer)
{
// buffer 是收到的所有数据FE开头
byte[] feData = getFEData(buffer);
byte[] validData = new byte[feData.Length - 2];
Array.Copy(feData, 1, validData, 0, validData.Length);
byte check = ByteCalculator.checkSumXOR(validData);
if (check == buffer[buffer.Length - 1])
{
return true;
}
return false;
}
public static byte[] getFEData(byte[] buffer)
{
int length = buffer[1];
List<byte> portBufferByteList = new List<byte>(1024);
portBufferByteList.AddRange(buffer);
byte[] buffer2 = new byte[length + 5];
portBufferByteList.CopyTo(0, buffer2, 0, buffer2.Length);
return buffer2;
}
}
}