View Single Post
Old 17-12-2006, 10:42 AM   #3
anhct
Nhập môn đệ tử
 
Tham gia ngày: Jul 2006
Bài gửi: 10
:
Tôi cũng mới làm một chút về phần truyền thông thông qua cổng RS232. Tôi làm là: đo đa kênh sử dụng PIC6F877A và truyền thông lên máy tinh dùng giao thức MODBUS ASCII. Lập trình cho PIC dùng CCS. Trên máy tính tôi dùng VB để tạo giao diện và giao tiếp. Chương trình trên VB gửi yêu cầu xuống PIC là đọc mấy kênh và cụ thể là những kênh nào. Theo tôi thấy yêu cầu của bạn tạm thời chỉ cần 1 chiều truyền xuống từ máy tính xuống PIC. Tôi thực sự không hiểu kỹ lắm về ngắt của PIC nên không dám mạn đàm nhiều, có điều tôi đã làm và truyền khá tốt nên tôi có góp ý một chút như sau ( nếu bạn lập trình dùng CCS thì có thể tham khảo còn nếu không thì tôi cũng cứ đưa lên biết đâu sẽ có bạn đọc và góp ý cho mình ):
Bạn truyền từ máy tính xuống có thể truyền theo chuỗi ( tôi đã làm và truyền rất tốt, tôi truyền khoảng trên 20 ký tự ), số của bạn là số nguyên 6 chữ số bạn đổi ra dạng string rồi gửi ra cổng COM. Tôi không biết bạn truyền thông qua cổng COM sử dụng lớp gì, có lẽ là MSCOMM; còn tôi thường dùng CWSerial của MS Studio.
Còn dưới PIC bạn dùng ngắt nhận #INT_RDA; tôi không hiểu kỹ lắm đâu nhưng tôi làm và nghĩ rằng ( nếu không đúng các bác góp ý hộ nhé ) khi có ký tự truyền tới bộ đệm thì sẽ xảy ra ngắt.
- Có thể dùng hàm getc() để nhận từng ký tự rồi lưu lại thành chuỗi sau đó bạn dùng hàm atoi() chẳng hạn để chuyển sang số dạng integer.
- Cũng có thể dùng hàm gets() để nhận cả chuỗi nhưng khi truyền từ máy tính kết thúc khung phải có ký tự '\r' (13), để kết thúc chuỗi thì PIC mới nhận đủ chuỗi được.
- Nếu cẩn thận hơn bạn có thể kiểm tra bộ đệm dùng hàm kbhit(), cái này tôi cũng đã dùng thử.
Không biết khi tôi post bài này bạn đã làm xong chưa nhưng tôi cũng đưa đoạn code nhận có ngắt nhận #INT_RDA để bạn tham khảo và góp ý nhé.

thay đổi nội dung bởi: anhct, 17-12-2006 lúc 12:34 PM.
anhct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn