PDA

View Full Version : mã hóa ,giải mã sửa sai


binhdt04
03-02-2009, 01:09 PM
tôi đang cần đoạn code mẫu hoặc thuật toán để có thể mả hóa và giải mã một chuổi dữ liệu .
đồng thời có thể giải mã và sữa sai data đó

(checksum and encode +decode)

(cụ thể là tôi truyền 8 byte data nhưng trong môi trường truyền có thể có nhiểu gây sai data do đó tôi cần thuật toán để mã hóa và giải ma có kểm theo sữa sai data )

ThanhPhuc
04-02-2009, 04:33 PM
Bạn có thể truyền 9 byte trong đó byte thứ 9 dùng để kiểm tra lỗi.Tuỳ thủ thuật kiểm tra khi phát,bên nhận kiểm tra byte 9,nếu đúng thì báo bên phát phát tiếp,nếu kiểm tra sai thì phát tín hiệu yêu cầu phát lại.
Việc mã hoá , giải mã và kiểm tra làm cho chương trình chậm lại.

binhdt04
04-02-2009, 05:02 PM
làm vậy nếu sai o byte thứ (1_8) rui lam sao biết mà truyền lại
con việc bạn so cham MCU thì không có vấn đề ji cả mình tăng tốc MCU lên là ok
Trong thông tin số liệu là quan trọng nhất thời gian không quan trong bằng.

ThanhPhuc
16-02-2009, 09:14 AM
Hệ thống của bạn phải thu phát 2 chiều hoặc phải có đường phản hồi để báo nhận xong dữ liệu hoặc báo dữ liệu thu bị lỗi.Khi thu bạn phải kiểm tra 8 byte data sau đó so sánh với byte kiểm tra để xác định dữ liệu có bị lỗi hay không để có hướng xử lý.
Thông thường hệ thu phát của bạn phải ổn định và có độ tin cậy.Tỉ lệ sai khi thu phát phải <1% ,nếu không đạt bạn phải kiểm tra lại hệ thu phát.
Chúc bạn thành công.

binhdt04
16-02-2009, 01:18 PM
ôi trời bạn nói tôi không hiểu ji2 hết
Muc tiêu của tôi là CRC +sửa sai
bạn lại toàn đề cập vấn đề ji đó(toàn hệ thống )
hệ thống của tôi hoạc động khá ổn định kể cả trong môi truơng nhiểu khá lớn .Nhưng hiện tại tôi vẩn chưa dùng CRC + sủa sai mà vẩn hoạt động khá OK chạy khoản 2 ngày lể liên tuc mới phát hiện ra lổi nhưng (các lổi data do nhiễu môi trường tạm thời tôi truyền lại)cái tôi muốn nhờ các bạn chỉ giúp chổ sửa sai data do nhiểu môi trường=>> nhưng một lổi thôi củng đủ gây thiệt hại khá lớn nếu tôi bất chấp lổi đó mà process data.



giả sử tôi cần truyền 8 byte {255,255,255,255,255,255,255,255}
nhưng do nhiểu loti nhận đuợc là {255,255,255,255,255,255,254,255}]
làm sao tôi có thể sữa sai cái byte thứ 6 đó mà không cần truyền lại sau khi đã phát hiện ra lổi(vì tôi đã có crc trước đó )

tôi không cần biết nó có làm chậm MCU hay không hay chiếm băng thông đường truyền nhiều hơn khi frame truyền tăng kích thước ........hay ji2 ji di nửa các thứ đó tôi có thể giải quyết được cái tôi quan tâm số một là data va data nhận được từ reciever phải
>=99,99% giồng với từ sender

các bạn có code hay dãy thuật gì tư vấn giúp tôi.!

namqn
16-02-2009, 04:38 PM
...

tôi không cần biết nó có làm chậm MCU hay không hay chiếm băng thông đường truyền nhiều hơn khi frame truyền tăng kích thước ........hay ji2 ji di nửa các thứ đó tôi có thể giải quyết được cái tôi quan tâm số một là data va data nhận được từ reciever phải
>=99,99% giồng với từ sender

các bạn có code hay dãy thuật gì tư vấn giúp tôi.!
CRC là mã phát hiện sai sót (error-detection code), tùy vào chiều dài thông điệp của bạn mà việc khôi phục dữ liệu khi có sai sót là dễ dàng hay khó khăn. Thông điệp chỉ có 1 byte dữ liệu và 1 byte CRC chắc chắn có thể giúp bạn khôi phục dữ liệu, còn nếu phần dữ liệu có nhiều hơn 1 byte thì sẽ rất khó khăn trong việc khôi phục dữ liệu.

Giải thuật đơn giản nhất cho việc sửa sai là tự động lặp lại thông điệp:
- Đầu thu tính toán CRC của thông điệp và so sánh với CRC đã nhận được
- Nếu kết quả không khớp thì đầu thu sẽ không xác nhận dữ liệu hợp lệ
- Đầu phát sẽ tự động truyền lại thông điệp đó nếu không nhận được xác nhận dữ liệu hợp lệ

Vì bạn cho biết hệ thống có xác suất lỗi khá thấp, tôi cho rằng giải thuật trên khá phù hợp với trường hợp của bạn.

Thân,

