![]() |
|
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 |
![]() |
#136 |
Nhập môn đệ tử
Tham gia ngày: Apr 2009
Bài gửi: 3
: |
Mình đã xử lý được rồi. thanks các bạn đã giúp đỡ
Chỉ cần tách các kí tự nhận được ra rồi hiển thị lên là OK. |
![]() |
![]() |
![]() |
#137 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
![]() Vẫn là vấn đề giao tiếp qua RS 232. Hôm trước đệ có làm giao tiếp PC - RS 232 -PIC theo một chiều từ PC - PIC, phần giao tiếp với cổng COM trên máy tình thì dùng C# và đã gửi được tín hiệu qua PIC rồi, tuy nhiên đoạn chương trình ở PIC đệ viết bằng CCS và nó chạy không theo ý đồ của đệ 'ý của đệ là sau khi check được LED nào thì LED đó sẽ sáng cho đến khi nào không check nữa' Vậy nhờ các huynh chỉ giáo!
Đây là đạn code: Code:
#include <16f877a.h> #include <def_877a.h> #use delay(clock=20000000) #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) #define may1 RD0 #define may2 RD1 #define may3 RD2 #define may4 RD3 #define may5 RD4 #define on 1 #define off 0 char ch; #INT_RDA Receive_isr() { if (kbhit()) { ch = getc(); if (ch=='a') may1 = on; if (ch=='b') may2 = on; if (ch=='c') may3 = on; if (ch=='d') may4 = on; if (ch=='e') may5 = on; if (ch=='f') may1 = 0; if (ch=='g') may2 = 0; if (ch=='h') may3 = 0; if (ch=='i') may4 = 0; if (ch=='j') may5 = 0; } } void main() { set_tris_d(0); portd=0b00000000; enable_interrupts(int_rda); enable_interrupts(GLOBAL); while (1) { } } và kèm theo C# and protues: thay đổi nội dung bởi: namqn, 26-04-2009 lúc 03:56 PM. Lý do: định dạng code |
![]() |
![]() |
![]() |
#138 | |
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 |
|
![]() |
![]() |
![]() |
#139 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
Em mô phỏng bởi Protues với cổng COMPIM, trên PC em tạo giao diện viết bởi C#, chương trình đã chạy và truyền tín hiệu qua PIC, nhưng khi check các boxcheck trên giao diện thì không theo ý muốn. Ví dụ: khi em check box 1 thì tương ứng với LED1 sáng sau đó chuyển sang check Box2 thì LED2 sáng [nhưng] LED1 lại tắt mất tương tự với các LED khác cũng vậy. Em đã nghiên cứu rất nhiều rồi!!!???
|
![]() |
![]() |
![]() |
#140 | |
Trưởng lão PIC bang
|
Trích:
Bạn nên dùng một thanh ghi đệm, khởi tạo giá trị của nó bởi giá trị của PORTD, sau đó cập nhật các bit của thanh ghi đệm này và ghi vào PORTD, mỗi khi bạn muốn cập nhật 1 bit nào đó của PORTD. 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 |
|
![]() |
![]() |
![]() |
#141 |
Đệ tử 1 túi
Tham gia ngày: Nov 2007
Bài gửi: 16
: |
chương trinh dùng ngắt RDA rồi còn dùng kbhit() chi nữa... cái này dùng VB6 thấy dễ lắm mà.
|
![]() |
![]() |
![]() |
#142 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
Đây là code trong C# của đệ:
Code:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespace WindowsApplication1 { public partial class Form1 : Form { public bool open = true; public Form1() { InitializeComponent(); Com4.DataReceived += new SerialDataReceivedEventHandler(Com4_DataReceived); } private void button_open_Click(object sender, EventArgs e) { if (open) { open = false; button_open.Text = "Đóng cổng"; label3.Text = "Cổng Com đang mở"; Com4.Open(); } else { open = true; button_open.Text = "Mở cổng"; label3.Text = "Cổng Com đang đóng"; Com4.Close(); } } private void button1_Click(object sender, EventArgs e) { Com4.Close(); Close(); } private void Com4_DataReceived(object sender, SerialDataReceivedEventArgs e) { String nhan = ""; // Luu du lieu nhan if (sender == Com4) { nhan = Com4.ReadExisting().ToString(); tBox_Recei.Text = tBox_Recei.Text +nhan; //Lỗi xuất hiện ở dòng này } } private void button_trans_Click(object sender, EventArgs e) { if (Com4.IsOpen) { Com4.WriteLine(tBox_trans.Text); tBox_trans.Clear(); } else MessageBox.Show("Cổng COM chưa mở! Hãy mở cổng COM"); } } } thay đổi nội dung bởi: TANDEM, 17-05-2009 lúc 09:36 AM. |
![]() |
![]() |
![]() |
#143 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
Sao không thấy huynh nào giúp mình vậy??!
|
![]() |
![]() |
![]() |
#144 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
Đến bây giờ đệ vẫn chưa tìm ra C# báo lỗi là do đâu? Khi đệ gửi chuỗi ký tự từ PIC lên nó cũng báo lỗi tương tự? Mong các huynh chỉ giáo!
|
![]() |
![]() |
![]() |
#145 |
Đệ tử 4 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Hanoi, Vietnam
Bài gửi: 78
: |
Hi bạn TANDEM!
Mình đã xem Form truyền nhận dữ liệu viết bằng C# của bạn. Mình có một vài góp ý nhỏ như sau: - Để có một Form truyền nhận dữ liệu tối ưu hơn thì bạn nên viết thêm phần cho phép người dùng lựa chọn cổng COM. Ở đây có thể máy tính của bạn là COM4 nên mình thấy bạn chỉ để là COM4. - Hàm truyền bạn dùng là Writeline, vậy thì hàm nhận cũng nên dùng là Readline. Ở đây có lẽ mục đích truyền nhận chắc cũng không quá phức tạp (chưa cần đến chuyển đổi cơ số) nên dùng hai lớp này là cũng OK rồi. Mình Test thử với Serial Port Monitor của CCS thì phần mềm của bạn vẫn ko thấy truyền nhận được. Bạn xem lại nhé! Có j ta trao đổi tiếp
__________________
Mechatronics Department University of Engineering and Technology, VNUH. |
![]() |
![]() |
![]() |
#146 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
Cám ơn bạn Delfy_Coltech! Hiện mình vẫn đang vật lộn với việc truyền nhận đó.
- Cho phép lựa chọn nhiều cổng COM cũng như các thông số khác thì mình đã viết được rồi. - Khi giao tiếp với Serial Port Monitor của CCS thì việc truyền nhận diễn ra hoàn toàn suôn sẻ, hai bên đều truyền và nhận đúng các số và ký tự. Khi truyền từ PIC đến thì cả Serial Port Monitor của CCS và C# đều hiện các ký tự lạ. Mình không hiểu lý do tại sao?? thay đổi nội dung bởi: TANDEM, 29-05-2009 lúc 12:14 AM. |
![]() |
![]() |
![]() |
#147 |
Nhập môn đệ tử
Tham gia ngày: Oct 2008
Bài gửi: 7
: |
có lẽ bạn xem lại khai báo baurate
mình cũng đang gặp vấn đề khi dung hspll để nhân xung thạch anh (10M*4) thì truyền nhận bị sai, có ký tự lạ ( nếu khai báo 10M thì truyền nhận chính xác) , có lẽ là sai baurate( ko biết có cần phải tính lại baurate ko nhỉ, ví dụ :nhân 4, hoặc chia 4 chăng hạn??) |
![]() |
![]() |
![]() |
#148 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
Mình chưa hiểu hết ý bạn thienkien. Mình đã thay đổi tần số bằng 10M rồi nhưng vẫn không đạt được kết quả truyền chính xác.
|
![]() |
![]() |
![]() |
#149 |
Nhập môn đệ tử
Tham gia ngày: Oct 2008
Bài gửi: 7
: |
hi TanDem! hôm qua mình chưa xem kỹ câu hỏi của bạn,bạn dùng thạch anh thực bao nhiêu thì khai báo bấy nhiêu thôi!! theo mình bạn nên thêm 1 ký tự để nhận biết kết thúc chuỗi :ví dụ ký tự '\13' chăng hạn: Com4.WriteLine(tBox_trans.Text+(char)13);
ban thử đoạn code dưới PIC này xem: #include<16f877a.h> #fuses HS,NOWDT,NOPROTECT #use delay(clock=20M) #use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8,pari ty=N) #use fast_io(b) int8 dodai,dem=0; int input_ready; char mang[50]; #int_rda void nhan() { //disable_interrupts(int_timer0); //if(kbhit()) mang[dem]=getc(); putc(mang[dem]); if(mang[dem]==0x0d) { dodai=dem; mang[dem]='\0'; input_ready=1; dem=0; } dem++; // enable_interrupts(int_timer0); } void main() { int16 i,j; input_ready=0; set_tris_b(0); enable_interrupts(global); enable_interrupts(int_rda); output_b(0); while(1) { if(input_ready==1) { printf("CHUOI=%s",mang); input_ready=0; dem=0; } //co the xuat ra portB de kiem tra bang led ne for(j=0;j<dodai-1;j++) { output_b(mang[j]); delay_ms(500); } } } nếu ko được bạn tải cái rs232tester về kiểm tra nhé thay đổi nội dung bởi: thienkien, 30-05-2009 lúc 07:30 AM. |
![]() |
![]() |
![]() |
#150 |
Đệ tử 2 túi
Tham gia ngày: Aug 2008
Bài gửi: 40
: |
Hi thienkien, dù sao cũng cám ơn bạn. Nhưng hình như tôi thì ở trái đất còn bạn thì ở sao hỏa rồi cả hai đều ngồi trên chiếc cân.... Sau đó thì thế nào nhỉ?
|
![]() |
![]() |
![]() |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
Cho hỏi về giao tiếp RS232 của PIC16F877A | enti | Giao tiếp cổng COM và LPT | 31 | 25-03-2016 10:14 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 |
giao tiep RS232 voi C | dangngoc | Giao tiếp cổng COM và LPT | 9 | 26-02-2012 02:25 AM |
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 |