PDA

View Full Version : Giao tiếp PIC với máy tính


tyhon
27-04-2008, 12:19 PM
Hiện giờ em đang làm về phần lập trình giao tiếp giữa Pic(16f877a) với Pc qua RS232 dùng phần mềm CCS
Anh nào đã làm về phần này thì rất cần sự giúp đỡ
mail của em là qvinh_bk86@yahoo.com.vn
Rất mong thư!

uydanh
27-04-2008, 05:43 PM
Hiện giờ em đang làm về phần lập trình giao tiếp giữa Pic(16f877a) với Pc qua RS232 dùng phần mềm CCS
Anh nào đã làm về phần này thì rất cần sự giúp đỡ
mail của em là qvinh_bk86@yahoo.com.vn
Rất mong thư!

Giống như mình ! hehhe
Mình cũng đang làm cái này. Bạn tìm trên picvietnam 2 tài liệu này :
1. Về CCS của bạn Linh
2. Tài liệu dịch phần help CCS của txt
3. Đọc trực tiếp Help của CCS luôn (tương đối dễ hiểu).
Bạn tìm về đọc có gì không hiểu thì "quăng" lên đây, mới có người chỉ giúp.
Chứ theo kinh nghiệm "đi kiếm ăn" của mình, bạn cứ đặt câu hỏi chung chung kiểu này thì chỉ có "tôi ngàn năm đợi " thôi. hehehhehhehe

tyhon
28-04-2008, 08:40 AM
[QUOTE=uydanh;15827]Giống như mình ! hehhe
Mình cũng đang làm cái nà.

Em muốn chuyển tín hiệu tương tự ở bên ngoài vào pic rồi vào máy tính
thế bắt đầu có phải là lập trinh cho tín hiệu tương tự ấy thành số rồi mới chuyển vào máy tính phài không anh? Đến bước chuyển vào máy tính thì em không rõ
Mong anh chỉ giáo giúp em, em đang rất cần

uydanh
28-04-2008, 06:16 PM
PIC6F877a có tích hợp sẵn bộ ADC. Bạn chỉ cần biết cách sử dụng nó thôi . Hình như cũng đơn giản ,đặc biệt nếu viết bằng CCS (mà mình cũng chưa xài bộ ADC bao giờ hehehhe). Trong tutorial của bạn Linhnc hình như có ví dụ sử dụng bộ ADC thu thập nhiệt độ sử dụng IC LM335. Bạn down về xem thử.
Sau khi tín hiệu analog được chuyển thành dạng digital, bạn lại đẩy nó từ PIC lên máy tính qua giao tiếp cổng COM.
Như vậy bạn cần biết 2 phần :
1. Sử dụng bộ ADC trong PIC như thế nào.
2. Giao tiếp PIC với máy tính như thê nào.
Bao nhiêu đó chắc là đủ xài rồi. Mình cũng đang học thôi, còn rất "cùi bắp". Rất mong có thể hợp tác với bạn.

tyhon
28-04-2008, 08:53 PM
Sau khi tín hiệu analog được chuyển thành dạng digital, bạn lại đẩy nó từ PIC lên máy tính qua giao tiếp cổng COM.
Như vậy bạn cần biết 2 phần :
1. Sử dụng bộ ADC trong PIC như thế nào.
2. Giao tiếp PIC với máy tính như thê nào.
Bao nhiêu đó chắc là đủ xài rồi. Mình cũng đang học thôi, còn rất "cùi bắp". Rất mong có thể hợp tác với bạn.


Em giờ đã biết sử dụng sơ qua bộ ADC rồi (ví dụ như lập trình cho đầu vào tương tự còn đầu ra cho hiển thị Led .Khi thay đổi biến trở ở đầu vào thì các led cũng sáng tắt tương ứng)
Còn về phần giao tiếp với pic với máy tính thì em chưa biết mặc dù đã download các tài liệu của anh linhnc về đọc rồi
Nếu anh có tài liệu gì thêm thì có thể cho em tham khảo
Rất cảm ơn anh!

uydanh
28-04-2008, 11:44 PM
Rồi vậy bạn và mình cùng học luôn nha ! Cứ xem mình học giao tiếp máy tính bằng cổng COM trước bạn vài ngày đi, bây giờ coi như trả bài vậy. hehehe
Đầu tiên, mình lập trình bằng Visual Basic. Bạn biết Visual basic không? Nếu biết thì tìm đọc 1 trong các cuốn sau :
1. Nếu ở Sài Gòn thì bạn mua cuốn Đo lường Điều Khiển máy tính của Thầy Nguyễn Đức Thành về đọc ( BKtpHCM). Cuốn này dạy rất nhiều giao tiếp : cổng COM, modem, card ISA, PCI.... Bạn đọc phần giao tiếp nối tiếp. Đọc để có hiểu biết sơ sơ về nó rồi bắt đầu làm cái mạch test thử viết chương trình truyền nhận. Mình nghĩ là đơn giản nhưng làm thực tế thì đủ chuyện xảy ra hết.
2. Nếu ở Hà Nội thì mua cuốn Đo Lường Điều khiển máy tính và cuốn Lập trình ghép nối máy tính trong Windows của thầy Ngô Diên Tập.
Nếu bạn chưa biết Visual Basic thì hơi căng. Bạn phải đọc về nó trước đã rồi mới tính tiếp.

Table
29-04-2008, 12:55 AM
Hiện giờ em đang làm về phần lập trình giao tiếp giữa Pic(16f877a) với Pc qua RS232 dùng phần mềm CCS
Anh nào đã làm về phần này thì rất cần sự giúp đỡ
mail của em là qvinh_bk86@yahoo.com.vn
Rất mong thư!


Trước tiên nhưng phần này đã được nói rất nhiều trong diễn đàn, bạn chịu khó đọc lại và kiếm ha.

Cũng có thể bạn ko phải là dân điện tử nên mới hỏi thế, nêu bạn cần kiến thưc để làm gấp thì có thể hẹn ở Bk để nói chuyện. mình sẽ hướng dẫn bạn nhưng bước cơ bản để làm trên vb6 và ở 877. Mình là dân Cơ khí, hay đi học ở C4, C5.

thân.

tyhon
29-04-2008, 06:57 AM
Trước tiên nhưng phần này đã được nói rất nhiều trong diễn đàn, bạn chịu khó đọc lại và kiếm ha.

Cũng có thể bạn ko phải là dân điện tử nên mới hỏi thế, nêu bạn cần kiến thưc để làm gấp thì có thể hẹn ở Bk để nói chuyện. mình sẽ hướng dẫn bạn nhưng bước cơ bản để làm trên vb6 và ở 877. Mình là dân Cơ khí, hay đi học ở C4, C5.

thân.



Thực sự mình đang rất gấp, ban có thể cho mình số điện thoại để mình liên lạc với bạn được không. Cảm ơn bạn nhiều
Rất mong thư!

tyhon
29-04-2008, 07:11 AM
[QUOTE=uydanh;15867]Rồi vậy bạn và mình cùng học luôn nha ! Cứ xem mình học giao tiếp máy tính bằng cổng COM trước bạn vài ngày đi, bây giờ coi như trả bài vậy.


Thực sự em chưa lập trình với VB mà thời gian lại đang rất gấp, em hỏi câu này hơi ngố nhưng có phải là lập trình bằng VB là để tạo giao diện cho ta biết quá trình truyền nhân giữa Pic và máy tính không anh. Em hơi lơ tơ mơ chỗ này anh có thể nói rõ hơn đi
Thời gian rất gấp mà anh bảo học lập trình VB thì đâu có dễ ạ

