Problem with receiving data from com port !! Please help me...
Chào mọi người !! Chả là mình đang làm 1 đề tài giao tiếp máy tính qua cổng com với PIC16F88 nhưng lại gặp vấn đề ở khâu lấy dữ liệu từ cổng COM để hiển thị lên PC.
Sau khi mình lập trình VB6 để nhận thì trên PC thu được như hình : [url=http://anh.us/3bc9accfcc.html]http://anh.us/thumbs-1257945521_S566_MI.jpg[/url [code] #include <16f88.h> #include <def_88.h> #device *=16 ADC=10 #fuses NOWDT, HS, PUT, NOLVP #use delay(clock=4000000) #use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B2,bi ts=9) #include <lcd_lib_4bit.c> // Thu vien ham cho LCD int16 temp; int8 nghin,tram,chuc,donvi; int1 mili_volt; float volt; void convert_bcd(int16 x) { nghin = x / 1000 +0x30; temp = x % 1000; tram = temp / 100 +0x30; temp = temp % 100; chuc = temp / 10 +0x30; donvi = temp % 10 +0x30; } void xuat_ra_lcd() { temp = read_adc() ; volt=(float)(temp*5)/1023; if(volt<1) mili_volt=1; else mili_volt=0; volt=volt*1000; convert_bcd((int16)volt); lcd_putcmd(0xc0);//con tro o dau hang 2 if(mili_volt==0) { lcd_putchar(nghin); lcd_putchar("."); } lcd_putchar(tram); lcd_putchar(chuc); lcd_putchar(donvi); if(mili_volt==1) printf(lcd_putchar," mV"); else printf(lcd_putchar," V"); } void convert_pc(int16 x) { nghin = x / 1000 ; temp = x % 1000; tram = temp / 100 ; temp = temp % 100; chuc = temp / 10 ; donvi = temp % 10 ; } void xuat_ra_pc() { temp = read_adc() ; volt=(float)(temp*5)/1023; if(volt<1) mili_volt=1; else mili_volt=0; volt=volt*1000; convert_pc((int16)volt); printf("%u",nghin); } void main( ){ trisb=0x00; LCD_init(); delay_us(100); LCD_Putcmd(0X80); printf(LCD_putchar,"DIEN AP U= "); setup_adc( ADC_CLOCK_INTERNAL ); Setup_ADC_ports (0); Set_ADC_channel (0) ; Delay_us (300); // delay 10 us while(1){ xuat_ra_lcd(); printf("%u\,%u\%u", nghin); } } còn đây là đoạn code VB của mình: Private Sub EXIT_Click() End End Sub Private Sub Form_Load() With MSComm1 MSComm1.CommPort = 1 ' Using Com1 MSComm1.Settings = "9600,n,8,1" MSComm1.RThreshold = 1 End With End Sub Private Sub MSComm1_OnComm() Dim s As String Dim s1 As String Dim s2 As String s = MSComm1.Input s1 = Left$(s, 4) Text1.Text = "Va = " & s1 & " v" s2 = Right$(s, 4) Text2.Text = "Vb = " & s2 & " v" End Sub Private Sub on1_Click() MSComm1.PortOpen = True End Sub ************************************************** ******* nhờ các cao thủ chỉ giáo! Mong ACE nhanh nhanh hồi đáp sớm ! Thanks!!!! ************************************************** ******* do mới post bài lân đầu nên chưa biết cách post code! ACE thông cảm !!! đây là sơ proteus http://anh.us/thumbs-1257946573_P707_hebhe.jpg |
Đây cũng là đề tài mà mình đang làm học kì này. Vấn đề hiển thị ra LCD mình đã làm ok tuy nhiên việc hiển thị lên PC cung gặp phải vấn đề như trên. Hi vọng các cao thủ giúp đỡ để tụi mình có thể hiển thị được giá trị điện áp lên PC thành công.
Theo mình thì vấn đề ở đây là chương trình VB, việc mình printf một loạt hiển thị lên PC thì ở đây PC sẽ nhận theo cơ chế nào với thuộc tính MSCOMM1.INPUT Thứ 2, khi gửi data đến cổng com thì pc nhận loại dữ liệu gì ?? Mong có sự hồi đáp kịp thời của các cao thủ để diễn đàn của chúng ta ngày càng phát triển hơn !!! |
hic !!! các BRO ơi giúp em với ! em đag cần gấp lắm !!! gần đến lúc thông đề tài zồi!!!
anh Bắc ơi anh Fal ơi |
Thử nhận dữ liệu với công cụ chuẩn xem sao?
1 Attachment(s)
Các bạn thử nhận dữ liệu gửi lên PC bằng công cụ gửi kèm này xem đã OK chưa nhé?
1. Nếu chưa nhận được --> Check lại hàm printf. (Mình nghĩ là đã OK) 2. Nếu nhận được --> Hàm nhận của bạn viết bằng VB có vấn đề. - Đầu tiên bạn cứ nhận cả chuỗi điện áp gửi lên đã. Xem có nhận được chưa? Rồi hãy tìm cách tách chúng ra. Mình không dùng VB nên không rõ cách tách lắm. Good luck! |
Mình đã thử viết 1 đoạn CCS đơn giản để gửi đén pc 3 kí tự abc như sau :
#include <16f88.h> #include <def_88.h> #device *=16 ADC=8 #FUSES NOWDT, HS, NOPUT, MCLR, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG #use delay(clock=4000000) #use rs232(baud=9600, parity= N,xmit=PIN_B5,rcv=PIN_B2, bits=9) #include <LCD_4BIT16F88edit.C> // Thu vien ham cho LCD void main(){ while (1) {trisb=0x00; lcd_init(); lcd_putcmd(0x80); printf(lcd_putchar,"meoakul"); printf("abc"); } } Tuy nhiên khi dùng cái Terminal của bạn thì nó hiển thị theo kiểu hex là 1 dãy các số 80 và mình tra bảng mã ASCII thì không có số đó. Còn đây là sơ đồ mô phỏng Proteus của mình : http://up.anhso.net/upload/20091114/..._meowin005.jpg Phải chăng khi mô phỏng dữ liệu ra PC sẽ không chính xác !!??? Có ai đã mô phỏng được rùi thì chỉ giáo giúp mình nhé !!! |
Khai báo RS232!
Trích:
Bạn sửa lại theo chuẩn 8 bits xem nha'! (Nhìn kỹ cái Terminal chút nhé!) |
Cảm ơn bạn, mình đã làm mạch thật và chạy thử. Kết quả là những gì mình gửi ở pc lên là đúng nhưng bên cạnh đó mình gặp phải vấn đề sau :
Ở ccs mình printf("meoakul") như trên, và khi dùng cái terminal của bạn thì receive lại dc là : <0><0><0>meoakul??.... vẫn còn kèm theo 1 số kí tự lạ như <0>, ?. Đây là trường hợp khi mình dùng đầy đủ 2 chân rx, tx của PIC. Tuy nhiên khi mình ngắt chân RB2( tức chân rx) của pic nối với max232 thì những gì hiển thị được trên terminal của bạn là hoàn toàn đúng như những j mình gửi lên từ ccs. Vậy phải chăng khi chỉ làm 1 tác vụ gửi dữ liệu từ pic lên pc thì tác vụ còn lại ( ghi dữ liệu từ pc xuống pic) là không cần thiết !!! Mong các bác chỉ giáo dùm !! thanks |
sao o có cao nhân nào ra tay chỉ giáo kẻ hậu bối này hết nhỉ !!!!!
|
Tất nhiên nếu bạn không dùng đến chức năng truyền từ PC xuống PIC thì chỉ cần nối chân RC6 qua Max232 lên chân 2 của COM.
Tuy nhiên không phải vì việc nối cả TX và RX lên COM mà xảy ra lỗi như bạn nói. Có thể lỗi đó là do mạch của bạn hoặc do cách lập trình. Thử dùng hàm printf("abc\n\r"); Xem có lỗi không nào? |
hehe, mình đã test thành công. Dường như đây là vấn đề phần cứng, sau khi mình làm lại mạch 1 cách cẩn thận thì mạch đã ok, truyền lên pc okie ( còn truyền từ pc xuống thì chưa test :D). Thanks bác Delfy.
|
hehe, đúng là biển học rộng thật, được cái này thì lại lòi ra cái khác o biết, Bác Delfy cho e hỏi là "\r" có ý nghĩa gì vậy !! Mấy cái \kí tự khác e bit nhưng tự nhiên gặp cái \r e lại o đoán ra dc nó có nghĩa gì !! Các bác chỉ giáo nhé !!!
|
Be careful!
Trích:
Qua đây, chắc bạn cũng rèn luyện cho mình tính cẩn thận hơn. :) Đúng là việc giao tiếp PIC với PC, nếu phần cứng mà không tốt thì dễ nhiễu lắm! Còn cái "\r" là gì thì bạn test thử biết ngay ấy mà. Thử truyền lên PC 3 dòng sau: Code:
printf("Xin chao\r"); Thân. |
Trích:
Thân, |
"\r" mean: Carriage Return
Trích:
Chức năng của nó là chuyển xuống dòng mới khi in. |
my idea !!
Sau khi nghiên cứu " THE ANSI C PROGRAMMING LANGUAGE" thì em xin edit lại ý kiến của bác Delfy 1 chút là: " \r= move to begin of newline", chứ o phải là chuyển xuống dòng mới như bác nói ( như bác nói thì \n mới chính xác). Em chỉ mạo muội có ý kiến vậy thôi, có j các bác chỉ giáo thêm nhé !!!
Thân !! |
Múi giờ GMT. Hiện tại là 12:50 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam