PDA

View Full Version : Vấn đề giao tiếp RS232 <-->PC một số ký tự nhận đúng, một số ký tự nhận sai.


longtu
20-03-2012, 02:59 PM
Chào mọi người.
Vấn đề của mình như sau:
- Mình kết nối Max232 như sau: Xem hình: RS232 Communication.bmp
Lưu ý ở đây mình sử dụng Max232 loại SMD và các tụ điện loại ceramic Capcitor 100nF(104). Tuy nhiên, trong datasheet của Max232 nói rằng việc sử dụng tự không cực tính Ceramic là đuợc chấp nhận. Xem hình: Note(Max232 datasheet).bmp
- Đoạn code mình viết để Test việc giao tiếp RS232 đơn giãn như sau:

************************************************** ********/
#include <18F24K22.h>
#use delay(clock=20000000)//Crystall 20Mhz
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
//-------------INCLUDED FILES:
#include <historic.c>
#include <main.h>
Void main()
{
//-------------Enable Inpout/Output:

//-------------Enable Interrup vecter:
ENABLE_INTERRUPTS(INT_RDA);
enable_interrupts(global);

while(1)
{
//Do nothing!
}
}
//------------------------------------------------------------------------------
#INT_RDA
void Receive_isr()
{
char c;
c=getc();
delay_us(10);
putc(c);
}


Đoạn code này: PC gửi 1 ký tự nào đó xuống Microcontroller thì Microcontrller sẽ gửi trả lại ký tự đó. Sử dụng ngắt Rs232 làm việc này.
Vấn đề của mình là:Mình tử Test gửi 0, 1, 2, ...9 thì chỉ có một số ký tự đúng.
- Gửi 0 -- nhận 3E(sai) lẽ ra phải nhận 30.
- Gửi 1 -- nhận 3F(sai) lẽ ra phải nhận 31.
- Gửi 2 -- nhận 32(đúng)
- Gửi 3 -- nhận 33(đúng)
- Gửi 4 -- nhận 36(sai) lẽ ra phải nhận 34.
- Gửi 5 -- nhận 36(sai) lẽ ra phải nhận 35.
- Gửi 6 -- nhận 36(đúng)
- Gửi 7 -- nhận 37(đúng)
- Gửi 8 -- nhận 3E(sai) lẽ ra phải nhận 38.
- Gửi 9 -- nhận 3F(sai) lẽ ra phải nhận 39.
(Xem hình: Serial input-output monitor.bmp).

Mình thử đi thử lại nhiều lần, kết quả đều như vậy. Mình không rõ nguyên nhân là do đâu? bạn nào có kinh nghiệm chia sẽ giúp minh nhé?

PS: Mình đã thay IC Max232 khác kết quả vẫn không thay đổi(loại trừ hư IC Max232).

Cám ơn các bạn đã đọc bài.
Thân,

longtu
20-03-2012, 05:13 PM
Mình đã tìm ra giải pháp của vấn đề đã nêu. Bằng cách khai báo sử dụng thạch anh nội trong PIC, thì giờ đây việc giao tiếp ĐÚNG hoàn toàn.

#fuses INTRC,NOWDT,NOPROTECT,NOLVP
#use delay(clock=64MHZ)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)


Kinh nghiệm:
- Khi sử dụng thạch anh ngoài, có thể việc giao tiếp giữa PIC và PC không đúng do giá trị thạch anh mua ngoài chợ có thể không chính xác với thông số ghi...
- Có thể sử dụng thạch anh nội của PIC==>không cần thiết kế thêm phần thạch anh ngoài nữa.

Chia sẽ cùng các bạn.

Thân.

ngdnhanbk
28-03-2012, 07:48 PM
Vậy thì phương thức giao tiếp nào sẽ ít bị ảnh hưởng của thạch anh nhất nhỉ

hein_ts
05-04-2012, 12:08 AM
Hôm trước kiểm tra cho ông anh cũng bị tình trạng tương tự. Đo mãi mới phát hiện ra nguồn cấp vào max không đủ do hàn mạch ẩu
Lấy mỏ hàn rê lại hàng chân -> okies

rubik.hut
26-10-2012, 11:42 AM
Hiện nay mình cũng đang làm về phần truyền dữ liệu từ PC xuống PIC sử dụng RS232.
Trên PC mình lập trình bằng VB.net, mỗi lần gửi dữ liệu ra cổng COM là một số dạng Integer trong phạm vi [0-255]. Giữa 2 lần gửi delay tầm 10ms.
Mình xin thắc mắc câu hỏi sau:
1. Khi nhận thì PIC6f877a sẽ nhận dữ liệu kiểu gì?
VD: gửi số 1 (Integer) từ PC thì PIC sẽ nhận số 1 kiểu Int, hay '1' kiểu String, hay là nhận: 31H.
2. Nếu nhận 31H thì vd gửi số 100 xuống PIC nhận được những gì?

Mong các bạn giải đáp giúp mình. :x

nguyenthangcdt
16-04-2013, 09:37 AM
Mình đã tìm ra giải pháp của vấn đề đã nêu. Bằng cách khai báo sử dụng thạch anh nội trong PIC, thì giờ đây việc giao tiếp ĐÚNG hoàn toàn.

#fuses INTRC,NOWDT,NOPROTECT,NOLVP
#use delay(clock=64MHZ)
#use rs232(baud=19200, xmit=PIN_C6, rcv=PIN_C7)


Kinh nghiệm:
- Khi sử dụng thạch anh ngoài, có thể việc giao tiếp giữa PIC và PC không đúng do giá trị thạch anh mua ngoài chợ có thể không chính xác với thông số ghi...
- Có thể sử dụng thạch anh nội của PIC==>không cần thiết kế thêm phần thạch anh ngoài nữa.

Chia sẽ cùng các bạn.

Thân.
bạn ơi bạn cho mình hỏi bạn dùng pic loại gì mà thach anh nội lên tới 64mhz vậy tại mình ko biết ,mình mới chỉ dùng đến pic18 thôi(18f4431)