110,533
社区成员
发帖
与我相关
我的任务
分享
/// <summary>
/// 打开串口,返回true则成功打开
/// </summary>
/// <returns></returns>
public bool Open()
{
if (comPort.IsOpen)
comPort.Close();
try
{
comPort.Open();
}
catch (Exception ex)
{
throw ex;
}
return comPort.IsOpen;
}
/// <summary>
/// 关闭串口,如果返回false,则已关闭
/// </summary>
/// <returns></returns>
public bool CloseComport()
{
try
{
if (comPort.IsOpen)
comPort.Close();
}
catch (Exception ex)
{
throw ex;
}
return comPort.IsOpen;
}
//打开串口事件
comPort = new SerialPort(cmbPort.Text, baudRate, tempParity, dataBits, StopBits.One);
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
comPort.Encoding = myEncode;
if (this.Open())
{
SetTsslMsg("指定串口已打开!");
}
//关闭相关事件和方法
private void btnClose_Click(object sender, EventArgs e)
{
if (!this.CloseComport())
{
SetTsslMsg("串口关闭成功!");
button1.Enabled = true;
}
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
//comPort_DataReceived串口接收事件
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//读取串口中一个字节的数据
this.Invoke(
//在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate)
//即在textBox_ReceiveDate控件的父窗口form中执行委托.
new MethodInvoker(
/*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/
delegate
{
/*匿名方法, */
//// txtMsg.AppendText(comPort.ReadBufferSize.ToString() + "\r\n");
List<byte> bytData = new List<byte>();
byte[] readBuffer = new byte[comPort.ReadBufferSize + 1];
int count = comPort.Read(readBuffer, 0, comPort.ReadBufferSize);
string msgRec = myEncode.GetString(readBuffer, 0, count);
BaseTools.WriteToLog("LIS端接收到信息:" + msgRec);
if (mycomm.IsOpen)
{
mycomm.Close();
Dispose();//清除资源
richTextBox1.Text += "断开端口成功\n";
// MessageBox.Show("断开端口成功");
}