uydanh
02-05-2008, 09:36 AM
Ngày nào cũng lên diễn đàn hết. hehehheh
Nhưng mình thấy bạn Table nói cũng đúng. Bạn học VB trước đi. Rồi tìm các tài liệu đọc là biết làm liền à. Tại vì mấy cái này trên diễn đàn có hết rồi. Bạn chịu khó tìm, đọc là biết làm liền.
Trong quá trình thực hiện, có gì không hiểu bạn cứ post lên đây, sẽ có các "cây đại thụ" giúp đỡ.
Chúc bạn thành công. Hihihi

tyhon
02-05-2008, 04:48 PM
[QUOTE=uydanh;15921]Ngày nào cũng lên diễn đàn hết. hehehheh
Nhưng mình thấy bạn Table nói cũng đúng. Bạn học VB trước đi. Rồi tìm các tài liệu đọc là biết làm liền à.



Anh ơi, có phải để làm giao tiếp giữa Pic(16f877a) và máy tính thì mình phải có giao diện lập trình cho VB là chỉ để kiểm tra quá trình truyền nhận phải không ạ! Em có download trên mạng được giao diện VB như sau và nhờ anh nói qua chức năng của nó hộ em
Và nếu mà chỉ là để tạo giao diện để kiểm tra quá trình truyền nhận thì mình có thể dùng chương trình khác được không anh!

uydanh
02-05-2008, 06:19 PM
Cái chương trình bạn gửi đúng là chỉ kiểm tra quá trình truyền nhận thôi. Tức là khi bạn truyền xuống cái gì thì nó nhận đúng cái đó là OK.
Nhưng giao tiếp máy tình ko phải chỉ để kiểm tra quá trình truyền nhận như bạn nói. Bạn tưởng tưởng như thế nào. Bạn làm cái mạch đo lường và điều khiển nhiệt độ. Nhiệt độ bạn cài đặt cũng như đo về có thể bạn sẽ cho hiển thị trên led 7 đoạn, trên LCD...... Thì giao tiếp máy tính bạn cho các thông số đó hiển thị trên máy tính. Khi bạn đặt trên máy tính là 100 độ C thì bạn phải làm sao cho con PIC của hiểu là bạn cần điều khiển nhiệt độ cái lò là 100 C.... Rồi cũng như vậy, bạn muốn vẽ quá độ của lò nhiệt, bạn hoàn toàn có thể nhiệt độ rồi truyền các giá trị nhiệt độ đó lên máy tính, sử dụng các lệnh vẽ để vẽ các đáp ứng ra cho bạn.
Như vậy đầu tiên bạn phải biết bạn muốn giap tiếp máy tính với bên ngoài qua cái gì ? Trên máy tính có các cổng ra/vào giao tiếp với bên ngoài như là COM, cổng máy in.....
Mới bắt đầu học mình thấy người ta thường học giao tiếp qua cổng COM nên mình cũng chọn nó luôn.
Trên máy tính, bạn phải sử dụng một ngôn ngữ lập trình nào đó mà nó hỗ trợ cho bạn việc tạo giao diện và đặc biệt hơn là nó hỗ trợ bạn việc truyền qua cổng COM như thế nào. Có nghĩ là, muốn truyền cái gì đó qua cổng COM, thì bạn chỉ viết một đoạn code nhỏ nhỏ , còn quá trình từ đoạn code nhỏ nhỏ đó làm sao mà nó truyền qua cổng COM được thì bạn ko cần quan tâm, bạn chỉ cần biết đầu vào và đầu ra, khúc chính giữa ra sao thì bạn tạm gác qua một bên.
Hiện nay có nhiều ngôn ngữ lập trình hỗ trợ việc đó : VB, VC, Delphi.... Mình thấy người mới học hay xài VB. Mình cũng là người mới học nên xài VB luôn.
Đến bây giờ chắc bạn đã hiểu được phần nào. Chúc bạn thành công.

tyhon
02-05-2008, 08:20 PM
Hiện nay có nhiều ngôn ngữ lập trình hỗ trợ việc đó : VB, VC, Delphi.... Mình thấy người mới học hay xài VB. Mình cũng là người mới học nên xài VB luôn.
Đến bây giờ chắc bạn đã hiểu được phần nào. Chúc bạn thành công.[/QUOTE]


Cảm ơn anh nhiều
Vâng qua sự phân tích của anh thì h em cũng đã hiểu được phần nào về giao tiếp giữa pic và máy tính rồi.Tức là giao tiếp không chỉ là quá trình truyền nhận mà thông qua máy tính thì nó có thể điều khiển, vẽ đồ thị ...
Em đang dùng Labview để làm điều đó và giao tiếp qua cổng COM
Giờ em có tín hiệu tương tự(ví dụ như là nhiệt độ ở bên ngoài) em muốn truyền tín hiệu đó qua Pic(16f877a) rồi lên máy tính (ví dụ như là dùng Labview để vẽ đồ thị sau từng khoảng thời gian nhất định) .Nếu em dùng ngôn ngữ CCS để viết chương trình thì có phải là chuyển từ tín hiệu tương tự ấy sang số rồi mới truyền lên máy tính, sau đó thì cái Labview ấy mới vẽ đồ thị đúng không anh?
Nếu như vậy thì con Pic chỉ là lập trình cho nó truyền dữ liệu lên máy tính là được đúng không ạ?còn phần vẽ là ta phải làm trên Labview?
Nếu thế thì anh có thể giúp em viết chương trình trên CCS trong quá trình truyền lên máy tính, phần chuyển từ tương tự sang số thì em đã làm được rồi
Anh có ví dụ nào thì có thể cho em để em tham khảo!
Rất mong thư!

uydanh
02-05-2008, 11:42 PM
Như đã nói trên, mình cũng đang học cái này. Về cơ bản, việc truyền từ PIC lên máy tính rất là dễ, chỉ cần bạn vào phần help CCS và gõ RS232 thì nó sẽ ra các lệnh cần thiết cho bạn. Chỉ có một vài lệnh thôi.
Tuy nhiên qua quá trình tự tìm hiểu, mình thấy có rất nhiều điều làm ra thực tế mới thấy phức tạp. Cũng sử dụng 1 lệnh đó mà có người truyền được ,có người truyền không được, điều đó hoàn toàn phụ thuộc vào kinh nghiệm thực tế của bạn. Ở mỗi ứng dụng khác nhau chúng ta có những "hiệu chỉnh" , "thêm ít mắm, ít muối" vào cho công việc của bạn thành công.
Bạn nên tự mình mày mò và tìm hiểu thì tốt hơn nhiều và phù hợp hơn cho quá trình học tập của bạn.

tyhon
03-05-2008, 01:32 PM
Anh có thể gửi cho em ít code về nó được không ạ, chứ anh nói thế này thì chung chung quá!
Cảm ơn anh!

uydanh
03-05-2008, 02:07 PM
Đoạn chương trình PIC gửi một ký tự

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, parity=N, xmit=pin_C6, rcv=pin_C7, bits=9)
char c;
void main()
{
putc(c);
while(1)
{
}
}


Đoạn trên tôi gửi số 1 ký tự ( chẳng hạn 1 số từ 0 đến 255) lên máy tính. Trên máy tính tôi nhận số đó và đổi ra số Hex hiện ra ô receivetxt thì trong chương trình con mscomm_oncomm() tôi viết như sau :

Private Sub MSComm1_OnComm()
Dim buffer() As Byte
Dim j1 As String
If MSComm1.CommEvent = comEvReceive Then
buffer = MSComm1.Input
If buffer(0) < 16 Then
j1 = "0" & Hex(buffer(0))
Else
j1 = Hex(buffer(0))
End If
txtreceive.Text = j1
End If
End Sub

