PDA

View Full Version : Xin hỏi về cách tổ chức xuất dữ liệu qua RS232


binhlt
05-01-2009, 09:59 PM
Các bạn cho tôi hỏi vấn đề sau:
Giả sử tôi cần truyền rất nhiều dữ liệu qua UART với dữ liệu thay đổi không biết trước từ 0 - 255, mỗi lần thành 1 chuỗi chừng 10 byte vậy cách làm thế nào cho tiện nhất mà vẫn đảm bảo phân biệt được đầu gói, cuối gói, gói truyền có lỗi hay không? Hiện tại tôi dùng 1 byte đánh dấu đầu gói = 2, 1 byte đánh dấu cuối gói = 3, các byte data thì bật bít cao nhất lên, các bít cao nhất chuyển về tập hợp tại 2 byte gắn sau chuỗi data, cuối cùng là bcc cách làm như vậy hơi mất công chuyển đổi và không được linh hoạt lắm. Các bạn có cách nào tốt hơn không?

nguyenquoctoan
05-01-2009, 10:16 PM
theo mình khi bạn truyền thì nên trong mỗi chuỗi bạn truyền thêm một ký tự nào đó, ví dụ
...C...chuôi1...C...chuỗi 2....C...tương tự
trong ccs bạn chỉ nhận hết tất cả các chuỗi bạn truyền xuống, sau đo dò và kiểm tra cắt chúng ra ( nếu gặp ký tự C thì cắt ra cho vào biến x1, còn không gặp C thì lưu vào mảng nào đó)

namqn
05-01-2009, 10:25 PM
Các bạn cho tôi hỏi vấn đề sau:
Giả sử tôi cần truyền rất nhiều dữ liệu qua UART với dữ liệu thay đổi không biết trước từ 0 - 255, mỗi lần thành 1 chuỗi chừng 10 byte vậy cách làm thế nào cho tiện nhất mà vẫn đảm bảo phân biệt được đầu gói, cuối gói, gói truyền có lỗi hay không? Hiện tại tôi dùng 1 byte đánh dấu đầu gói = 2, 1 byte đánh dấu cuối gói = 3, các byte data thì bật bít cao nhất lên, các bít cao nhất chuyển về tập hợp tại 2 byte gắn sau chuỗi data, cuối cùng là bcc cách làm như vậy hơi mất công chuyển đổi và không được linh hoạt lắm. Các bạn có cách nào tốt hơn không?
Rất nhiều là bao nhiêu? Tốc độ UART hiện thời của bạn là bao nhiêu? Bạn truyền giữa hai hệ nhúng hay giữa một hệ nhúng và máy tính?

Theo tôi, định dạng frame truyền đơn giản và phản hồi thông tin đã nhận là đủ.

Thân,

binhlt
06-01-2009, 09:11 AM
@nguyenquoctoan: Cách của bạn cũng là cách mà mình đang dùng tuy nhiên ký tự đánh dấu đó phải khác các ký tự của data nhưng vì data của mình ký tự nào cũng có thể xuất hiện nên để làm được điều đó mình phải chuyển đổi data từ 8 bit xuống còn 7 bit vì thế nên hơi mất công do đó mình mới cần tham vấn các bạn cách để không cần chuyển đổi phần data
@namqn: mình truyền giữa 1 hệ nhúng và máy tính và liên tục (cỡ 5 ms cho 1 gói - có thể sau này cần tăng thêm). Cái mình muốn hỏi chính là frame truyền đó nên chọn format như thế nào thì tốt nhất để đảm bảo vẫn nhận ra đâu là đầu frame, cuối frame, frame đó có lỗi trên đường truyền hay không, frame đó có được truyền đủ đến nơi hay không? Vì mình đang cần truyền khoảng cách khá xa. Vì truyền khoảng cách khá xa trong 1 môi trường có nhiều nhiễu từ mặc dù đã có những giải pháp nhằm hạn chế nhiễu nhưng mình vẫn muốn truyền với tốc độ càng thấp càng tốt hiện đang là 9600

longtu
06-01-2009, 01:02 PM
Nên truyền dữ liệu xuống là kiểu Ascci bạn ạ, khi dó bạn không sợ trùng dữ liệu

Khung mẫu truyền và nhận lệnh tổng quát :

STX Data ETX

• STX :đầu lệnh(0x02)
• Data :Tùy theo lệnh mà data có thể thay đổi
Lưu ý :
Các Data khác nhau sẽ được cách biệt nhau bởi khoảng trắng(space).
• ETX :cuối lệnh(0x03)
Lưu ý :
Các thành phần khác nhau sẽ được cách biệt nhau bởi khoảng trắng(space)
Vi du: truyền 1,2,3 xuong

STX 0x310x320x33 ETX

Khung lenh kép: STX Data1 STX Data2 ....STX Datan ETX

Thân
------------------------------------------------------------------------
Phùng Minh Tuân
Email: phmtuan@3ttechdirect.com

binhlt
06-01-2009, 02:08 PM
Chuyện này tuy thế mà cũng có vẻ khó nhỉ
@longtu: cách làm hiện tại của tôi đúng như bạn nói tuy nhiên tôi không thích cách đó lắm vì phải mất công chuyển đổi phần data truyền về dạng ÁSCII - bạn tưởng tượng như tôi đang có 1 hàm (trong PIC) trả ra kết quả là 1 mảng dữ liệu (các số 2 byte, 4 byte, ...) giờ tôi cần chuyển mảng kết quả này cho máy tính nhưng lại không thích chuyển mảng dữ liệu đó qua dạng ASCII mà muốn truyền luôn nó như là 1 phần của gói tin
@all: có ai giải thích hộ tôi làm thế nào máy tính truyền nhận cả gói tin IP mà không nhầm lẫn không kể cả khi trong gói IP đó có 1 gói khác nữa?

