c# serialPort
c# serialPort我想用c#编写两个串口通信显示的界面,一发一收。打开了两个串口serialPort实例,但是(serialPort1)另外一个串口发送数据,实际上没有发送成功,但是第一个serialPort实例(scomm)能够收到数据private void OpenPort()
{
//***避免串口死锁***
sComm.WriteTimeout = 1000; //写超时,如果底层串口驱动效率问题,能有效的避免死锁。
sComm.ReadTimeout = 1000; //读超时,同上。
sComm.NewLine = "\r\n"; //回车换行。
sComm.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.sComm_DataReceived); //注册事件。
//***避免串口死锁***
sComm.PortName = cmPort.Text;
sComm.BaudRate = int.Parse(cmBaudRate.Text);
sComm.DataBits = int.Parse(cmDataBit.Text);
sComm.Parity = (Parity)Enum.Parse(typeof(Parity), cmParity.Text);
sComm.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmStopBit.Text);
sComm.Open();
}
private void ClosePort()
{
//安全关闭当前串口。
//***避免串口死锁***
sComm.DataReceived -= this.sComm_DataReceived; //注销串口中断接收事件,避免下次再执行进来,造成死锁。
while(IsReceving)
Application.DoEvents(); //处理串口接收事件及其它系统消息。
sComm.Close(); //现在没有死锁,可以关闭串口。
//***避免串口死锁***
}
#region 另外一个串口
private void OpenPort1()
{
//***避免串口死锁***
serialPort1.WriteTimeout = 1000; //写超时,如果底层串口驱动效率问题,能有效的避免死锁。
serialPort1.ReadTimeout = 1000; //读超时,同上。
serialPort1.NewLine = "\r\n"; //回车换行。
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived); //注册事件。
//***避免串口死锁***
serialPort1.PortName = cmPort1.Text;
serialPort1.BaudRate = int.Parse(cmBaudRate1.Text);
serialPort1.DataBits = int.Parse(cmDataBit1.Text);
serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), cmParity1.Text);
serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cmStopBit1.Text);
serialPort1.Open();
}
private void ClosePort1()
{
//安全关闭当前串口。
//***避免串口死锁***
serialPort1.DataReceived -= this.serialPort1_DataReceived; //注销串口中断接收事件,避免下次再执行进来,造成死锁。
while (IsReceving1)
Application.DoEvents(); //处理串口接收事件及其它系统消息。
serialPort1.Close(); //现在没有死锁,可以关闭串口。
//***避免串口死锁***
}
private void btOpen_Click1(object sender, EventArgs e)
{
lbComStat1.Visible = true;
try
{
OpenPort1(); //安全打开串口。
if (serialPort1.IsOpen)
{
//btClose.Enabled = true;
//btOpen.Enabled = false;
lbComStat1.Text = "已打开 " + Convert.ToString(serialPort1.PortName) + ' ' + Convert.ToString(serialPort1.BaudRate) + ' ' + Convert.ToString(sComm.DataBits) + ' ' + Convert.ToString(sComm.Parity) + ' ' + Convert.ToString(sComm.StopBits);
tbSendStr.Focus();
}
}
catch (Exception er)
{
StopAutoSend(); //停止自动发送。
ClosePort1(); //安全关闭当前串口。
MessageBox.Show("端口打开失败!" + er.Message, "串口出错,请检查通信线路连接");
lbComStat1.Text = "已关闭该端口";
}
//check1.Visible = true;
//btSend.Enabled = true;
}
private void btSend_Click1(object sender, EventArgs e)
{
//自动打开端口。
if (!serialPort1.IsOpen)
btOpen_Click1(null, null);
//发送文本。
try
{
string txt = tbSendStr.Text;
Byte[] EncodeByte = strToHexByte(txt);
//Byte[] EncodeByte = new byte[txt.Length * 2];
//EncodeByte = Encoding.GetEncoding("GB2312").GetBytes(txt);
int Len = EncodeByte.Length;
serialPort1.Write(EncodeByte, 0, Len);
}
catch (Exception err)
{
MessageBox.Show(err.Message, "串口出错,请检查通信线路连接");
}
this.check2.Visible = true;
this.测试完成.Visible = true;
}
#endregion
private void StopAutoSend()
{
//停止自动发送字符串。
TimeStr.Stop();
TimeStr.Enabled = false;
tbTimeStr.Enabled = true;
cbTimeStr.Checked = false;
//停止自动发送命令。
//TimeHex.Stop();
//TimeHex.Enabled = false;
//tbTimeHex.Enabled = true;
//cbTimeHex.Checked = false;
}
在某个条件下运行下面的程序
btOpen_Click1(null, null);
try
{
OpenPort(); //安全打开串口。
if (sComm.IsOpen)
{
btClose.Enabled = true;
btOpen.Enabled = false;
lbComStat.Text = "已打开 " + Convert.ToString(sComm.PortName) + ' ' + Convert.ToString(sComm.BaudRate) + ' ' + Convert.ToString(sComm.DataBits) + ' ' + Convert.ToString(sComm.Parity) + ' ' + Convert.ToString(sComm.StopBits);
tbSendStr.Focus();
}
}
catch (Exception er)
{
StopAutoSend(); //停止自动发送。
ClosePort(); //安全关闭当前串口。
MessageBox.Show("端口打开失败!" + er.Message, "串口出错,请检查通信线路连接");
lbComStat.Text = "已关闭";
}
btSend_Click1(null, null);
我一步步运行(借助串口通)监测端口,发现
sComm可以接收,但是serialPort1发送没有反应。 --------------------编程问答-------------------- 顶顶帖子先
补充:.NET技术 , C#