còn MScomm1_oncomm() là gì thì chắc bạn phải đọc thêm trong sách !
Chương trình trên để truyền 1 ký tự lên máy tính. Hoàn toàn tương tự bạn lại thêm một lệnh putc() như vậy nữa để truyền ký tự thứ 2 lên máy tính. Thế nhưng thực tế bạn lại không thể truyền được ký tự thứ 2 này vì tốc độ xử lý của PIC6F877a đáp ứng ko kịp (có lẽ vậy), nên giữa 2 lệnh putc() này bạn thêm một lệnh delay một khoảng thời gian nào đó thì mới truyền đúng được. Đó là một ví dụ nhỏ để chứng tỏ với bạn rằng chỉ có chính mình xoắn tay vào làm nó thì mới thành công được.

mamie86
03-05-2008, 09:36 PM
Mình cũng đang làm giao tiếp với cổng COM nhưng có một số điều chưa rõ, mong các bạn chỉ thêm.
Chương trình bạn uydanh trền 1 byte lên PC, thế khi truyền nhiều byte ( putc (byte1); putc(byte2) ; ... ) thì trong vb xử lý như thế nào nhỉ ? Trong chương trình bạn UYDANH mình sửa lại như sau có đúng không?

Private Sub MSComm1_OnComm()
Dim buffer() As Byte
Dim j1,j2 As String
If MSComm1.CommEvent = comEvReceive Then
buffer = MSComm1.Input
j1 = cstr(buffer(0))
j2 = cstr(buffer(1))
txtreceive1.Text = j1
txtreceive2.Text = j2
End If
End Sub
(.RThreshold = 1 ; .InputLen = 0)
Kết quả : chỉ xuất dữ liệu byte2 lên ô :txtreceive1.Text,
còn ô : txtreceive2.Text thì bằng 0
Làm thế nòa để tách từng byte trên PC nhi?

uydanh
03-05-2008, 11:54 PM
Bạn đặt Rthreshold bằng 1, Inputlen=0 có nghĩa là cứ nhận được 1 byte thì xảy ra ngắt, biến buffer sẽ chứa toàn bộ bộ đệm thu cổng COM rồi xóa toàn bộ bộ đệm thu đó.
Nên khi bạn gửi byte1 lên thì mscomm_omcomm xảy ra buffer(0) chứa byte1 đó. Sau đó xóa byte1 vừa nhận trong bộ đệm thu.
Bạn lại tiếp tục gửi byte2 lên, quá trình được lặp lại, buffer(0) chứa byte2 còn buffer(1) ko chứa gì hết nên bằng 0.
Mình nghĩ là như vậy.
Bạn chỉ cần sửa lại Rthreshold bằng 2 để nhận 2 byte rồi mới ngắt rồi xử lý luôn một lần. Nếu không bạn phải khai báo cái mảng buffer của bạn là Static (mình chỉ nghĩ thế thôi chứ chưa thử).
Cách làm trên là của thầy tôi dạy. Tôi nghĩ là đúng ko thể sai được. Nhưng thực tế thì tui nhận lâu lâu vẫn bị sai.
Để khắc phục, ở dưới PIC tôi gửi lặp lại khoảng 3 lần cho chắc. Xác suất gửi đúng là tăng lên rất nhiều dù bạn có gửi bao nhiêu byte đi nữa.

namqn
04-05-2008, 12:53 AM
...
Cách làm trên là của thầy tôi dạy. Tôi nghĩ là đúng ko thể sai được. Nhưng thực tế thì tui nhận lâu lâu vẫn bị sai.
Để khắc phục, ở dưới PIC tôi gửi lặp lại khoảng 3 lần cho chắc. Xác suất gửi đúng là tăng lên rất nhiều dù bạn có gửi bao nhiêu byte đi nữa.
Tại sao thầy của bạn không đề cập đến các biện pháp bắt tay, các biện pháp chống và sửa sai? Nếu tôi cảm thấy việc truyền thông tin không đảm bảo, tôi thường dùng cách gửi trả lại những gì vừa nhận được, như vậy bên phát sẽ biết được dữ liệu có được nhận đúng hay không và quyết định có cần gửi lại dữ liệu đó hay không.

Thân,

uydanh
04-05-2008, 02:04 AM
Thầy em có đề cập hết chứ anh Nam. Lý thuyết thì thầy nói hết nhưng chương trình mẫu thì thầy chỉ viết cho trường hợp ko bắt tay thôi. Còn bắt tay thì tự sinh viên nguyên cứu thêm. Do em mới học nên cùi bắp. Thực tế sau vài lần truyền sai, em cũng đã nghĩ đến chuyện phải "bắt tay " rồi.
Cái cách của anh Nam nói trên, em thấy rất hay. Em sẽ thử nó. Thanks anh Nam.

tyhon
04-05-2008, 09:48 AM
[/code]
Đoạn trên tôi gửi số 1 ký tự ( chẳng hạn 1 số từ 0 đến 255) lên máy tính.

Chương trình trên để truyền 1 ký tự lên máy tính. Hoàn toàn tương tự bạn lại thêm một lệnh putc() như vậy nữa để truyền ký tự thứ 2 lên máy tính. Thế nhưng thực tế bạn lại không thể truyền được ký tự thứ 2 này vì tốc độ xử lý của PIC6F877a đáp ứng ko kịp (có lẽ vậy), nên giữa 2 lệnh putc() này bạn thêm một lệnh delay một khoảng thời gian nào đó thì mới truyền đúng được. Đó là một ví dụ nhỏ để chứng tỏ với bạn rằng chỉ có chính mình xoắn tay vào làm nó thì mới thành công được.[/QUOTE]


Anh ơi, nhưng khi em vẽ bằng Proteus để kiểm tra quá trình truyền nhận thì không thấy hiện lên gì cả.Ở đây em dùng vỉtual terminal để giả lập (tức cho hiện lên màn hình ).Anh xem hộ em
Cảm ơn anh nhiều nhiều!

uydanh
04-05-2008, 12:06 PM
Chương trình trên đã được tôi test ngoài mạch thực. Chắc chắn truyền được. Bạn nên làm một cái mạch test hoàn chỉnh để học.
Vì mình cũng đang làm cái này nên mình biết : chúng ta ai cũng muốn học thật nhanh nhưng thực tế nó lại "lung tung" chuyện, không thể ngồi đọc sách, đọc hướng dẫn mà thành công được.
Với lại cái protues ko phải cái gì cũng mô phỏng được đâu bạn à.

uydanh
04-05-2008, 12:09 PM
Trong chương trình trên, nếu ở dưới bạn gửi ký tự c=12 thì trên máy tính bạn nhận được trong ô txtreceive là 0C.
Bạn cố test lại đi.

tyhon
04-05-2008, 09:24 PM
Chương trình trên đã được tôi test ngoài mạch thực. Chắc chắn truyền được. Bạn nên làm một cái mạch test hoàn chỉnh để học.
Vì mình cũng đang làm cái này nên mình biết : chúng ta ai cũng muốn học thật nhanh nhưng thực tế nó lại "lung tung" chuyện, không thể ngồi đọc sách, đọc hướng dẫn mà thành công được.
Với lại cái protues ko phải cái gì cũng mô phỏng được đâu bạn à.


Anh ơi!anh gửi cho em cái code kia thì có phải là khi ta gửi một ký tự thì máy cũng sẽ nhận một ký tự.Vậy mình muốn kiểm tra(mô phỏng )trên máy thì phải dùng Proteus để làm chứ anh
mô phỏng đúng thì mới làm được mạch thực chứ, anh cho em hỏi giả sử nhử chương trình kia mình muốn mô phỏng thì cần phải vẽ như thế nào?
Có phải anh bảo là test mạch thực nhưng em mới bắt đầu anh có thể hướng dẫn em
Cảm ơn anh nhiều!

