30/09/2018, 19:32

Cần giúp đỡ lập trình C# (lọc byte)

Mình học bên điện tử, đang làm 1 bài tập liên quan đến lập trình C# (giao tiếp máy tính với vi điều khiển). Mình đang gặp vấn đề về lập trình C# mong các bạn giúp mình với.
Cụ thể như thế này. Mình gửi tín hiệu (dạng byte - 8 bit) từ vi điều khiển (chip) lên máy tính (mình đã làm được). Lập trình giao diện (ok) nhưng mình không biết lấy 1 hay 2 byte cụ thể trong cái chuỗi byte đó (vì truyền là truyền liên tục).
Đây là đoạn code nhận tín hiệu từ máy tính.
//=========================================================//
int bytes = serialPort1.BytesToRead; //Determine how many bytes to read
byte[] comBuff = new byte[bytes]; //Byte array comBuff to store value serialPort1.Read(comBuff, 0, bytes);
this.BeginInvoke(new SetText(ProcessData), new object[] { Byte2Decimal(comBuff) });
//=========================================================//
Trong hàm ProcessData mình sẽ thực hiện lọc byte cần để tính toán ra.
Ví dụ mình muốn lấy byte số 2 và số 3 ra thì sao?
Ở đây mình dùng ký hiệu để biết đâu là chuỗi mình truyền.
254,255 — chuỗi truyền [0],[1],[2],[3],[4],[5] — 11,11
Bây giờ mình lọc tín hiệu trước dựa vào ký hiệu đầu 254,255. Sau đó cắt bỏ đi cái ký hiệu đó, lấy byte thứ [0] và [1] để tính toán. Cho mình hỏi là mình làm như thế nào?

Văn Dương viết 21:46 ngày 30/09/2018

Việc truyền dữ liệu giữa MCU và PC bạn nên làm theo các quy tắc sau:
1.Dữ liệu được truyền theo Frame, tức là có độ dài cố định, trong đó có dữ liệu SOF (start of frame) hoặc cả EOF( end of frame). Ví dụ :
-S12345E.
-S12345.

2.Việc truyền nhận phải có trễ giữa các frame để MCU hay PC có thời gian xử lý, tránh mất dữ liệu hoặc tràn stack trên MCU.

3.Trên PC, khi có ngắt DataReceived xảy ra, hãy đợi trễ một khoảng thời gian đủ để chắc chắn đã nhận được 1 Frame sau đó mới đọc. Đảm bảo toàn vẹn dữ liệu.

Các yếu tố trên đảm bảo quá trình truyền nhận và dữ liệu OK.
Bây giờ bạn có thể lấy byte số 2 trong dữ liệu nhận như sau :

private void serialPort_DataReceived(........){
    System.Thread.Sleep(20); // wait data
    byte[] data = Encoding.UTF8.GetBytes(serialPort.ReadExisting()); // read all data and clear read buffer.
    byte x=data[1]; lấy byte số 2 trong dữ liệu.
}
BiNa2605 viết 21:41 ngày 30/09/2018

Cảm ơn bạn nhiều :D. Quá chính xác. Bạn cho mình hỏi là bạn đã dùng ZedGraph chưa? Nếu mình muốn dùng cái byte đó để vẽ thì làm sao vậy bạn.
Mình dùng cách khác để tách byte cần thiết ra, làm cũng được nhưng không chuyên nghiệp bằng bạn. Kết quả mình vẽ trên ZedGraph đây, nhưng sao nó có vẽ không chuyên nghiệp chút nào. Hình của mình không đúng và quá xấu. Bạn có thể cho mình lời khuyên không?

Hình vẽ trên mạng, rất chuyên nghiệp. Mình không biết tác giả dùng phần mềm nào nhưng rất đẹp :D. (Mình không upload được do chỉ là thành thành viên mới)

BiNa2605 viết 21:43 ngày 30/09/2018

Đây là hình tham khảo trên mạng

Văn Dương viết 21:46 ngày 30/09/2018

ZedGraph mình đã dùng qua rồi. Có thể do mình chưa biết cách dùng nhưng cảm nhận là : tù
Cái hình thứ 2 mà bạn bảo là chuyên nghiệp ấy thì là vẽ bằng Chart (có sẵn trong toolbox).

Mình thì ít đụng đến đồ thị. Có vài lần dùng Chart rồi sau đó làm theo cách tạo một cái ảnh rồi vẽ lên đó.

BiNa2605 viết 21:46 ngày 30/09/2018

Cảm ơn bạn mình sẽ thử xem sao.

BiNa2605 viết 21:39 ngày 30/09/2018

Dương_Act, Bạn có tài liệu C# (hoặc Qt + C++) cho lĩnh vực điện tử cho mình xin với nếu không bạn cho mình lời khuyên khi bước vào lĩnh vực này. Thanks bạn.

Bài liên quan
0