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)
我会在类中只使用一个布尔变量和一个计时器。当计时器计时时,您检查该布尔值并在允许的情况下发送数据。
boolean isAllowed;
DispatcherTimer tmr1;
//...etc
Run Code Online (Sandbox Code Playgroud)