uydanh
04-05-2008, 11:32 PM
Mĩnh đã từng thử trên protues các mạch đơn giản như nhấp nháy led, hiện thị led 7 đoạn... chứ chưa bao giờ mô phỏng quá trình truyền nhận nên không biết. Mà mình nghĩ tốt nhất bạn nên làm 1 cái mạch thực , không quá khó đâu. Bạn làm cái mạch test hết sức bình thường gồm : nguồn, thạch anh, các led nối port v.vv... rầt bình thường. Còn phần mạch truyền lên máy tính thì bạn mắc đúng theo mạch trong trang sau đảm bảo OK http://www.winpicprog.co.uk/pic_tutorial_rs232_board.htm
Bạn cẩn thận khi vẽ mạch in thì coi chừng cái cổng COM bạn rất dễ vẽ ngược chân. Bạn chú ý.
À, thêm một cái nữa . Nhiều người đã từng làm với protues đã nói rằng : mô phỏng với protues không phải lúc nào cũng đúng.

tyhon
05-05-2008, 07:19 AM
Thanks anh nhiều ! Cái này anh vẽ mạch in trên ORCARD ah
Em sẽ bắt tay vào làm ngay

tyhon
05-05-2008, 08:43 PM
Đoạn chương trình PIC gửi một ký tự

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, parity=N, xmit=pin_C6, rcv=pin_C7, bits=9)
char c;
void main()
{
putc(c);
while(1)
{
}
}

Chương trình trên để truyền 1 ký tự lên máy tính. Hoàn toàn tương tự bạn lại thêm một lệnh putc() như vậy nữa để truyền ký tự thứ 2 lên máy tính. Thế nhưng thực tế bạn lại không thể truyền được ký tự thứ 2 này vì tốc độ xử lý của PIC6F877a đáp ứng ko kịp (có lẽ vậy), nên giữa 2 lệnh putc() này bạn thêm một lệnh delay một khoảng thời gian nào đó thì mới truyền đúng được. Đó là một ví dụ nhỏ để chứng tỏ với bạn rằng chỉ có chính mình xoắn tay vào làm nó thì mới thành công được.


Anh ơi ! đây là chương trình gửi 1 ký tự lên máy tính.
Anh cho em hỏi là mình có tín hiệu tuơng tự ở bên ngoài vào adc ở trong pic thì ta được dạng số.Ở đây em vẫn chưa hiểu là mình truyền cái khung số này (vi dụ sau khi qua adc ta được 10011001) hay là truyền dạng ký tự(mã ASCII) lên máy tính.Nếu mà truyền dạng ký tự hay chuỗi thì mình lại phải viết chuơng trình cho nó chuyển từ số sang ký tự hay là chuỗi rồi mới truyền lên máy tính hả anh?
Rất mong thư!

uydanh
06-05-2008, 10:39 AM
Bạn truyền sao cũng được ! Nó tùy vào quy định của bạn thôi.
Thí dụ bạn muốn truyền số 3 lên máy tính, bạn có thể truyền giá trị 3 tức là putc(3), lúc đó nó sẽ truyền chuổi bit 00000011. Còn nếu bạn truyền mã ascii thì bạn phải truyễn mã 33H tức là putc(0x33), lúc đó nó sẽ truyền chuổi bit 00110011.
Như vậy truyền bằng cách nào đi nữa thì cũng chỉ có một chuổi bit mà thôi. Do đó trên máy tính bạn phải viết chương trình thu nhận cho đúng. Thí dụ bên dưới bạn putc(3) thì trên máy tính bạn nhận số 3, nhưng nếu bạn truyền theo ascii putc(0x33) thì trên máy tính bạn lại nhận 33H, muốn ra giá trị 3 thì bạn có thể làm một phép trừ 33H-30H chẳng hạn. Nói chung hoàn toàn do bạn quy định, truyền thế nào thì phải có cách nhận thích hợp thế đó.
Còn việc chuyển từ số sang ký tự hay chuổi như bạn nói là không có ý nghĩa. Vì dù ký tự hay số thì đều là một chuổi bit hết . Putc() là 1 byte lên máy tính.

tyhon
06-05-2008, 05:52 PM
Thanks anh nhiều nhiều
Ah trao đổi với anh lâu rồi nhưng vẫn chưa biết anh ở đâu nhỉ ?
Nếu có thể rất vui được gặp anh!

tyhon
07-05-2008, 04:53 AM
Mĩnh đã từng thử trên protues các mạch đơn giản như nhấp nháy led, hiện thị led 7 đoạn... chứ chưa bao giờ mô phỏng quá trình truyền nhận nên không biết. Mà mình nghĩ tốt nhất bạn nên làm 1 cái mạch thực , không quá khó đâu. Bạn làm cái mạch test hết sức bình thường gồm : nguồn, thạch anh, các led nối port v.vv... rầt bình thường. Còn phần mạch truyền lên máy tính thì bạn mắc đúng theo mạch trong trang sau đảm bảo OK http://www.winpicprog.co.uk/pic_tutorial_rs232_board.htm
Bạn cẩn thận khi vẽ mạch in thì coi chừng cái cổng COM bạn rất dễ vẽ ngược chân. Bạn chú ý.
À, thêm một cái nữa . Nhiều người đã từng làm với protues đã nói rằng : mô phỏng với protues không phải lúc nào cũng đúng.



Em trước đây chỉ làm với 8051 về cách hiển thị led đơn giản nên chỉ cắm trên bo chứ không làm mạch in giờ thời gian rất gấp nên gặp khó khăn . Khi em vẽ layout thì nó cứ đòi add linh kiện vào nhưng em không biết chọn thế nào mong anh giúp đỡ.
Anh cho em hỏi thêm là mạch sau thì các chân rc0-rc7 là của pic hay chỉ là jum để pic cắm vào thôi à, nếu là jum thì khi hai chân rc6 và rc7 nối với chân của pic thì nối như thế nào, em vẫn chưa tưởng tượng ra

uydanh
07-05-2008, 01:42 PM
Nói về cái mạch : mạch dùng ICMax232, các chân nguồn, chân nối tụ bạn nối giống y hết như trên. Hai chân RC6 và RC7 là 2 chân truyền nhận của PIC6f877a, bạn cứ vẽ layout nối vào 2 chân 9 10 của MAX232 giống như hình trên là được hoặc bạn nối jupm cũng OK.
Về layout : mình thường vẽ trực tiếp trên layout luôn chứ vẽ trên capture cis rồi chuyển qua nó hay báo lỗi do kiểu chân khai báo bên capture cis ko có bên layout. Nên mình vẽ trực tiếp bên layout luôn. Cần chân linh kiện nào thì lấy nó ra. Bạn đọc thêm các tài liệu hướng dẫn để vẽ layout.
Bạn tải file bên dưới về rồi add vào thư viện layout, nó có gần như đầy đủ các linh kiện thông dụng.
Chúc bạn thành công.

tyhon
08-05-2008, 10:04 PM
Code:


#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, parity=N, xmit=pin_C6, rcv=pin_C7, bits=9)
char t;
void main()
{
printf("danh vao ky tu de hien thi");
do
{
t=getc();
putc(t);
}while(1);
}.


Anh ơi , với code này nếu em nạp vào pic và sau đó em cho vào mạch tét như hôm trước anh gừi thì khi mình gõ ký tự từ bàn phím thì máy tính (chương trình giao tiếp) sẽ nhận và hiển thị đc ký tự mình gửi đúng không anh?
Nhưng khi em mô phỏng trên Protues thì nó hiển thị không giống như ký tự mình gửi anh ạ, anh xem dùm em
Cảm ơn anh!

tyhon
11-05-2008, 02:42 AM
Anh ở đâu rồi, lâu không thấy anh lên diễn đàn
Anh cố xem hộ em đi ạ
Rất mong thư!

uydanh
11-05-2008, 09:53 AM
Mình không có viết kiểu này. Mình dùng ngắt để nhận ký tự trên máy tính truyền xuống. Với đoạn code trên , nếu là mình thì sẽ viết như sau :

