C# 将字符发送到串行端口
我想将字符“a”发送到串行端口 我试过:C# 将字符发送到串行端口,c#,serial-port,C#,Serial Port,我想将字符“a”发送到串行端口 我试过: serialPort1.WriteLine("a"); 但它实际上并没有把“a”这个角色发送到我的董事会 有什么想法吗?您正在使用串口类吗 您如何知道它没有发送字符?是否可能是波特率/字长/奇偶校验设置关闭,而您的电路板无法识别字符 还有,为什么是c?对于硬件IO来说,这似乎是一个奇怪的选择。我向您分享了我在一个富有成效的项目中创建的一个类。这将处理串行连接和读写缓冲区: public class CommSERIAL : IComm {
serialPort1.WriteLine("a");
但它实际上并没有把“a”这个角色发送到我的董事会
有什么想法吗?您正在使用串口类吗
您如何知道它没有发送字符?是否可能是波特率/字长/奇偶校验设置关闭,而您的电路板无法识别字符
还有,为什么是c?对于硬件IO来说,这似乎是一个奇怪的选择。我向您分享了我在一个富有成效的项目中创建的一个类。这将处理串行连接和读写缓冲区:
public class CommSERIAL : IComm
{
#region Events
public event EventHandler EvtOnConnect;
public event EventHandler EvtOnDisconnect;
public event EventHandler<OnDataReceivedEventArgs> EvtOnDataReceived;
#endregion
System.IO.Ports.SerialPort Rs232 = new System.IO.Ports.SerialPort();
private string m_Port;
public string Port
{
get { return m_Port; }
set { m_Port = value; }
}
private int m_Baud;
public int Baud
{
get { return m_Baud; }
set { m_Baud = value; }
}
private int m_DataBit;
public int DataBit
{
get { return m_DataBit; }
set { m_DataBit = value; }
}
private System.IO.Ports.StopBits m_stopBits;
public System.IO.Ports.StopBits StopBits
{
get { return m_stopBits; }
set { m_stopBits = value; }
}
private System.IO.Ports.Parity m_parity;
public System.IO.Ports.Parity Parity
{
get { return m_parity; }
set { m_parity = value; }
}
public void Connect()
{
if (!(Rs232.IsOpen))
{
Rs232.PortName = this.Port;
Rs232.BaudRate = this.Baud; ;
Rs232.DataBits = this.DataBit;
Rs232.StopBits = this.StopBits;
Rs232.Parity = this.Parity;
Rs232.ReadTimeout = 5000;
Rs232.Handshake = System.IO.Ports.Handshake.None;
Rs232.ReadTimeout = 1000;
Rs232.WriteTimeout = 500;
Rs232.Open();
}
}
public void Disconnect()
{
Rs232.Close();
if (EvtOnDisconnect != null)
EvtOnDisconnect(new object(), new System.EventArgs());
m_Connected = false;
}
public CommSERIAL()
{
this.ConnType = ConnType.Direct;
}
public bool Connected
{
get
{
return m_Connected;
}
}
private ConnType m_ConnType;
public ConnType ConnType
{
get { return m_ConnType; }
set { m_ConnType = value; }
}
public string ReadOnByte(int Lenght,char EndChar)
{
char[] bytes = new char[Lenght];
string ret = "";
int numBytesRead = 0;
while (bytes[numBytesRead] != EndChar && numBytesRead <= bytes.Length)
{
while (Rs232.Read(bytes, numBytesRead, 1) == 1 && bytes[numBytesRead] != EndChar && numBytesRead <= bytes.Length)
{
numBytesRead++;
}
}
foreach (char b in bytes)
ret += b.ToString();
return ret.Substring(0,numBytesRead);
}
public String ReadBuffer()
{
try
{
if (Rs232.IsOpen)
{
Byte[] readBuffer = new Byte[Rs232.ReadBufferSize + 1];
try
{
// If there are bytes available on the serial port,
// Read returns up to "count" bytes, but will not block (wait)
// for the remaining bytes. If there are no bytes available
// on the serial port, Read will block until at least one byte
// is available on the port, up until the ReadTimeout milliseconds
// have elapsed, at which time a TimeoutException will be thrown.
Int32 count = Rs232.Read(readBuffer, 0, Rs232.ReadBufferSize);
String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count);
return SerialIn;
}
catch (TimeoutException) { return ""; }
}
else
{
Thread.Sleep(50);
return "";
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public string Read()
{
return Rs232.ReadExisting();
}
public string ReadAll()
{
//TO DO
return "";
}
public void Write(string Data)
{
if (Rs232 == null)
throw new Exception("Must be connected before Write");
if (!Rs232.IsOpen)
throw new Exception("Must be opened before Write");
Rs232.Write(Data);
}
public void ClearBuffer()
{
Rs232.DiscardInBuffer();
}
private bool m_Connected;
#region IComm Members
private int m_Id;
public int Id
{
get
{
return m_Id;
}
set
{
m_Id = value;
}
}
#endregion
public override string ToString()
{
return this.ConnType.ToString();
}
#region IComm Members
#endregion
}
公共类CommSERIAL:IComm
{
#地区活动
公共事件处理程序EvtOnConnect;
公共事件事件处理程序;
公共事件事件处理程序EvtOnDataReceived;
#端区
System.IO.Ports.SerialPort Rs232=新的System.IO.Ports.SerialPort();
专用字符串m_端口;
公共字符串端口
{
获取{return m_Port;}
设置{m_Port=value;}
}
私有整数m_波特;
公共整数波特
{
获取{return m_Baud;}
设置{m_Baud=value;}
}
私人国际数据中心;
公共int数据库
{
获取{return m_DataBit;}
设置{m_DataBit=value;}
}
专用系统.IO.Ports.StopBits m_StopBits;
公共系统.IO.Ports.StopBits StopBits
{
获取{return m_stopBits;}
设置{m_stopBits=value;}
}
private System.IO.port.Parity m_Parity;
公共系统.IO.Ports.奇偶校验
{
获取{返回m_奇偶校验;}
设置{m_奇偶校验=值;}
}
公共void Connect()
{
如果(!(Rs232.IsOpen))
{
Rs232.PortName=此.Port;
Rs232.BaudRate=此.Baud;
Rs232.DataBits=this.DataBit;
Rs232.StopBits=此.StopBits;
Rs232.奇偶校验=此.奇偶校验;
Rs232.ReadTimeout=5000;
Rs232.Handshake=System.IO.port.Handshake.None;
Rs232.ReadTimeout=1000;
Rs232.WriteTimeout=500;
Rs232.Open();
}
}
公共空间断开连接()
{
Rs232.Close();
if(EvtOnDisconnect!=null)
EvtOnDisconnect(新对象(),新系统.EventArgs());
m_Connected=false;
}
公共通信序列号()
{
this.ConnType=ConnType.Direct;
}
公共广播连接
{
得到
{
返回连接的m_;
}
}
私有连接类型m_连接类型;
公共连接类型连接类型
{
获取{return m_ConnType;}
集合{m_ConnType=value;}
}
公共字符串ReadOnByte(int-Lenght,char-EndChar)
{
字符[]字节=新字符[长度];
字符串ret=“”;
int numBytesRead=0;
while(bytes[numBytesRead]!=EndChar&&numBytesRead您要连接什么类型的设备?它是否实现了某种协议?不设置握手属性将是猜测#1。它应该发送三个字符,“a”和换行符(CR LF)。请指定您正在与之通信的设备。您可以随意使用任何您喜欢的设备,语言取决于解决方案。C#与硬件相去甚远,但这只是我个人的偏见:)我过去在C和Python方面有很好的经验。+1…我完全看不出这个答案被否决的原因-这是对这个问题的一个合适的答案。。。
bool Connected
{
get;
}
int Id
{
get;
set;
}
void Connect();
void Disconnect();
void Write(string Data);
string Read();
string ReadOnByte(int Lenght, char EndChar);
String ReadBuffer();
void ClearBuffer();
string ReadAll();
event EventHandler EvtOnConnect;
event EventHandler EvtOnDisconnect;
event EventHandler<EventArgs.OnDataReceivedEventArgs> EvtOnDataReceived;
}