是这样的 我在网上弄了一个代码,串口通讯的,出现的问题在于 这个串口通讯的代码 不好用。如何不好用法01 单独运行它 ,发送不出去数据。
02 当我开启串口测试助手之后,再把串口测试助手关闭,在运行就可以用03 我问了 好多人,说 可能是初始化的问题,或者是串口到底有没有打开。
大家能帮忙解决一下这个问题吗?
02 当我开启串口测试助手之后,再把串口测试助手关闭,在运行就可以用03 我问了 好多人,说 可能是初始化的问题,或者是串口到底有没有打开。
大家能帮忙解决一下这个问题吗?
cardCom.PortNum = 1;
cardCom.BaudRate = 57600;
cardCom.ByteSize = 8;
cardCom.Parity = 0;
cardCom.StopBits = 1;
cardCom.ReadTimeout = 500;
if (this.OpenCom())
{
msg.AppendText("串口初始化成功……\r\n");
}
else
{
msg.AppendText("串口初始化失败!\r\n");
}剩下的代码大家可能都知道,就是在网上下的通用版本!
2.检查参数,停止位、校验位、数据位
3.降低波特率,比如9600、4800
4.延长Timeout,或者取消Timeout再试
if (this.OpenCom())
改为
if (cardCom.OpenCom())
using System.IO.Ports;namespace WinTempApp
{
public class PortData
{
public event PortDataReceivedEventHandle Received;
public event SerialErrorReceivedEventHandler Error;
public SerialPort port;
public bool ReceiveEventFlag = false; //接收事件是否有效 false表示有效
public bool OpenPortLost;
private string logCaption = "PortData";
public PortData(string sPortName, int baudrate,Parity parity,StopBits stopbit)
{
try
{
port = new SerialPort(sPortName, baudrate, parity, 8, stopbit);
port.RtsEnable = true;
port.ReadTimeout = 3000;
port.DataReceived += DataReceived;
port.ErrorReceived += ErrorEvent;
OpenPortLost = false;
}
catch (Exception ex)
{
OpenPortLost = true;
LogFile.LogMessage(String.Format("{0}:{1}", logCaption, ex.Message), AppEnum.Exception.ToString());
}
} ~PortData()
{
Close();
}
/// <summary>
/// COM端口打开
/// </summary>
public void Open()
{
if (!port.IsOpen)
{
port.Open();
}
} public void Close()
{
try
{
if (port.IsOpen)
{
port.Close();
}
}
catch (Exception ex)
{
LogFile.LogMessage(String.Format("{0}:{1}", logCaption, ex.Message), AppEnum.Exception.ToString());
}
}
//数据发送
public void SendData(byte[] data)
{
try
{
if (port.IsOpen)
{
port.Write(data, 0, data.Length);
}
}
catch (Exception ex)
{
LogFile.LogMessage(String.Format("{0}:{1}", logCaption, ex.Message), AppEnum.Exception.ToString());
}
}
public void SendData(byte[] data,int offset,int count)
{
try
{
if (port.IsOpen)
{
port.Write(data, offset, count);
}
}
catch (Exception ex)
{
LogFile.LogMessage(String.Format("{0}:{1}", logCaption, ex.Message), AppEnum.Exception.ToString());
} }
//发送命令
public int SendCommand(byte[] SendData, ref byte[] ReceiveData,int Overtime)
{
try
{
if (port.IsOpen)
{
ReceiveEventFlag = true; //关闭接收事件
port.DiscardInBuffer(); //清空接收缓冲区
port.Write(SendData, 0, SendData.Length);
int num = 0, ret = 0;
while (num++ < Overtime)
{
if (port.BytesToRead >= ReceiveData.Length) break;
System.Threading.Thread.Sleep(1);
}
if (port.BytesToRead >= ReceiveData.Length)
ret = port.Read(ReceiveData, 0, ReceiveData.Length);
ReceiveEventFlag = false; //打开事件
return ret;
}
}
catch (Exception ex)
{
LogFile.LogMessage(String.Format("{0}:{1}", logCaption, ex.Message), AppEnum.Exception.ToString());
}
return -1;
} public void ErrorEvent(object sender, SerialErrorReceivedEventArgs e)
{
if (Error != null) Error(sender, e);
}
//数据接收
public void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//禁止接收事件时直接退出
if (ReceiveEventFlag) return; byte[] data = new byte[port.BytesToRead];
port.Read(data, 0, data.Length);
if (Received != null) Received(sender, new PortDataReciveEventArgs(data));
} public bool IsOpen()
{
return port.IsOpen;
}
}
public delegate void PortDataReceivedEventHandle(object sender, PortDataReciveEventArgs e);
public class PortDataReciveEventArgs : EventArgs
{
public PortDataReciveEventArgs()
{
Data = null;
} public PortDataReciveEventArgs(byte[] data)
{
Data = data;
} public byte[] Data { get; set; }
}
}