情况:使用串行端口(通过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会导致无效值的异常。
非常感谢任何提示。
答案 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