C# 串口通讯问题,大家帮忙解决一下@@@
是这样的 我在网上弄了一个代码,串口通讯的,出现的问题在于 这个串口通讯的代码 不好用。
如何不好用法
01 单独运行它 ,发送不出去数据。
02 当我开启串口测试助手之后,再把串口测试助手关闭,在运行就可以用
03 我问了 好多人,说 可能是初始化的问题,或者是串口到底有没有打开。
大家能帮忙解决一下这个问题吗?
[解决办法]
1.检查COM口号对不对
2.检查参数,停止位、校验位、数据位
3.降低波特率,比如9600、4800
4.延长Timeout,或者取消Timeout再试
[解决办法]
建议楼主检查一下CardCom和this.Open()的关系,感觉你对前者进行了参数设置,但是Open的时候是否就是调用了前者呢?因为没看到你的Open()时有什么参数?
[解决办法]
补充一下:也许把下面这里改一下试试
if (this.OpenCom())
改为
if (cardCom.OpenCom())
[解决办法]
using System;
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; }
}
}
[解决办法]
11楼。。SerialPort.Open()方法本来没有参数。。而且也没有重载。。。