在串行端口数据接收事件期间发送数据

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 和其他一些网站上阅读有关在端口打开前订阅导致的奇怪行为。

所以简而言之,在端口打开后订阅接收事件。