同步串口读/写

iso*_*rik 5 c# synchronization serial-port

我正在尝试在Visual Studio 2010中编写ac#程序,它通过串行连接与微控制器通信.我可以很好地读取和写入端口,我只是不确定如何让send方法等待,直到执行前收到上一个send命令的所有数据.我已经实现了数据接收事件处理程序,以便确定何时在串行端口上接收到所请求的适当数据量.我只需要知道如何导致告诉send方法端口是空闲的.

我曾计划使用互斥锁,但我认为问题不在于多线程.相同的线程一个接一个地在串行端口上发送字符串,并且响应第一个请求而接收的数据与第二个请求冲突.

此外,如果通信由一个线程完成,那么该线程是否会导致数据接收事件处理程序不执行?

(两种方法属于同一类)

我的发送数据方法:

//method for sending data
public void send(String s)
{

    sp.Write(s + "\r");
}
Run Code Online (Sandbox Code Playgroud)

我的数据收到事件处理程序

//data received event handler
private void dataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    string tmp;
    tmp = sp.ReadExisting();

    //put all received data into the read buffer
    readBuffer += tmp;

    //add various flag checks to determine end of transmission
    if (firmwareFlag)
    {
        if (readBuffer.EndsWith("\n"))
        {
            firmwareFlag = false;

            //trigger event to tell object owner data is ready
            dataReady(this, new CustomEventArgs(readBuffer, "firmware"));
            readBuffer = "";

        }
    }
    else if (parameterFlag)
    {
        if (System.Text.RegularExpressions.Regex.IsMatch(readBuffer, "K90", System.Text.RegularExpressions.RegexOptions.IgnoreCase))
        {
            parameterFlag = false;

            dataReady(this, new CustomEventArgs(readBuffer, "parameters"));
            readBuffer = "";

        }
    }
    else
    {
        dataReady(this, new CustomEventArgs(readBuffer, null));
        readBuffer = "";
    }

}
Run Code Online (Sandbox Code Playgroud)

sim*_*mon 0

我会在类中只使用一个布尔变量和一个计时器。当计时器计时时,您检查该布尔值并在允许的情况下发送数据。

boolean isAllowed;
DispatcherTimer tmr1;
//...etc
Run Code Online (Sandbox Code Playgroud)