PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp cổng COM và LPT

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 15-12-2006, 09:43 AM   #1
enti
Đệ 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
enti vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-12-2006, 06:49 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi enti View Post
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
#INT_RDA liên quan đến ngôn ngữ và trình biên dịch cụ thể (mà bạn chưa đề cập đến ở đây). Với PIC16, chỉ có một vectơ ngắt cho tất cả các ngắt, và bạn cần kiểm tra cờ ngắt tương ứng với sự kiện mà bạn cần xử lý (ở đây là cờ RCIF) trong chương trình xử lý ngắt chung đó. PIC16 sẽ nhận từng byte vào thanh ghi đệm, đây là thanh ghi đệm kép, có khả năng chứa được 2 byte trong khi byte thứ ba được dịch vào thanh ghi dịch. Nếu xử lý ngắt tốt, bạn hoàn toàn có thể nhận 6 integer. Khi truyền và nhận thì đều là mã nhị phân (có thể dài 8 hay 9 bit). Nếu truyền một byte có giá trị thập phân là 14 thì giá trị nhận được tại PIC sẽ là 14 thập phân hay 0E hexadecimal (nếu khác đi thì đâu có ý nghĩa gì nữa). Bạn chịu khó đọc phần 10 trong datasheet của PIC16F877A.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
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
Old 17-12-2006, 12:18 PM   #4
anhct
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
anhct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-12-2006, 12:24 PM   #5
anhct
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.
anhct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 09-07-2007, 06:08 PM   #6
vietvuong
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.
vietvuong vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 29-09-2007, 10:44 PM   #7
anhct
Nhập môn đệ tử
 
Tham gia ngày: Jul 2006
Bài gửi: 10
:
Trích:
Nguyên văn bởi vietvuong View Post
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.
hi hi, tôi làm cái này từ năm ngoái lúc còn làm đồ án tốt nghiệp, giờ thì quên gần hết rùi. Nếu bạn cần tham khảo code cho PIC có thể liên hệ với tôi qua email cũng được, tôi sẽ gửi code cho bạn tham khảo.
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.
anhct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 07-04-2008, 02:35 AM   #8
dinhbv_dkh
Nhập môn đệ tử
 
dinhbv_dkh's Avatar
 
Tham gia ngày: Dec 2007
Bài gửi: 3
:
Red face 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
dinhbv_dkh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-06-2008, 05:47 PM   #9
anhct
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.
File Kèm Theo
File Type: zip code.zip (3.3 KB, 2397 lần tải)
anhct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-06-2008, 05:50 PM   #10
anhct
Nhập môn đệ tử
 
Tham gia ngày: Jul 2006
Bài gửi: 10
:
Trích:
Nguyên văn bởi dinhbv_dkh View Post
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á !
Định dạng khung truyền là như nào nhỉ? Tôi không hiểu rõ ý bạn lắm.
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
anhct vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-12-2008, 12:02 PM   #11
giang27t1
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
giang27t1 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 14-12-2008, 06:39 PM   #12
trieucn
Đệ tử 1 túi
 
trieucn's Avatar
 
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.
trieucn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 15-12-2008, 09:49 AM   #13
Hard
Đệ tử 2 túi
 
Tham gia ngày: May 2006
Nơi Cư Ngụ: Huế
Bài gửi: 26
:
Send a message via Yahoo to Hard
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.
Hard vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-03-2010, 09:04 AM   #14
thuc101
Nhập môn đệ tử
 
Tham gia ngày: Mar 2009
Bài gửi: 8
:
cam on

Trích:
Nguyên văn bởi anhct View Post
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.







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
thuc101 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2010, 03:03 AM   #15
chau_2007
Đệ tử 1 túi
 
Tham gia ngày: Mar 2009
Bài gửi: 12
:
Trích:
Nguyên văn bởi thuc101 View Post
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
Thì viết trên máy tính chứ sao. Tùy ngôn ngữ chọn VB, C#, C++. Lời khuyên, đối với RS232, dùng C# là hay nhất.
chau_2007 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

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


Múi giờ GMT. Hiện tại là 09:45 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam