|
Tài trợ cho PIC Vietnam |
Giao tiếp cổng COM và LPT RS232, RS485 và LPT là những giao tiếp cơ bản và kinh điển khi mới học về vi điều khiển... |
|
Ðiều Chỉnh | Xếp Bài |
|
15-12-2006, 09:43 AM | #1 |
Đệ tử 2 túi
Tham gia ngày: Nov 2006
Bài gửi: 26
: |
Cho hỏi về giao tiếp RS232 của PIC16F877A
Hiện tôi dùng PIC16F877A để giao tiếp với máy tình qua cổng COM, chương trình trên PC viết bằng VB có chức năng lấy giờ từ internet và truyền cho PIC. Hiện tôi đang thắc mắc vấn đề này. PIC có một ngắt nhận RS232, #INT_RDA, nhưng tôi không biết khi nào thì ngắt này xảy ra, mỗi lần xảy ra nó nhận dữ liệu như thế nào, vì nếu PC truyền 6 số kiểu integer thì PIC nhận như thế nào, còn nếu PC truyền 1 biến chuỗi (ghép tất cả 6 biến kia lại ) thì PIC nhận như thế nào. và khi truyền thì nó truyền dữ liệu theo dạng nào. Nếu tôi truyền ngay số nguyên 14 thì PIC nhận là 0E? Ai biết về ngắt này thì giúp tôi 1 chút
|
15-12-2006, 06:49 PM | #2 | |
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
17-12-2006, 10:42 AM | #3 |
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. |
17-12-2006, 12:18 PM | #4 |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 10
: |
Đoạn code dưới PIC để nhận chuỗi từ máy tính:
Code:
#int_RDA RDA_isr() { delay_us(10); ss= getc(); if (ss==':') index= 0; if (ss=='\n') { st_nhan[index++]= ss; st_nhan[index]= '\0'; index= 0; } else st_nhan[index++]= ss; NGAT= 1; } thay đổi nội dung bởi: ngohaibac, 09-07-2007 lúc 11:54 PM. Lý do: cho code vào trong tag code |
17-12-2006, 12:24 PM | #5 |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 10
: |
Tôi truyền theo giao thức MODBUS ASCII nên khung truyền có dạng:
":" & "Khung can truyen " & "\n" ( Thực ra đây chưa phải khung chuẩn của MODBUS ASCII nhưng tôi chỉ gửi minh họa thôi ). Có thể dùng khung giao thức khác tùy bạn. Có gì thì các bạn góp ý cho mình nhé. Đây chỉ là một cách nhận dữ liệu thôi còn nhiều cách khác nếu bạn nào muốn biết thì mình sẽ gửi thêm. |
26-03-2010, 09:04 AM | #6 | |
Nhập môn đệ tử
Tham gia ngày: Mar 2009
Bài gửi: 8
: |
cam on
Trích:
neu nhu vay bac cho tui hoi them mot chut nha: nhận thì được rồi nhưng tui muốn hỏi thêm vè phàn gởi từ trên máy tinh xuống thì ta làm sao |
|
27-03-2010, 03:03 AM | #7 |
Đệ tử 1 túi
Tham gia ngày: Mar 2009
Bài gửi: 12
: |
|
09-07-2007, 06:08 PM | #8 |
Nhập môn đệ tử
Tham gia ngày: Jun 2007
Bài gửi: 1
: |
bạn anhct ơi, mình cũng đang làm và giao tiếp PIC 16F877A qua modbus. Bạn có thể cho mình xin địa chỉ email để khi nào có khó khăn mình hỏi bạn không. Rất mong nhận được hồi âm của bạn.
|
29-09-2007, 10:44 PM | #9 | |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 10
: |
Trích:
Mail: anhct84@gmail.com P/S: dạo này tôi ko lên diễn đàn mấy đâu, bạn nào quan tâm có thể liên hệ với tôi qua email, nếu tôi biết gì sẽ trao đổi hoặc post lại lên diễn đàn. thay đổi nội dung bởi: anhct, 08-04-2008 lúc 02:32 PM. |
|
07-04-2008, 02:35 AM | #10 |
Nhập môn đệ tử
Tham gia ngày: Dec 2007
Bài gửi: 3
: |
Giao diện Guide
Cho hỏi khi giao tiếp Rs232 mình có phải định dạng khung truyền dữ liệu từ giao diện không ? Giả sử truyền 4 bit , đầu tiên là D ..OK là kết thúc . Và quá trình nhận từ PIC lên cũng tương tự ??!! mình có sư dụng chương trình RS232 Communication của NG Hải Bắc, test với cổng COM thì được nhưng khi truyền thông PIC thì không thấy phản ứng gì ? Thế là sao nhỉ ?Làm với bác Gui này toát mồ hôi quá !
thay đổi nội dung bởi: dinhbv_dkh, 12-04-2008 lúc 04:28 AM. Lý do: sua lai |
08-06-2008, 05:47 PM | #11 |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 10
: |
Trong thời gian qua có một số bạn có liên hệ với tôi để xin code tham khảo, do hiện nay tôi không còn làm trong lĩnh vực này nữa và thực sự cũng hơi bận nên đôi khi không thể reply sớm cho các bạn, tôi gửi kèm file source code của chương trình tôi viết cho bạn nào quan tâm có thể tham khảo.
|
08-06-2008, 05:50 PM | #12 | |
Nhập môn đệ tử
Tham gia ngày: Jul 2006
Bài gửi: 10
: |
Trích:
Theo tôi là thiết lập chế độ truyền: start, data, stop; truyền mấy byte data.... Nếu thiết lập trên máy tính truyền và nhận như nào: start 1 bit, data 7 bit, stop 1,5 bit chẳng hạn thì ở dưới phần cứng (PIC bạn cũng phải thiết lập y như vậy) thì mới giao tiếp được. Tôi không biết rõ yêu cầu nên chỉ góp ý như vậy thôi |
|
14-12-2008, 12:02 PM | #13 |
Nhập môn đệ tử
Tham gia ngày: Dec 2008
Bài gửi: 1
: |
Mình cần một đoạn Code viết bằng VB6 cho việc giao tiếp giữa máy đọc mã vạch với PC
|
14-12-2008, 06:39 PM | #14 |
Đệ tử 1 túi
Tham gia ngày: Apr 2008
Bài gửi: 18
: |
Dùng CCS lập trình giao tiếp RS232 rất dễ. Tui đã làm thử qua rùi.
Với việc định nghĩa #use RS232 (...), PIC sẽ tự thêm các bit start, stop và VRC cho các bạn. Các bạn chỉ việc viết hàm chuyền và nhận byte. Thế là xong! Trong CCS có hàm gets(), dùng để nhận một byte truyền đến từ chân RX trên VDK. Hàm này sẽ chờ cho đến khi có dữ liệu truyền đến và lấy dữ liệu. Khi sử dụng hàm này, VDK ko làm bất cứ việc gì khác (mình đã test thử). Vì vậy, để tránh hiện tượng này, tốt nhất là ta sử dụng ngắt #int_RDA. Khi có dữ liệu truyền đến sẽ sinh ra một ngắt. Cách sử dụng ngắt này, anh ANHCT đã cho các bạn code rùi, mình ko cần phải viết ra nữa. Tuy nhiên, có thể sửa code đó bằng việc bỏ đi hàm delay. Nếu sử dụng nhiều giao tiếp RS232 trên 1 VDK, bạn có thể dùng hàm kbhit(). Hàm này sẽ phát hiện xem có dữ liệu truyền đến hay ko. Cách sử dụng hàm này thì như sau: if(kbhit()) { xau[i]=gets(); i++; ///...........(các bạn tự thêm code cho mình nha) } Còn việc gửi dữ liệu đi, trong CCS có một hàm là putc(). Hàm này có tác dụng là gửi một chuỗi dữ liệu lên chân TX của PIC. Đế có thể truyền một xâu qua chân TX, ta viết một hàm truyền như sau: void truyen(char c) { putc(c); } hàm trên chỉ truyền một ký tự lên chân TX. Để truyền một xâu, ta sử dụng hàm printf kết hợp với hàm truyen() dạng như sau: string XAU; ...... printf(truyen,"%s",xau); Còn việc tiếp theo là của các bạn. Chúc các bạn thành công!
__________________
Tiền là tiên là phật. Tiền là sức bật của ta. |
15-12-2008, 09:49 AM | #15 |
Đệ tử 2 túi
|
Hi,
Việc truyền số liệu giữa PC và PIC tui cũng có làm vài lần, nhân tiện chia sẽ với các bác chút kinh nghiệm. Giao tiếp có 2 kiểu, một là truyền số nhị phân hai là truyền khung dữ liệu. Truyền số nhị phân đơn giản chỉ là gửi từng byte lên/xuống giữa PC và PIC, trong trường hợp này chúng ta cần phải biết ý nghĩa của từng byte để xử lý và phải truyền phản hồi lại để kiểm tra có lỗi xãy ra hay không. Ví dụ PC gửi ký tự 'A' xuống PIC, khi PIC nhận được thì gửi ngược lên PC, PC kiểm tra nếu đúng là ký tự 'A' vừa gửi thì có nghĩa là việc truyền thành công. Kiểu thứ 2 là truyền dạng khung, số liệu được đóng theo từng khung và gửi lên/xuống giữa PIC và PC. Mỗi khung bao gồm ký tự Bắt Đầu (báo bắt đầu khung), ký tự Nhận Dạng (chỉ thị là khung Lệnh điều khiển hay là khung Dữ liệu), tiếp theo là Kích Thước của số liệu (số byte dữ liệu trong khung), tiếp theo là Mã kiểm tra (thường là mã Checksum) và cuối cùng là ký tự Kết Thúc Khung. Khi PC/PIC nhận xong một khung thì sẽ xử lý và kiểm tra lỗi, nếu không có lỗi thì gửi phản hồi lại ký tự 'ACK' để báo cho phía gửi biết là truyền thành công, ngược lại gửi ký tự 'NOACK' để báo là có lỗi xảy ra trong quá trình truyền và yêu cầu truyền lại. Tuỳ theo ứng dụng của các bác, kiểu truyền số liệu để chon phương pháp nào hiệu quả hơn. Chúc các bác sớm thành công. Thân ái. |
|
|
Similar Threads | ||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
Giao tiếp RS232 trên PC | ngohaibac | Giao tiếp cổng COM và LPT | 189 | 08-05-2024 08:10 PM |
Giao tiếp RS232 trên PC qua Matlab | ngohaibac | Giao tiếp cổng COM và LPT | 47 | 18-11-2015 03:51 PM |
cần mua bộ thu GPS có giao tiếp RS232 | kienvq | Tìm mua sản phẩm | 15 | 17-03-2011 11:25 PM |
Help! Dùng C để giao tiếp RS232 | dandiennang | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 6 | 15-03-2009 06:41 PM |
IO Ports và GUI dùng lập trình giao tiếp RS232 | ngohaibac | Matlab-Simulink & Labview & 20-Sim | 0 | 26-12-2006 10:07 PM |