如何在Win10 IoT中获得SerialDevice状态

时间:2017-03-20 23:04:28

标签: c# raspberry-pi uwp iot

情况:使用串行端口(通过USB)将工业机器连接到Raspberry。它由发送到串行端口的字符串控制。

项目:为Raspberry创建一个控制此类机器的应用程序。

工具:通过以太网连接到Raspberry的PC上的Visual Studio 2015,其中应用程序使用C#编写,用于Win 10 UWP,并在为ARM构建时部署到Raspberry。

问题:由于机器在现实世界中执行命令可能需要几分钟的时间,因此在Raspberry监视器上有关机器当前状态的反馈会很好(此外,显然,视觉和声学线索操作员可以在操作时使用。)

互联网上有几个SerialDevice代码示例。我从他们那里得到了我的代码。创建端口:

serialPort = await SerialDevice.FromIdAsync(Id);
serialPort.WriteTimeout = TimeSpan.FromMilliseconds(1000);
serialPort.ReadTimeout = TimeSpan.FromMilliseconds(2000);
serialPort.BaudRate = 9600;
serialPort.Parity = SerialParity.None;
serialPort.StopBits = SerialStopBitCount.One;
serialPort.DataBits = 8;
// serialPort.Handshake = SerialHandshake.None;
// serialPort.Handshake = SerialHandshake.RequestToSend;
serialPort.Handshake = SerialHandshake.RequestToSendXOnXOff;

发送命令:

public async Task WriteAsync(string cmdText)
{
    Task<int> storeAsyncTask;
    dataWriteObject = new DataWriter(serialPort.OutputStream);
    dataWriteObject.WriteString(cmdText);
    storeAsyncTask = dataWriteObject.StoreAsync().AsTask();
    int bytesWritten = await storeAsyncTask;
}

我现在对读取端口发送的数据不感兴趣。机器不这样做。现在,这个应用程序是简化移植的PC桌面程序在某些时候有代码来检查状态:

bool CTS = serialPort.ClearToSendState;
bool DSR = serialPort.DataSetReadyState;

if (CTS)
    if (DSR)                      // true true
        state = EnumStates.ERROR;
    else                          // true false
        state = EnumStates.READY;
else
    if (DSR)                      // false true
        state = EnumStates.BUSY;
    else                          // false false
        state = EnumStates.DISCONNECTED;

问题是Win 10应用程序中的那些状态永远不会变为false,而一切都适用于PC版本。关于这个问题只有一个未经答复的老问题,在创建示例时似乎没有人关心端口的状态。我尝试了各种类型的控制流标志,没有成功。我尝试使用Visual Studio的Intellisense提供的各种东西,但没有任何好处。将值serialPort.IsRequestToSendEnabled强制为true会导致无效值的异常。

非常感谢任何提示。

1 个答案:

答案 0 :(得分:0)

我看到Windows 10 UWP下的串行端口行为完全相同。 SerialPort.DataSetReadyState永不改变。我发现的唯一解决方法是挂接SerialPinChange事件,并在那里捕获DSR状态更改。不幸的是,这并不能为您提供值,而只是为您提供了已更改的事实,但是在已知的初始状态下,可能可以跟踪该值。

        AddHandler SerialPort.PinChanged,
        Sub(sender As Object, e As PinChangedEventArgs)
            Select Case e.PinChange
                Case SerialPinChange.DataSetReady
                    DSRchanged = True
            End Select
        End Sub