在串行端口数据接收事件期间发送数据
Send Data During Serial Port Data received Event
我正在使用 COM4 串行端口发送和接收数据。我有一个需求请求 - 我验证请求是 mydatastring = myrequeststring - 这工作正常。我试图在此事件处理程序期间通过 com 端口回复数据,但当然访问被拒绝。收到请求后如何完成发送数据..??
void scScale_OnReceiving(object sender, DataStreamEventArgs e)
{
if( e.Response == myrequeststring )
{
scScale.Transmit(this.data);
}
}
编辑
scScale 的相关部分——它是一个 SerialPort Client class——基本上封装了 SerialPort 的细节。
相关代码:
public bool OpenConn()
{
try
{
if (_serialPort == null)
_serialPort = new SerialPort(_port, _baudRate, Parity.None);
if (!_serialPort.IsOpen)
{
_serialPort.ReadTimeout = -1;
_serialPort.WriteTimeout = -1;
_serialPort.Open();
if (_serialPort.IsOpen)
{
serThread.Start(); /*Start The Communication Thread*/
IsOpen = true;
}
else
{
IsOpen = false;
}
}
}
catch (Exception ex)
{
return false;
}
return true;
}
public void Transmit(string packet)
{
_serialPort.Write(packet); // 0, packet.Length);
}
public void Transmit(byte[] packet)
{
_serialPort.Write(packet, 0, packet.Length);
}
public int Receive(byte[] bytes, int offset, int count)
{
int readBytes = 0;
if (count > 0)
{
readBytes = _serialPort.Read(bytes, offset, count);
}
return readBytes;
}
private void OnSerialReceiving(byte[] res)
{
if (OnReceiving != null)
{
OnReceiving(this, new DataStreamEventArgs(res));
}
}
SCSCALE 是 link 处的代码。
https://roofman.wordpress.com/2012/09/13/fast-serial-communication-for-c-real-time-applications/
我不知道为什么会这样,但确实如此;当串行端口被实例化时 - 我创建了事件处理程序并且确实触发了事件,但在处理该事件期间我无法通过端口发送回复。
但是,如果我在端口打开后订阅该事件,该事件将触发,我将有权访问该端口以发送回复。
虽然我没有 post 我的完整代码 - 我确实在传输之前验证端口是否打开,如果没有,我打开端口。
现在,我不是立即订阅接收事件,而是打开端口,然后订阅 OnReceive 事件。
我更改代码以在端口打开后订阅的原因是因为我在 SO 和其他一些网站上阅读有关在端口打开前订阅导致的奇怪行为。
所以简而言之,在端口打开后订阅接收事件。
我正在使用 COM4 串行端口发送和接收数据。我有一个需求请求 - 我验证请求是 mydatastring = myrequeststring - 这工作正常。我试图在此事件处理程序期间通过 com 端口回复数据,但当然访问被拒绝。收到请求后如何完成发送数据..??
void scScale_OnReceiving(object sender, DataStreamEventArgs e)
{
if( e.Response == myrequeststring )
{
scScale.Transmit(this.data);
}
}
编辑
scScale 的相关部分——它是一个 SerialPort Client class——基本上封装了 SerialPort 的细节。
相关代码:
public bool OpenConn()
{
try
{
if (_serialPort == null)
_serialPort = new SerialPort(_port, _baudRate, Parity.None);
if (!_serialPort.IsOpen)
{
_serialPort.ReadTimeout = -1;
_serialPort.WriteTimeout = -1;
_serialPort.Open();
if (_serialPort.IsOpen)
{
serThread.Start(); /*Start The Communication Thread*/
IsOpen = true;
}
else
{
IsOpen = false;
}
}
}
catch (Exception ex)
{
return false;
}
return true;
}
public void Transmit(string packet)
{
_serialPort.Write(packet); // 0, packet.Length);
}
public void Transmit(byte[] packet)
{
_serialPort.Write(packet, 0, packet.Length);
}
public int Receive(byte[] bytes, int offset, int count)
{
int readBytes = 0;
if (count > 0)
{
readBytes = _serialPort.Read(bytes, offset, count);
}
return readBytes;
}
private void OnSerialReceiving(byte[] res)
{
if (OnReceiving != null)
{
OnReceiving(this, new DataStreamEventArgs(res));
}
}
SCSCALE 是 link 处的代码。 https://roofman.wordpress.com/2012/09/13/fast-serial-communication-for-c-real-time-applications/
我不知道为什么会这样,但确实如此;当串行端口被实例化时 - 我创建了事件处理程序并且确实触发了事件,但在处理该事件期间我无法通过端口发送回复。 但是,如果我在端口打开后订阅该事件,该事件将触发,我将有权访问该端口以发送回复。
虽然我没有 post 我的完整代码 - 我确实在传输之前验证端口是否打开,如果没有,我打开端口。 现在,我不是立即订阅接收事件,而是打开端口,然后订阅 OnReceive 事件。
我更改代码以在端口打开后订阅的原因是因为我在 SO 和其他一些网站上阅读有关在端口打开前订阅导致的奇怪行为。
所以简而言之,在端口打开后订阅接收事件。