[ad_1]
大家好,
寻求有关串行端口接收数据的帮助。
我有一个文件存储了多个命令。
我需要将命令一一发送到串口并等待回复和显示才能继续发送其他命令。
我在每个命令发送之间使用 thread.sleep 但它不起作用。
请帮忙。
谢谢
我尝试过的:
I'm using thread.sleep between each command send but it does not work.
解决方案1
停止使用 Thread.Sleep:它可能不会帮助您。
我的方法是设置一个命令队列,并使用 DataReceived 事件来获取响应。 响应完成后,从队列中取出下一个命令并发送该命令,并让 DataReceived 事件在响应到达时对其进行处理。
当队列为空时,命令集就完成了。
解决方案2
一般来说,所有异步 IO 操作都应在自己的线程中执行,以避免阻塞应用程序。 否则,GUI 中将会出现延迟,或者在最坏的情况下 GUI 将被完全阻止。
对于您的情况,您至少需要一个线程来接收回复和传输排队的命令。
接收线程应该缓冲数据,直到收到完整的响应。 如何执行此操作取决于数据(例如,文本数据换行或收到协议标头中已宣布的字节数后)。
一旦收到完整的响应,就会向其他线程发出信号。 在您的情况下,这将是显示响应的主(GUI)线程和用于发送下一个命令的传输队列。 请注意,将数据从线程传递到 GUI 元素需要特殊处理。
传输线程可以简单地使用阻塞调用来发送,因为无论如何它都必须等待。 发送后必须等待接收信号的响应。
您可以将发送和接收放入一个或两个线程中。
接收伪代码(假设为文本数据):
// Check for kill (terminate thread) event (wait with no timeout) while (!KillEvent) { do { // Blocking call until a character is available // Should have a timeout and corresponding handling (break here) rxChar = ReceiveChar(); Buffer += rxChar; } while (rxChar != '\n'); // Signal other threads that a response has been received // Pass a copy of Buffer to the main thread for display }
在发送线程中,发送命令后调用上述命令或在自己的线程中完成接收时等待事件。
使用避免调用的线程和事件 sleep
通常应该避免这种情况,并确保不会浪费系统时间。
解决方案3
我的 SerialDevice
在这里上课:
GPIB/Visa/串行接口的多线程通信[^]
完全实现了上面解决方案 2 中描述的过程:使用异步命令,I/O 在单独的线程中完成,该线程使用简单的阻塞调用进行写入/读取。
对解决方案 1 的一条评论:DataReceived 事件是在非 UI 线程上调用的,因此如果您想使用它,您无论如何都需要了解一些有关线程的知识(例如,DataReceived 处理程序可以调用同步回调以避免共享字段或用户界面组件)。
解决方案4
在我之间找到了一个不使用 DataReceived 处理程序的解决方案。
只需向串口写入命令,写入后从串口读取回复即可。
它按照我的要求工作。
但不确定这是否是正确的方法。
例子:
写();
读();
[ad_2]
コメント