#include <16f877a.h>
#include <def_877a.h>
#FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=4000000)
#use rs232(baud=9600, parity=N, xmit=pin_C6, rcv=pin_C7, bits=9)
char t;
#INT_RDA
void rda_isr()
{
t=getc() ;
}
void main()
{
enable_interrupts(INT_RDA) ;
enabled_interrupts(GLOBALS) ;
while(1)
{
putc(t) ;
}
}

Khi trên máy tính truyền xuống hết 1 byte thì ngắt INT_RDA xảy ra. Chương trình ngắt được thực hiện, biến t sẽ nhận 1 byte truyền xuống đó. Sau đó nó thoát ra chương trình ngắt và lặp vòng trong lệnh while(1).
Bạn thử viết kiểu này được không.

tyhon
14-05-2008, 07:58 AM
Anh ơi cho em hỏi
EM có đoạn code đơn giản sau và em test bằng chuơng trình của anh NHB đã gửi cho nhưng sao không đúng , em không biết do lổi gì nhờ anh xem hộ em
Rất mong thư!

uydanh
14-05-2008, 02:53 PM
Cái này thì mình cũng pó tay thôi. Chương trình của bạn thiếu parity, bạn thêm vào thử có được không ? Một điều nữa : bạn xem lại thạch anh của bạn có đúng là 20Mhz như khai báo không ?
Bạn truyền thử 1 ký tự xem có OK không? Sau đó mới truyền chuổi.
Chúc thành công.

tungtot_vl
21-03-2009, 04:54 PM
bạn nào rành giao tiếp cổng com bảng VB thì giúp mình với.
mình tập viết chương trình VB giao tiếp với cổng com. chương trình truyền và nhận chuỗi kiểm string thì bình thường. nhưng khi gửi kiểu byte (0 -> 255) hay kiểm interger thì chương trình chỉ gửi mã dạng ASCII của số đó. ví dụ mình gửi số 1 xuống VDK thì nó phản hồi lại mã ASCII lã9 , gủi số 12 thì phản hồi lại 67, gủi 115 thì phản hồi lại 2 số là 50 và 51.
mình muốn chương trình gửi xuống số 1 thì phản hồi lên số 1, gửi 115 thì phản hồi lên 115
bạn nào biết giúp mình với nhé
thanh you!

npbaoduy
22-03-2009, 07:31 PM
Trong VB, khi giao tiếp thì mặc định là gởi mã accii của ký tự, nếu bạn muốn gởi số như bạn nói, ví dụ bạn muốn gởi số 115(1 byte) bạn có thể viết như sau:
MSComm1.output=chr(115)

hàm chr() đổi 1 byte từ số sang ký tự có mã accii là số đó, như vậy, bạn sẽ gởi được số 115.
Nếu bạn giao tiếp với PIC, gởi 1 số lên lại máy tính, bạn có thể viết như sau (CCS):
printf('%u',115);

Chúc bạn thành công.

lequocbao
23-03-2009, 12:35 PM
//Nếu bạn giao tiếp với PIC, gởi 1 số lên lại máy tính, bạn có thể viết như sau (CCS):
printf('%u',115);//



ủa chứ không phải là lệnh : putc(x); hả bạn?
nếu không phải thì sẳn bạn cho mình hỏi luôn là lệnh putc() dùng để làm gì?

Bác nào rành phần cứng thì xem giúp phần mạch bên dưới có đúng không ? sao mà mình chỉ truyền được dữ liệu từ máy tính xuống còn từ pic lên thì không được(không thấy sự kiện on_comm();).

các bác mod cho mình hỏi muốn post trực tiếp file hình lên thì làm như thế nào ? thank.

npbaoduy
24-03-2009, 10:07 PM
Lệnh putc() theo mình hiểu là gởi ký tự.
Gởi bạn mạch mình đã làm và chạy thành công, mạch đơn giản lắm, bạn tham khảo nhé.

tungtot_vl
03-04-2009, 05:50 PM
printf(); // là để gửi một chuỗi hay số lên PC
putc(c); // tức là khi máy tính gửi xuống 1 byte nào đó thì lệnh này sẽ phản hồi lại byte đó cho máy tính.
lệnh printf(); có thể dùng ở bất cứ vị trí nào trong chương trình còn lệnh putc(c); chỉ dùng trong ngắt sau dòng lệnh c = getc();

nguyennam8888
03-04-2009, 06:25 PM
các bác giúp em với, nghĩ mãi mà chưa làm được , chương trình của em nó chỉ nhận thôi, nhưng khi nhận xong thì PIC lại không thấy hiển thị, còn truyển ngược lại thì chưa đươc
code trong Pic:
#include <16F877a.h>
#include <DEFS_16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,parity=n, xmit=PIN_C6, rcv=PIN_C7)
unsigned char dulieu;
#INT_RDA
void data_receive(void)
{
dulieu = getc();
putc(dulieu);
}
void main()
{
set_tris_a(0);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
while(true)
{
output_a(dulieu);

delay_ms(2000);
}
}
code trong VB:

Private Sub cmdClear_Click()
Text1.Text = ""

End Sub

Private Sub cmdExit_Click()
Unload Me
End Sub

Private Sub cmdSend_Click()
MSComm1.Output = Text2.Text
End Sub

Private Sub Form_Load()
cmdSend.Caption = "&Send"
Text1.Text = ""
Text2.Text = ""
Text1.Enabled = False
cmdExit.Caption = "&Exit"
With MSComm1
.Settings = "9600,N,8,1"
.CommPort = 4
.RThreshold = 1
.SThreshold = 0
.InputMode = comInputModeText
.InputLen = 0
.Handshaking = comNone
.InBufferSize = 1024
.OutBufferSize = 1024
If .PortOpen = False Then
.PortOpen = True
End If

End With
End Sub

Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then
Text1.Text = Text1.Text + Asc(MSComm1.Input)
End If
End Sub
(em tìm mãi mà không thấy chỗ nào để viết code.)

lequocbao
03-04-2009, 07:31 PM
pic không hiển thị gì hết, vậy thì dựa vào đâu mà bạn biết là pic chỉ nhận thôi!

nguyennam8888
03-04-2009, 07:51 PM
pic không hiển thị gì hết, vậy thì dựa vào đâu mà bạn biết là pic chỉ nhận thôi!

em sử dụng mô phỏng Proteus và phần mền cổng com ảo

nguyennam8888
03-04-2009, 10:06 PM
bác nào có sơ đồ kết nối max232 voi Pic không , em thấy lúc nối 3 chân , lúc nối nhiều hơn

phandinh
04-04-2009, 12:21 PM
nếu bạn mô phỏng thì không cần max 232 đâu.
nối trực tiếp chân 2 , 3 với RC6 ,RC7 luôn

phandinh
04-04-2009, 12:28 PM
bạn đang mo phỏng thằng proteus phải ko ?
bạn xem file sau nha. proteus 7.4 (sp3)
không cần max 232