longtu
06-01-2009, 03:44 PM
Viec chuyen du lieu qua kieu Ascci rat don gian ma ban, neu dung CCs thi co san ham Itoa roi.

namqn
06-01-2009, 06:04 PM
...
@namqn: mình truyền giữa 1 hệ nhúng và máy tính và liên tục (cỡ 5 ms cho 1 gói - có thể sau này cần tăng thêm). Cái mình muốn hỏi chính là frame truyền đó nên chọn format như thế nào thì tốt nhất để đảm bảo vẫn nhận ra đâu là đầu frame, cuối frame, frame đó có lỗi trên đường truyền hay không, frame đó có được truyền đủ đến nơi hay không? Vì mình đang cần truyền khoảng cách khá xa. Vì truyền khoảng cách khá xa trong 1 môi trường có nhiều nhiễu từ mặc dù đã có những giải pháp nhằm hạn chế nhiễu nhưng mình vẫn muốn truyền với tốc độ càng thấp càng tốt hiện đang là 9600
Ở baudrate 9600 bps, bạn không thể truyền một gói >= 10 ký tự trong 5 ms!

Nếu truyền dữ liệu đi xa, bạn nên dùng RS-422 (đến 100 kbps ở khoảng cách tối đa 1200 m). Theo một vài bài viết gần đây của bạn, tôi cho là bạn đang dùng dsPIC. Với dsPIC, bạn có thể truyền 9 bit cho mỗi ký tự, vậy bạn không phải cắt một bit ra khỏi byte dữ liệu như đang làm (tôi không rõ phía máy tính có thể xử lý ký tự 9-bit hay không).

Như tôi đã nói trước đó, vì đường truyền là song công, bạn nhận được ký tự nào ở máy tính thì có thể gửi trả ngay về PIC. Ở phía PIC, bạn phát lại frame khi phát hiện frame đã bị nhận sai.

Bạn hãy thử nghiệm trước khi áp dụng mọi kỹ thuật cần thiết, đôi khi nó trở thành việc "giết gà dùng dao mổ trâu".

Thân,

nguyenquoctoan
06-01-2009, 07:42 PM
nếu bạn muốn fomat chuỗi để xách định đúng thì bạn:
- xác định độ dài chuỗi cần truyền, sau đó dới hạn chuỗi lại có thể là 20 ký tự đi,níu thíu thì bổ sung ký tự "0" vào trườc, truyền, dưới ccs chỉ cần đếm đủ 20 ký tự cắt ra, tiếp tục chuỗi khác,...

binhlt
06-01-2009, 08:51 PM
@longtu: làm theo cách của bạn tuy tường minh nhưng khi cần truyền nhiều thông tin thì sẽ bị giới hạn thời gian do 1 số 1 byte nhẽ ra mất 1 lần gửi thì bạn có thể mất đến 3 lần. Với lại C30 không có hàm itoa
@nguyenquoctoan: vậy nếu trên đường truyền do bị lỗi đến nơi bạn chỉ nhận được 1/2 frame thì làm thế nào? Mà time của máy tính dưới 60ms không hoạt động chính xác cho nên mỗi lần có time even của máy tính bạn đã nhận được vài gói rồi. Nên nếu không có ký tự phân biệt gói sẽ rất khó để bóc tách
@namqn: đúng thế lần đầu làm RS232 = PIC (trước kia mình chỉ làm phía máy tính) chưa thử nghiệm nói mò nên sai mình vừa chỉnh lên 19200 đã chấp nhận được. Vấn đề 9 bit theo mình thì máy tính không có dạng này tuy nhiên mình không chắc lắm phải thử đã, sơ bộ kiểm tra bằng HyperTerminal của win không thấy hỗ trợ chế độ này. RS-422 lại gặp vấn đề phía máy tính nên vẫn phải dùng RS232 thôi

namqn
07-01-2009, 02:09 AM
...
@namqn: đúng thế lần đầu làm RS232 = PIC (trước kia mình chỉ làm phía máy tính) chưa thử nghiệm nói mò nên sai mình vừa chỉnh lên 19200 đã chấp nhận được. Vấn đề 9 bit theo mình thì máy tính không có dạng này tuy nhiên mình không chắc lắm phải thử đã, sơ bộ kiểm tra bằng HyperTerminal của win không thấy hỗ trợ chế độ này. RS-422 lại gặp vấn đề phía máy tính nên vẫn phải dùng RS232 thôi
Vì vậy những bộ chuyển đổi như dưới đây có lý do để tồn tại:
http://microboticsinc.com/rs232_rs422.html?gclid=CJyB-avR-pcCFYIA4wod3FTIDA
http://www.kmitl.ac.th/~kswichIT/Rs422/Rs422.html
http://www.bb-elec.com/Subcategory.asp?SubCategoryId=11&Trail=2&TrailType=Top

Thân,

binhbk2008
14-01-2009, 08:33 PM
sao giao tiếp usb và máy tính khó vậy nhỉ. Ai có tài liệu hưởng dẫn làm giao tiếp usb và máy tinh sử dụng giao diện trên máy tính là labview thì gửi giúp mình . Mình xin cảm ơn!

thuongshoo
25-06-2009, 10:04 AM
truyền ascii là sao? vì ascii là từ 0 đến 255 mà?
hay ý của bạn gì là truyền bảng chữ cái thôi?
khi đó chỉ dùng a->z, A-Z , còn các ký tự còn lại thì dùng làm ký tự điều khiển.

dữ liệu mình cần truyền lại từ 0 đến 255 luôn! nếu vậy có lẽ cần 1 hàm chuyển từ 0 đến 255 sang bảng chữ cái