thientaisodo
17-02-2009, 04:47 PM
Mình cũng đang nghiên cứu truyền số liệu trong môi trường rất nhiễu và đường truyền dài. Nếu như phát hiện lỗi mà truyền lại cả gói thì những ứng dụng cần realtime sẽ không thực sự hiệu quả. Mình có tìm hiểu một số cách, có cách rất hay đó là truyền mỗi gói 9 byte, gồm 8 byte dữ liệu (mỗi byte dữ liệu có bit thứ 9 kiểm tra chẵn lẽ), và thêm một byte thứ 9 để kiểm tra các bit hàng dọc trong 8 byte đó (cứ tưởng tượng sắp xếp các bit trong gói đó như một ma trận 9x9). Như vậy có thể sửa lỗi cho gói dữ liệu rất tốt và không phải gửi lại toàn bộ nếu như mất một số thông tin trong gói đó.

Theo mình nghĩ cách đó code cũng không khó và hiệu quả đúng không ?!

binhdt04
18-02-2009, 09:01 AM
vậy la lên đến 10 byte đấy bạn .
ok cách của bạn khá hay đấy nhưng dùng thử mới biết được.để ngày may tôi kiễm tra bằng thực nghiệm mới được nói không là vô nghĩa .
thanks THIENTAISODO nhieu lắm se thữ nghiệm và cho bbac1 biêt kết quả sau .

thientaisodo
18-02-2009, 10:00 AM
Nếu khi nào code xong thì cho mình biết kết quả nhé

hopeman
18-02-2009, 10:35 AM
tôi đặt giả thiết là nếu nó gây ra sai số ở 2 byte phục vụ việc kiểm tra chẵn lẻ thì làm thế nào? sửa đúng thành sai à?

binhlt
18-02-2009, 11:01 AM
Có thuật toán có thể phát hiện sai và sửa sai (với điều kiện sai ít) bạn có thể tham khảo ở đây: http://vi.wikipedia.org/wiki/M%C3%A3_Hamming. Nhưng nếu sai nhiều thì bạn nên dùng cơ chế có phản hồi. Ví dụ: mỗi gói dữ liệu cần truyền đi được thêm vào 1 byte số thứ tự và 1 byte CRC. Đầu thu kiểm tra CRC nếu CRC đúng thì báo gói có số thứ tự đó đúng. Đầu phát sẽ tự động phát lại gói có số thứ tự nào đó nếu sau 1 khoảng thời gian nhất định mà không nhận được thông báo từ đầu thu

binhdt04
18-02-2009, 12:45 PM
thanks cơ chế này thường áp dụng cho ethernet đây là cơ chế đã được mình áp dụng một lần rùi nhưng cho hiệu suất không cao lắm .
1:dễ gây xung đột bus truyền .(do gởi theo cơ chế đồng loạt =>theo ban có nên sửa lại kiểu gởi hay không ??)

2:làm cho master phai su ly nhung data từ slave truyền tới (co dến 15 salve hơi mệt....)=> khong đáng kể lắm

hiện tại mình đang ứng dụng kiểu này cho những hệ thống cũ.

thientaisodo
18-02-2009, 03:21 PM
tôi đặt giả thiết là nếu nó gây ra sai số ở 2 byte phục vụ việc kiểm tra chẵn lẻ thì làm thế nào? sửa đúng thành sai à?

Ở đây chỉ có 1 byte để kiểm tra thôi, còn lại là bit thứ 9 (bit kiểm tra chẳn lẻ) của byte dữ liệu thôi. Trường hợp mà sai ít thì còn phát hiện lỗi, còn nếu sai nhiều và ở đúng byte kiểm tra thì phải làm thực tế mới biết được bạn ạ. Việc kiểm tra chồng chéo để chắc chắn thôi, còn lại nếu mất byte kiểm tra và mất tất cả bit thứ 9 của byte dữ liệu thì bó tay :D

binhlt
20-02-2009, 09:32 AM
Để tránh xung đột bus truyền bạn nên thiết kế master, slave theo kiểu nối tiếp thành vòng tròn hướng dữ liệu đi chỉ theo 1 phía (kiểu token ring) hoặc sử dụng cơ chế thăm dò trước khi gửi (dạng hub) nhiều slave thì nên thêm 1 byte nữa để định địa chỉ gói tin sẽ tới. Đây là cơ chế tối ưu rồi nên khó có thể chỉnh sửa gì thêm

Còn nếu bạn không thích làm bằng cách gửi phản hồi thì chỉ có thuật toán Hamming đó thôi

Chúc bạn thành công

tamtamhat
15-05-2009, 11:15 AM
Anh có thể gửi cho em code anh viết cho phần này được ko ạ? Em mới tìm hiểu về truyền thông nên chưa rõ lắm. Hoạt động của CRC_CCITT trong truyền thông?
Thanks !!!

tamtamhat
18-05-2009, 08:31 AM
Không bác nào giúp em ah?

hopeman
18-05-2009, 04:43 PM
sau một thời gian gắn bó với các em com, i2c ... cũng dùng đủ các trò để chống nhiễu nhưng mà cũng ko được triệt để lắm, giờ em đã chia tay các em này và kết hôn với em CAN rồi, em này tích sẵn trong dsPIC , dùng rất ổn các bác ạ , truyền thì cứ gọi là dài thoải mái luôn .

cskiller
18-05-2009, 05:06 PM
Tham khảo: ĐỊNH LÝ KÊNH, MÃ CHỐNG NHIỄU + MÃ KHỐI TUYẾN TÍNH