1.获取本机串口
string[] sps = SerialPort.GetPortNames();
ComBoxSel.Items.AddRange(sps);//ComboBox控件
2.打开打开串口
private SerialPort serial = new SerialPort();
/// <summary>
/// 1为开启串口成功,0为因其它因素导致开启失败
/// </summary>
/// <returns></returns>
public int isPort()
{
string port = this.ComBoxSel.Text.Trim().ToString();
try
{
serial = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);//(端口名称,波特率,数据位,停止位,超时时间)
//serial.Handshake = Handshake.RequestToSendXOnXOff;
serial.Encoding = Encoding.UTF8;
serial.Open();
//窗体上加一个serialPort控件
serial.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived);//接收串口返回的数据,串口返回数据自动进来(serialPort控件的事件)
return 1;
}
catch (Exception)
{
return 0;
throw;
}
}
3.发送指令
private byte[] shuChu0 = { 0x00, 0x5A, 0x53, 0x00, 0x08, 0x01, 0x00, 0x00, 0xB6 };//指令例子
/// <summary>
/// 此函数将编码后的消息传递给串口
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public bool SendData(byte[] data, int offset, int count)
{
if (serial.IsOpen)//再次判断串口是否已经打开
{
try
{
//将消息传递给串口
serial.Write(shuChu0, 0, shuChu0.length);//传数据到串口
return true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "发送失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else
{
MessageBox.Show("串口未开启", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
return false;
}
4.接收串口发回的数据
//窗体serialPort控件中的事件
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
Thread.Sleep(20);
int nRead = serial.BytesToRead;
byte[] data = new byte[nRead];
nRead = serial.Read(data, 0, nRead);
lock (m_buffer)
{
m_buffer.AddRange(data);
}
if (data.Length >= 9)
{
AddData(data);
}
}
}
/// <summary>
/// 解码过程
/// </summary>
/// <param name="data"></param>
public void AddData(byte[] data)
{
StringBuilder sb = new StringBuilder();
if (data.Length > 9)
{
for (int i = 0; i < 9; i++)
{
sb.AppendFormat("{0:x2}" + " ", data[i]);
}
AddContent(sb.ToString());
}
else
{
for (int i = 0; i < data.Length; i++)
{
sb.AppendFormat("{0:x2}" + " ", data[i]);
}
AddContent(sb.ToString());//sb.ToString() 就是接收回来的十六进制数据
}
}