[ad_1]
Chào mọi người,
tìm kiếm trợ giúp về dữ liệu cổng nối tiếp được nhận.
Tôi có một tập tin được lưu trữ nhiều lệnh.
Tôi cần gửi từng lệnh một đến cổng nối tiếp và chờ phản hồi và hiển thị để tiếp tục gửi lệnh khác.
Tôi đang sử dụng thread.sleep giữa mỗi lệnh gửi nhưng nó không hoạt động.
Hãy giúp tôi.
Cảm ơn
Những gì tôi đã thử:
I'm using thread.sleep between each command send but it does not work.
Giải pháp 1
Dừng chơi với Thread.Sleep: nó có thể sẽ không giúp ích gì cho bạn.
Cách tôi sẽ làm là thiết lập Hàng đợi lệnh và sử dụng sự kiện DataReceured để nhận phản hồi. Khi phản hồi hoàn tất, hãy lấy lệnh tiếp theo ra khỏi hàng đợi và gửi lệnh đó, đồng thời để sự kiện DataReceived xử lý phản hồi khi nó đến.
Khi Hàng đợi trống, tập lệnh đã hoàn tất.
Giải pháp 2
Nói chung, tất cả các hoạt động IO không đồng bộ phải được thực hiện trong các luồng riêng để tránh chặn ứng dụng. Nếu không, GUI của bạn sẽ bị trễ hoặc GUI sẽ bị chặn hoàn toàn trong trường hợp xấu nhất.
Đối với trường hợp của bạn, bạn sẽ cần ít nhất một luồng để nhận phản hồi và truyền các lệnh được xếp hàng đợi.
Luồng nhận sẽ đệm dữ liệu cho đến khi nhận được phản hồi đầy đủ. Cách thực hiện việc này tùy thuộc vào dữ liệu (ví dụ: nguồn cấp dữ liệu văn bản hoặc sau khi nhận được số byte đã được thông báo trong tiêu đề giao thức).
Khi đã nhận được phản hồi đầy đủ, điều này sẽ được báo hiệu cho các luồng khác. Trong trường hợp của bạn, đây sẽ là luồng (GUI) chính để hiển thị phản hồi và hàng đợi truyền để cho phép gửi lệnh tiếp theo. Lưu ý rằng việc truyền dữ liệu từ một luồng tới các phần tử GUI cần được xử lý đặc biệt.
Chuỗi truyền có thể chỉ cần gửi bằng cách sử dụng lệnh gọi chặn vì dù sao nó cũng phải đợi. Sau khi gửi nó phải chờ tín hiệu nhận được phản hồi.
Bạn có thể đặt việc gửi và nhận vào một hoặc hai luồng.
Mã giả để nhận (giả sử dữ liệu văn bản):
// 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 }
Trong luồng truyền, sau khi gửi lệnh, hãy gọi lệnh trên hoặc đợi sự kiện khi việc nhận được thực hiện trong luồng riêng.
Sử dụng các chủ đề và sự kiện mà bạn tránh gọi điện sleep
điều này thường nên tránh và đảm bảo rằng không lãng phí thời gian của hệ thống.
Giải pháp 3
Của tôi SerialDevice
lớp đây:
Giao tiếp đa luồng cho giao diện GPIB/Visa/serial[^]
thực hiện chính xác quy trình được mô tả trong Giải pháp 2 ở trên: với các lệnh không đồng bộ, I/O được thực hiện trong một luồng riêng biệt sử dụng các lệnh gọi chặn đơn giản để ghi/đọc.
Một nhận xét về giải pháp 1: sự kiện DataReceured được gọi trên một luồng không phải giao diện người dùng, do đó, dù sao bạn cũng cần tìm hiểu điều gì đó về luồng nếu muốn sử dụng nó (ví dụ: trình xử lý DataReceured có thể gọi một cuộc gọi lại được đồng bộ hóa để tránh các vấn đề với các trường được chia sẻ hoặc các thành phần giao diện người dùng).
Giải pháp 4
Giữa tôi đã tìm ra giải pháp mà không cần sử dụng trình xử lý DataReceured.
Chỉ cần viết lệnh vào cổng nối tiếp và sau đó đọc phản hồi từ cổng nối tiếp sau khi ghi.
và nó hoạt động đúng như những gì tôi đang tìm kiếm.
Nhưng không chắc liệu đây có phải là cách làm đúng đắn hay không.
Ví dụ:
Viết();
Đọc();
[ad_2]
コメント