tungtot_vl
06-04-2009, 11:12 AM
[QUOTE=nguyennam8888;24308]các bác giúp em với, nghĩ mãi mà chưa làm được , chương trình của em nó chỉ nhận thôi, nhưng khi nhận xong thì PIC lại không thấy hiển thị, còn void main()
{
set_tris_a(0);
ENABLE_INTERRUPTS(GLOBAL);
ENABLE_INTERRUPTS(INT_RDA);
////////////////////////////
bạn chưa khởi tạo portc làm sao nó nhận hay gửi được
set_tris_c(0x80);

tungtot_vl
22-04-2009, 12:18 PM
các bạn cho mình hỏi vấn đề này nhé.
nếu mình dùng 2 bộ cổng Tin1 và Tin2, Rout1 và Rout2 cung nối vào một cổng COM của PC. 2 bộ còn lại được nối vào 2 con PIC. khi tuyền từ PC xuống thì cả 2 PIC cùng nhận. vấn đề này có ảnh hưỡng gì đến data nhận không hả các bác (phương pháp này có thực hiện được không). bác nào đã từng làm rồi xin chỉ giúp

mtuankct
22-04-2009, 02:18 PM
Hình như bác đang nói tơi chân của con Max232. Vể lý thuyết thì không được phép làm như vậy vì RS232 chỉ cho phép truyền nhận giữa điểm và điểm. Tuy nhiên nếu như tốc độ truyền của bạn thấp thì mình nghĩ chắc nó cũng nhận được. Còn nếu muốn làm đúng chuẩn thì bạn có thể đưa nó sang chuẩn RS485 rồi nối với nhau thì không sao.

tungtot_vl
22-04-2009, 03:33 PM
uh. mình đang nói đến Max232. mình hỏi xem bạn nào đã làm thực tế việc đó chưa. vì mình chỉ truyền cho 2 PIC nên nếu được thì tốt, ko cần phải tốn thêm Ma485. nếu bạn nào đã từng làm thì cho ý kiến thử nhé

mtuankct
22-04-2009, 06:32 PM
Theo quy định về các chuẩn giao tiếp thì chắc chắn là không nối được theo cách này, nên nếu bạn đang làm đố án hoặc, bài tập thì không thể làm theo kiểu này được. Còn nếu để làm chơi thì cứ thử xem :D

phuong_dtk4s
26-11-2009, 09:57 AM
em có câu hỏi muốn mọi người giúp đỡ":đó là code của em viết để truyền nhận dữ liệu nhung ma sao nó mời chỉ truyền từ máy tính xuống nhưng tù vi điều khiên thì chưa có truyền lên máy tính được..
code VB:
Private Sub cmdexit_Click()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
Unload Me
End Sub

Private Sub Cmdsend_Click()
MSComm1.Output = Text1.Text

End Sub

Private Sub Form_Load()
Dim t As Integer
Dim a As Integer
Me.BackColor = RGB(255, 155, 255) 'Returns Red
Label1.BackColor = RGB(255, 0, 0) 'Returns Red
Cmdsend.BackColor = RGB(255, 255, 0) 'Returns Red
MSComm1.CommPort = 1
MSComm1.Settings = "9600,o,8,1"
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then
text2.Text = MSComm1.Input
End If
End Sub
CODE VI DIEU KHIỂN
#include <16f877.h>
#FUSES NOWDT, HS, NOPUT,NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#use delay(clock=20000000)
#byte portb =0x06
#byte portc =0x07
#byte porta =0x05
#use rs232(baud=9600, parity=N, xmit=pin_C6, rcv=pin_C7, bits=8)
char t;
int8 i;
#INT_RDA
void rda_isr()
{
t=getc() ;
if (t==103)
{
porta=0xff;
delay_ms(300);
porta=0x00;
putc(T);
}
//putc(t);
}
void main()
{
set_tris_b(0);
set_tris_c(0x80);
set_tris_a(0);
enable_interrupts(INT_RDA) ;
enable_interrupts(GLOBAL) ;
while(1)
{
portb=t;
;
}
}

dung h
26-11-2009, 10:52 AM
trong chương trình của phương gặp vấn đề đó là:
chương trình vdk của bạn không vấn đề gì cả .pic có nhận được ký tự mã ascii là 103 và gủi lại máy tình
vấn đề khi nhận là trên chương trình vb của bạn . bạn nhận dữ liệu bằng ngắt on_comm

Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then
text2.Text = MSComm1.Input
End If
End Sub

khi xẩy ra ngắt thì lấy dữ liệu ra hiển thị trên text2 nhưng khi nào thì xấy ra ngắt thì bạn chưa hiểu về nó .ở ct vb của bạn thì sẽ không bao giờ xẩy ra ngắt vì bạn chưa khai báo số byte nhận về ở bộ đệm để xẩy ra ngắt
mscomm1.rthreshohld = x ( số byte xẩy ra ngắt)
nếu bạn dặt x=1 thì cứ có 1 byte nhận đựoc thì sẽ xẩy ra ngắt...
khi bạn lấy ra và sử dụng active comm hỗ trợ truyền thông của visual basic thì khi chưa khai báo thì mscomm.rthreshold mặc định =0 tức là không cho phép ngắt nhận
nên ct của bạn o nhận được
bạn nên thêm mscomm1.rthreshold =1 vào private form_load()

có đúng hay không bạn kiểm tra sem! và lần sau bạn nên up cả file ct của bạn lên nhé để tiện kiểm tra!

mua_sao_bang
17-12-2009, 12:26 AM
em đang làm bài tập về giao tiếp máy tính, sử dụng 16f877(ngôn ngữ C) qua cổng Com.Nhưng em gặp vấn đề là khi truyền tín hiệu từ 1 cảm biến đến máy tính hiển thị trên 1 textbox.Nhưng khi có 2 tín hiệu cảm biến truyền đển máy tính hiển thị trên 2 textbox thì em không biêt đó là dữ liệu của textbox nào khi nhận được.(em sử dụng ngat MSComm1_OnComm)>
Mong các Pro giải thích giúp em.Thanks

npbaoduy
17-12-2009, 11:16 AM
Bạn có thể cho mọi người xem code của bạn, sẽ dễ góp ý hơn.
Mình ko hiểu rõ ý bạn lắm, nhưng theo cách mình hay làm, nếu phải truyền 2 giá trị từ 2 cảm biến lên, thì ứng với mỗi cảm biến, cần có một ký tự đi trước để báo hiệu. Ví dụ thay vì truyền 1 byte của cảm biến 1, mình sẽ truyền 2 byte, byte đầu là '@' chẳng hạn, báo hiệu giá trị sắp nhận được là của cảm biến 1, sau đó truyền byte giá trị, với cảm biến 2 thì truyền '#' + giá trị, như vậy trên máy tính sẽ nhận biết dễ dàng giá trị nào của cảm biến nào thôi.

mua_sao_bang
18-12-2009, 12:07 AM
Bạn có thể cho mọi người xem code của bạn, sẽ dễ góp ý hơn.
Mình ko hiểu rõ ý bạn lắm, nhưng theo cách mình hay làm, nếu phải truyền 2 giá trị từ 2 cảm biến lên, thì ứng với mỗi cảm biến, cần có một ký tự đi trước để báo hiệu. Ví dụ thay vì truyền 1 byte của cảm biến 1, mình sẽ truyền 2 byte, byte đầu là '@' chẳng hạn, báo hiệu giá trị sắp nhận được là của cảm biến 1, sau đó truyền byte giá trị, với cảm biến 2 thì truyền '#' + giá trị, như vậy trên máy tính sẽ nhận biết dễ dàng giá trị nào của cảm biến nào thôi.

em cũng nghĩ như vậy, nhưng mà bên phía VB em không biết xử lý như thế nào.bình thường em nhận dữ liệu từ VDk bằng doan code:
"
Private Sub MSComm1_OnComm()
Dim a As Variant
If MSComm1.InBufferCount Then
a = MSComm1.Input
End If
Text2.Text = a
End Sub
"
Nhưng bây giờ bên VDK truyền byte bao hieu + byte gia tri thi ben VB em tách làm sao được chỉ lấy được byte gia tri thôi?

npbaoduy
18-12-2009, 01:44 PM
Theo mình có 2 cách:
- Cách 1: Đặt bộ đệm Mscomm1.RThreshold = 2, có nghĩa là sau khi nhận được 2byte mới xảy ra ngắt oncomm, khi đó ta đọc 2 byte này, kiểm tra byte đầu, và giá trị là byte sau.
Có thể đọc 2 byte bằng cách sau:

Privat Sub MSComm1_onComm()
Dim buffer 'kiểu varriant
Dim Arr() as byte ' mảng động
If MSComm1.CommEvent = comEvReiceive then
buffer=MSComm1.Input
Arr = buffer
If (Arr(0)="@")then
....................
End Sub

- Cách 2: để bộ đệm 1 byte bình thường, khi ngắt oncomm nếu đó là byte báo hiệu thì đặt giá trị cho một biến toàn cục nào đó, lần ngắt oncomm sau kiểm tra biến này rồi xử lý, cách này khá dở :D, nhưng trong tình huống nào đó mà cách 1 ko thể sử dụng (ví dụ như vi xử lý truyền lên nhiều thứ chứ ko phải chỉ 2byte) thì sẽ rất hữu ích.

hongson06d61132
10-09-2010, 08:20 PM
nhờ các bác giải thích giùm đoạn lệnh này với.
Option Explicit

Private Sub btnClear_Click(Index As Integer)
Dim i As Integer

Select Case Index
Case 0:
For i = 0 To 11
txtHEX(i) = ""
Next i
Case 1:
txtTextOut = ""
Case 2:
txtResponse = ""
End Select

End Sub

Private Sub btnSend_Click(Index As Integer)
Dim i As Integer
Dim j As Integer
Dim Temp As Long
Dim OutString As String

OutString = ""
Select Case Index
Case 0 ' Send Hex character string
For i = 0 To 11
Temp = 0
If (Len(txtHEX(i)) > 0) Then
For j = 1 To Len(Left(txtHEX(i), 2))
Temp = Temp * 16 + HexChar(Mid(txtHEX(i), j, 1))
Next j
OutString = OutString & Chr(Temp)
End If
Next i
send (OutString)
Case 1 ' Send ascii string
send txtTextOut.Text
End Select

End Sub
Sub send(txtin As String)
If MSComm1.PortOpen = True Then
MSComm1.Output = txtin
End If
End Sub

Function HexChar(strData As String) As Integer

Select Case strData
Case "0" To "9"
HexChar = Val(strData) - Val("0")
Case "a", "A"
HexChar = 10
Case "b", "B"
HexChar = 11
Case "c", "C"
HexChar = 12
Case "d", "D"
HexChar = 13
Case "e", "E"
HexChar = 14
Case "f", "F"
HexChar = 15
Case Else
HexChar = 0
End Select

End Function

Private Sub Form_Load()
Dim i As Integer

For i = 0 To 2 ' Clear all input/output fields
btnClear_Click (i)
Next i
If Not ValidatePort Then
MsgBox "There are no available comm ports on this computer.", , "Commx"
End
End If
UpdateStatus
End Sub

Private Sub Form_Unload(Cancel As Integer)

If (MSComm1.PortOpen) Then
MSComm1.PortOpen = False
End If

End Sub

Private Sub mnuCom_Click(Index As Integer)
Dim i As Integer
Dim OldPort As Long

On Error Resume Next
With MSComm1
OldPort = .CommPort
If MSComm1.PortOpen Then
.PortOpen = False
.CommPort = Index
.PortOpen = True
If Err.Number <> 0 Then ' This should not happen...
MsgBox "Com" & Index & " is not available." & _
vbCrLf & Err.Description
Err.Clear
.CommPort = OldPort
Else
For i = 1 To 4
mnuCom(i).Checked = False
Next i
mnuCom(Index).Checked = True
End If
Else
.CommPort = Index
For i = 1 To 4
mnuCom(i).Checked = False
Next i
mnuCom(Index).Checked = True
End If
End With
UpdateStatus
End Sub

Private Sub mnuConnect_Click()

On Error Resume Next
With MSComm1
If .PortOpen = True Then
.PortOpen = False
Else
.PortOpen = True
If Err.Number <> 0 Then
MsgBox "Com" & .CommPort & " is not available." & vbCrLf & _
Err.Description
Err.Clear
End If
End If
End With
UpdateStatus

End Sub

Private Sub mnuDataBSel_Click(Index As Integer)
Dim i As Integer
Dim NewSettings As String

For i = 4 To 8
If (i = Index) Then
mnuDataBSel(i).Checked = True
Select Case Index
Case 4 ' 4
NewSettings = ",,4,"
Case 5 ' 5
NewSettings = ",,5,"
Case 6 ' 6
NewSettings = ",,6,"
Case 7 ' 7
NewSettings = ",,7,"
Case 8 ' 8
NewSettings = ",,8,"
End Select
Else
mnuDataBSel(i).Checked = False
End If
Next i
SetPort (NewSettings)

End Sub

Private Sub mnuHelpSel_Click(Index As Integer)
Select Case Index
Case 0 ' Basic Help
MsgBox "Basic Communications Program what you see is what you get." _
, vbInformation, "Help"
Case 1 ' About
MsgBox "Basic Communications Program Version 0.91", , "Help About"
End Select
End Sub

Private Sub mnuParitySel_Click(Index As Integer)
Dim i As Integer
Dim NewSettings As String

For i = 0 To 4
If (i = Index) Then
mnuParitySel(i).Checked = True
Select Case Index
Case 0 ' E
NewSettings = ",E,,"
Case 1 ' M
NewSettings = ",M,,"
Case 2 ' N
NewSettings = ",N,,"
Case 3 ' O
NewSettings = ",O,,"
Case 4 ' S
NewSettings = ",S,,"
End Select
Else
mnuParitySel(i).Checked = False
End If
Next i
SetPort (NewSettings)

End Sub

Private Sub mnuSpeedSel_Click(Index As Integer)
Dim i As Integer
Dim CurPortOpen As Boolean
Dim NewSettings As String

For i = 0 To 12
If (i = Index) Then
mnuSpeedSel(i).Checked = True
Select Case Index
Case 0 ' 110
NewSettings = "110,,,"
Case 1 ' 300
NewSettings = "300,,,"
Case 2 ' 600
NewSettings = "600,,,"
Case 3 ' 1200
NewSettings = "1200,,,"
Case 4 ' 2400
NewSettings = "2400,,,"
Case 5 ' 9600
NewSettings = "9600,,,"
Case 6 ' 14400
NewSettings = "14400,,,"
Case 7 ' 19200
NewSettings = "19200,,,"
Case 8 ' 28800
NewSettings = "28800,,,"
Case 9 ' 38400
NewSettings = "38400,,,"
Case 10 ' 56000
NewSettings = "56000,,,"
Case 11 ' 128000
NewSettings = "128000,,,"
Case 12 ' 256000
NewSettings = "256000,,,"
End Select
Else
mnuSpeedSel(i).Checked = False
End If
Next i
SetPort (NewSettings)

End Sub

Private Sub mnuStopSel_Click(Index As Integer)
Dim i As Integer
Dim NewSettings As String

For i = 0 To 2
If (i = Index) Then
mnuStopSel(i).Checked = True
Select Case Index
Case 0 ' 1
NewSettings = ",,,1"
Case 1 ' 1.5
NewSettings = ",,,1.5"
Case 2 ' 2
NewSettings = ",,,2"
End Select
Else
mnuStopSel(i).Checked = False
End If
Next i

SetPort (NewSettings)
End Sub

Private Sub MSComm1_OnComm()
Dim txtBuf As String
Dim i As Integer
Dim c As Integer

With MSComm1
Select Case .CommEvent
Case comEvReceive
txtBuf = .Input
For i = 1 To Len(txtBuf)
c = Asc(Mid(txtBuf, i, 1))
If (c < 32 Or c > 126) Then
txtResponse = txtResponse & "<" & Hex(c) & ">"
Else
txtResponse = txtResponse & Chr(c)
End If
Next i
End Select
End With
txtResponse.SelStart = Len(txtResponse)

End Sub

Private Sub UpdateStatus()

If MSComm1.PortOpen Then
StatusBar1.Panels(1).Text = "Connected"
mnuConnect.Caption = "Dis&connect"
btnSend(0).Enabled = True
btnSend(1).Enabled = True
Else
StatusBar1.Panels(1).Text = "Disconnected"
mnuConnect.Caption = "&Connect"
btnSend(0).Enabled = False
btnSend(1).Enabled = False
End If
StatusBar1.Panels(2).Text = "COM" & MSComm1.CommPort
StatusBar1.Panels(3).Text = MSComm1.Settings

End Sub
Private Function ValidatePort() As Boolean
Dim i As Integer

On Error Resume Next
ValidatePort = False
With MSComm1
For i = 4 To 1 Step -1
.CommPort = i
Err.Clear
.PortOpen = True
If (Err.Number <> 0) Then
mnuCom(i).Enabled = False
Else
ValidatePort = True
.PortOpen = False
End If
Next i
End With
End Function

Private Sub txtHEX_GotFocus(Index As Integer)

txtHEX(Index).SelStart = 0
txtHEX(Index).SelLength = Len(txtHEX(Index))

End Sub

Private Sub txtHEX_LostFocus(Index As Integer)
Dim Temp As String

Temp = txtHEX(Index)
Select Case Len(txtHEX(Index))
Case 0
txtHEX(Index) = ""
Case 1
txtHEX(Index) = "0" & LegalHex(Mid(txtHEX(Index), 1, 1))
Case Else
txtHEX(Index) = LegalHex(Mid(txtHEX(Index), 1, 1)) & _
LegalHex(Mid(txtHEX(Index), 2, 1))
End Select
If (Len(txtHEX(Index)) > 0) Then
Do While (Len(txtHEX(Index)) < 2)
txtHEX(Index) = "0" & txtHEX(Index)
Loop
End If
End Sub
Private Function LegalHex(c As String) As String
c = UCase(c)
Select Case c
Case "0" To "9", "A" To "F"
LegalHex = c
Case Else
LegalHex = ""
End Select
End Function
Private Sub SetPort(NewSettings As String)
Dim CurPortOpen As Boolean
Dim OldIndex As Integer
Dim OldLength As Integer
Dim NewIndex As Integer
Dim NewLength As Integer
Dim i As Integer
Dim Settings(0 To 3) As String
Dim Temp As String

With MSComm1
CurPortOpen = .PortOpen
If .PortOpen Then
.PortOpen = False
End If
OldIndex = 1
NewIndex = 1
For i = 0 To 3
NewLength = InStr(NewIndex, NewSettings, ",")
If (NewLength = 0) Then
NewLength = NewIndex + Len(Mid(NewSettings, NewIndex))
End If
OldLength = InStr(OldIndex, .Settings, ",")
If (OldLength = 0) Then
OldLength = OldIndex + Len(Mid(.Settings, OldIndex))
End If
If (NewLength = NewIndex) Then
Settings(i) = Mid(.Settings, OldIndex, OldLength - OldIndex)
Else
Settings(i) = Mid(NewSettings, NewIndex, NewLength - NewIndex)
End If
OldIndex = OldLength + 1
NewIndex = NewLength + 1
Next i
.Settings = Settings(0) & "," & Settings(1) & "," & _
Settings(2) & "," & Settings(3)
If CurPortOpen Then
.PortOpen = True
End If
End With
UpdateStatus

End Sub

Private Sub txtTextOut_GotFocus()

txtTextOut.SelStart = 0
txtTextOut.SelLength = Len(txtTextOut)

End Sub

lemtim
23-11-2010, 02:15 PM
có sư huynh nào có làm giao tiếp USB cho em xin,mạch quang báo giao tiếp USB.

diode1
23-07-2011, 11:22 PM
Em đang làm về Đếm và phân loại SP trắng và đen Giao tiếp PIC 16F877A voi PC sử dụng VB. Em đã truyền được dữ liệu lên PC nhưng hiển thị không đúng ,xin mấy huynh chỉ em hướng giải quyết. Đây là file gồm Chương trình , mô phỏng bàng proteus và VB. http://www.mediafire.com/?195d8sza5tcjubg
Huynh nào rảnh xem và chỉ em hướng giải quyết Mail của em : vuhoan_vu@yahoo.com

anpha_bk
30-07-2011, 11:07 AM
mọi người cho hỏi khi lấy tín hiệu từ ngoài qua bộ adc và mình mun lấy giá trị đó đẻ vẽ đồ thị, với giao tiếp máy tính thì phải làm làm sao, và có cách nào qua adc mà mình vẫn lấy dc giá trị âm, ví dụ như song sin

tunha25251325
07-08-2011, 12:19 PM
mọi người cho hỏi khi lấy tín hiệu từ ngoài qua bộ adc và mình mun lấy giá trị đó đẻ vẽ đồ thị, với giao tiếp máy tính thì phải làm làm sao, và có cách nào qua adc mà mình vẫn lấy dc giá trị âm, ví dụ như song sin

Theo mình nghĩ thì giá trị âm hay dương khi truyền lên máy tính là nằm ở phần lập trình trên vi điều khiển.Cụ thể tín hiệu qua ADC là tín hiệu gì? và bạn muốn gửi giá trị gì lên máy tính

vanhieugn
12-04-2012, 09:20 AM
cac pro oi cho minh hoi..mình giao tiếp qua cổng usb mà mình dùng ft232 thì làm có giống giao tiếp qua mx232 ko...:)

