PDA

View Full Version : Xóa buffer RS232 help me !!!!


ThaoBinh90
16-04-2009, 04:31 PM
Bạn nào biết chỉ mình cách xóa bộ đệm của RS232 chỉ với. Mình đang lập trình giao tiếp PC và PIC qua RS232, khi nhận dữ liệu từ PIC lên mình muốn là dữ liệu vừa mới được PIC gởi lên vì vậy cần xóa bộ đệm trước thời điểm nhận dữ liệu. Ai giúp mình với :(.

tungtot_vl
16-04-2009, 04:45 PM
bạn hỏi khó hiểu quá, có ai mà xóa bộ đệm RS232 bao giờ đâu. bạn đưa code lên và giải thích thử xem

ThaoBinh90
17-04-2009, 11:30 AM
Code mình viết bằng VC++ dài lắm đưa lên rồi giải thích code chắc còn khó hiểu hơn.
Mình chỉ muốn hỏi là có cách nào dùng code VC++ xóa bộ đệm RS232 kô và làm như thế nào ?

ngohaibac
17-04-2009, 03:02 PM
Thiết lập cho đọc hết buffer mỗi lần có ngắt xảy ra là xong. Xem lại tham số của Mscomm.

ThaoBinh90
17-04-2009, 04:18 PM
Bạn nói đọc hết buffer mỗi lần ngắt là xong thì có vẽ không đúng yêu cầu của mình đang làm. Ví dụ bạn chưa đọc hết buffer của ngắt trước mà lại có ngắt tiếp theo xãy ra thì vẫn còn rác trong buffer. Ý mình là mỗi khi có ngắt xãy ra thì xóa buffer và buffer chỉ chứa dữ liệu của ngắt mới nhất mà thôi.
Mình mới viết giao tiếp PIC lần đầu nên còan nhiều điều chưa hiểu lắm. Bạn nói ngắt ở đây là ngắt trên PC hay ngắt trên PIC. Ngắt trên PIC khí có dữ liệu từ PC gởi xuống từ RS232 thì mình làm rồi. Còn ngắt khi có dữ liệu từ PIC gởi lên PC qua RS232 thì mình kô biết xãy ra khi nào hết và dùng cái gì để nhận biết.
Ai có tài liệu về ngắt này hay là buffer RS232 DB9 share mình với. thanks!

cskiller
17-04-2009, 06:33 PM
Bạn nói đọc hết buffer mỗi lần ngắt là xong thì có vẽ không đúng yêu cầu của mình đang làm. Ví dụ bạn chưa đọc hết buffer của ngắt trước mà lại có ngắt tiếp theo xãy ra thì vẫn còn rác trong buffer. Ý mình là mỗi khi có ngắt xãy ra thì xóa buffer và buffer chỉ chứa dữ liệu của ngắt mới nhất mà thôi.

1. Với tốc độ của PC so với PIC và RS232 thì dư sức đọc hết, thậm chí cả xử lý xong hết đống dữ liệu trước khi có ngắt mới xảy ra.
2. Về nguyên tắc Windows sẽ không cho phép ngắt liên tiếp RS232 khi ngắt trước đó chưa xử lý xong. Nên yên tâm nếu có ngắt xảy ra nghĩa là đã xử lý xong dữ liệu đã ngắt trước đó.

lequocbao
17-04-2009, 07:23 PM
Bạn cho biết cách bạn xử lý dữ liệu khi pc nhận dữ liệu từ pic lên?
Mình đoán bạn đang dùng mảng để nhận dữ liệu qua cổng com ,mà dữ liệu có chiều dài ngắn hơn chiều dài mảng mà bạn khai báo nên thành thử khi bạn nạp mảng lần tiếp theo thì các phần tử củ của mảng (các phần tử dài hơn) vẫn còn giữ giá trị củ phải không?
vd:
bạn khai báo mảng có chiều dài =8.

lần đầu:
pic gửi lên pc :12345678--->thì mảng =[12345678]//ok đúng như ý.

kế đến:
pic gửi lên pc:456--->thì mảng =[45645678]//sai ,đúng ra phải là 45600000

hi vọng có ích cho bạn!

ThaoBinh90
20-04-2009, 10:43 AM
@ cskiller: mình đồng ý với bạn là về tốc độ xử lý và buffer sẽ được đọc xong khi có ngắt tiếp theo. Nhưng mình không biết cách nào để nhận biết biết được có ngắt từ RS232, mình đang viết trên VC++ thì làm sao để thực hiện ngắt mong bạn giúp mình với. thanks.
@ lequocbao: "Bạn cho biết cách bạn xử lý dữ liệu khi pc nhận dữ liệu từ pic lên?" mình không hỏi câu này vì hiện tại mình đọc từng byte từ buffer ra, cảm ơn bạn.
- Hiện tại mình làm giao tiếp giữa PC và PIC: trên PC viết bằng VC ++ 6.0, trên PC gởi lệnh xuống PIC và chờ kết quả trả về từ PIC. PIC thực hiện xong thì gởi kết quả về lại PC. Ở đây là có sự bắt tay giữa 2 bên. Ví dụ:
PC : gởi 4+5 chờ PIC thực hiện gởi kết quả
PIC: thực hiện 4+5 = 9 trả về PC.
- Điều mình muốn mà chưa làm được là như vậy nè:
PC : gởi 4+5
PIC: thực hiện 4+5 = 9 trả về PC hoặc có thể dùng cho thực hiện một lệnh nào khác
PC có một thread riêng nhận kết quả từ PIC và nó không biết khi nào PIC gởi lên, thread này quét liên tục khi nào có ngắt từ RS232 (hiện mình chưa biết ngắt như thế nào)thì thực hiện đọc dữ liệu và thực hiện.
Cảm ơn và mong nhận được giúp đỡ từ mọi người.