hongmta
12-04-2012, 03:16 PM
mọi người cho hỏi khi lấy tín hiệu từ ngoài qua bộ adc và mình mun lấy giá trị đó đẻ vẽ đồ thị, với giao tiếp máy tính thì phải làm làm sao, và có cách nào qua adc mà mình vẫn lấy dc giá trị âm, ví dụ như song sin
với dòng pic 16, 18 thì không lấy được giá trị âm, muốn được giá trị âm thì phải lên dsPic bạn àh,^^
còn lấy giá trị lên đồ thị thì phải dùng matlab, labview lập trình giao diện và xử lý!

iamtomriddle
30-09-2012, 03:53 AM
-Em mới dùng Visual studio nên không hiểu rõ lắm. Em đã thiết kế xong dao diện và giao tiếp rs 232 hiển thị lên texbox xong rồi. nhưng em muốn tách 3 gia trị từ vi điều khiên lên 3 texbox khác nhau loay hoay mãi vẫn chưa dc. Bác nào viết cho em cái code phần này được ko ạ. Cảm ơn các bác rất nhiều.

-Và em có một thắc mắc nữa không làm sao em sử dụng hàm main() giống tron vi điều khiển được (hàm luôn được chạy mà không phải gọi) để em sử dùng while(true) em đọc code trên http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.databits.aspx phai báo hàm main the mà cứ bị lỗi.

mrtamtran
18-01-2013, 02:07 AM
Thầy namqn ơi , thầy giúp em vấn đề này với ạ !
Em đang lập trình trên MPLAB với con PIC24FJ128GA010
Tất cả các việc :
- Truyền 1 kí tự , chuỗi lên PC thì OK
- Nhận 1 kí tự từ máy tính truyền xuống thì cũng OK
Nhưng Em đang mắc chỗ NHẬN 1 CHUỖI KÍ TỰ TỪ PC to Vi điều khiển
Code của em BUILD SUCCESSED nhưng không nhận được và không hiển thị lên màn hình như mong muốn ạ !
Em kính mong thầy giúp em với ạ !
Em xin cảm ơn Thầy nhiêu nhiều ạ !

Toàn bộ code của em ở đây thầy ạ !

http://www.mediafire.com/?7c4ft7pt6q9r7r6

TRẦN MINH TÂM
--->Trân Trọng<---