PDA

View Full Version : Lập trình giao tiếp RS232 trên PC bằng Visual C++.Net


ngohaibac
25-05-2007, 07:05 PM
Chào các bạn.

Mình đã làm xong cơ bản giao diện chương trình giao tiếp RS232 bằng Visual C++.Net.

Giao diện của chương trình:

http://i36.photobucket.com/albums/e46/ngohaibac/Serial%20Port/BAC_0002.gif

Chương trình có chức năng tự động cập nhật các cổng COM có trong PC của bạn.

Mình đã đóng gói chương trình thành chương trình cài đặt (đính ở file bên dưới). Chương trình cài rất là đơn giản.

Phiên bản hiện tại là V1.0.0.0 và nó sẽ được cập nhật để thêm các chức năng sau.

Các bạn dùng và cho ý kiến nhé.

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

ngohaibac
26-05-2007, 12:14 AM
Chào các bạn.

Các bạn download .Net Framwork 2.0 (http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe) và cài để cho ứng dụng trên chạy được nhé.

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

123458
26-05-2007, 10:13 AM
Chao cac su huynh!!!De dang viet chuong trinh giao tiep voi RS232 dung VB de lam dung theo sach huong dan ma bi bao loi trong win co tai inoutport ve may rui ma van vay!!! Co su huynh nao cho de cao kien zoi!!!da ta !!!su huynh nao co chuong trinh hoan chinh thi post len giup de nhe!!!

ngohaibac
26-05-2007, 03:36 PM
Chào bạn.

Lập trình bằng VB thì bạn có thể tham khảo luồng sau:

http://dientuvietnam.net/forums/showthread.php?t=5281
http://www.picvietnam.com/forum//showthread.php?t=869

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

falleaf
27-05-2007, 08:59 AM
Lập trình bằng .NET không phải là giải pháp cho lập trình điều khiển (cái này bạn nào quan tâm đến vấn đề lập trình thì sẽ rõ). Lập trình điều khiển vẫn nên chú trọng vào VC++ 6.0.

Tuy vậy, F cho Bắc làm cái chương trình này nhằm mục đích đa dạng hóa các tutorial của picvietnam. Giúp các bạn bước đầu làm quen với .net cho điều khiển.

Chúc vui.

minhquancdt
27-05-2007, 06:33 PM
Em thấy nếu cứ đi lung tung thì không hay một chút nào, món nào cũng biết 1 chút thì không ổn một chút nào. Đã làm thì tập trung phát triển một cái thôi nhưng phải hoàn thiện và có thể cải tạo dần để tối ưu hơn.

Chúng ta hay dùng VC++ cho lập trình ứng dụng điều khiển vì bạn giao tiếp với máy tính bằng VĐK chẳng hạn, lập trình cho nó bằng ngôn ngữ C sẽ rất thuận tiện khi truyền nhận dữ liệu lên phần mềm cũng được phát triển trên nền tản C.

ngohaibac
27-05-2007, 08:15 PM
Chào bạn.

Ứng dụng viết trên VC++.Net này có thể chuyển về bản VC++ 6.0 bạn ạ.Mình đã viết ứng dụng trên tạm tạm rùi, chỉ còn một vài chức năng thôi thôi bạn ạ.

Mình sẽ hoàn thành từng ứng dụng một cho nó hoàn chỉnh, good.

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

tranvanthuong
28-05-2007, 10:15 AM
A BAC ơi em cài 2 chương trinh a roi ma vẩn ko chay được e không biết tại sao? a chỉ em với

ngohaibac
28-05-2007, 12:16 PM
Uhm, anh cũng chưa biết tại sao :D.

Mấy cái máy của đứa bạn cùng phòng không chạy được. Để anh xem xét lại rùi báo cho mọi người nhé.

Nếu em cài Visual Studio 2005 rùi thì chắc là chạy ok lắm.

Chúc em thành công.

falleaf
28-05-2007, 01:26 PM
Do cái lúc em dịch, em phải chọn cái chế độ đóng gói các cái thư viện mà em đã làm thành một cái exe. Hình như em quên đóng gói, cho nên không chạy được trên máy không cài VC.

Máy anh chẳng còn cài gì hết cho nên không kiểm tra được. Các bạn xem lại có có báo là không tìm được mấy cái .dll hay file gì đó khác không?

Chúc vui

hungbkhn
28-05-2007, 08:22 PM
Chao moi nguoi,
ung dung ma Bac dang viet theo anh dung de "test voi so cong la fix". mot so ung dung ta chua biet truoc so cong la bao nhieu, giao dien cau hinh cung ko duoc dua len tren vi "yeu cau giao dien sach se" nen khi "connect" bao loi.
De lam bai toan nay thi co mot giai phap la doc noi dung thanh ghi cac cong RS232 duoc detect dynamic.
Tu khoa la RegOp.cls, theo a nho thi o trong MSDN no cung co.
Hi vong la moi nguoi giai quyet duoc tron ven van de nay.
Chuc vui ve.




Do cái lúc em dịch, em phải chọn cái chế độ đóng gói các cái thư viện mà em đã làm thành một cái exe. Hình như em quên đóng gói, cho nên không chạy được trên máy không cài VC.

Máy anh chẳng còn cài gì hết cho nên không kiểm tra được. Các bạn xem lại có có báo là không tìm được mấy cái .dll hay file gì đó khác không?

Chúc vui

ngohaibac
29-05-2007, 01:33 AM
Em đã đóng gói bằng Advanced Installer 4.0 của Microsoft, đặt chế độ selfregister các file .dll rùi. Nên không phải là vấn đề đó. Em sẽ đóng gói lại bằng Install Sheld vào bản sau.

Anh hungbkhn: ứng dụng của em không phải là làm với các cổng COM fix cố định, khi anh mở ứng dụng ra thì nó đã tự đông load các cổng COM tồn tại trên PC rùi. Nút Scan Port để scan lại khi đã có cổng nào đó dùng vào việc khác rùi.

Các cổng đang làm việc sẽ không được đưa vào danh sách Com Port nên sẽ không chọn được.

Em detech các Port bằng hàm API CreateFile.

Chúc mọi người thành công.

hungbkhn
29-05-2007, 03:22 PM
y cua anh khac o cho la,
gia su thiet bi em cam vao no duoc detect o cong N.
neu em dung nut Scan Port ra cac cong co san. (cai nay ko hay lam trong ung dung), gia su cho la vay nhung neu anh chon cong la M # N thi anh nho la no se bao loi.
do do y anh la bo het cac nut nay va detect tu dong trong thanh ghi cac cong RS232. No la mot chuoi, cai nao moi thi la cai cong vua cam vao va bien luan no. Se ko co loi. Cai nay giao dien than thien hon voi nguoi su dung.
Vi ho ko can biet cong gi, noi nhu the nao.
Chi biet co chu KET NOI la ok.
y la vay hi.
chuc vui ve


Em đã đóng gói bằng Advanced Installer 4.0 của Microsoft, đặt chế độ selfregister các file .dll rùi. Nên không phải là vấn đề đó. Em sẽ đóng gói lại bằng Install Sheld vào bản sau.

Anh hungbkhn: ứng dụng của em không phải là làm với các cổng COM fix cố định, khi anh mở ứng dụng ra thì nó đã tự đông load các cổng COM tồn tại trên PC rùi. Nút Scan Port để scan lại khi đã có cổng nào đó dùng vào việc khác rùi.

Các cổng đang làm việc sẽ không được đưa vào danh sách Com Port nên sẽ không chọn được.

Em detech các Port bằng hàm API writefile.

Chúc mọi người thành công.

bien_van_khat
29-05-2007, 04:26 PM
Hix trưởng lão đã gõ ko có dấu mà lại viết khó hiểu quá, em đọc đi đọc lại mấy lần, nói thật nếu là bài viết của 1 thành viên bình thường thì chắc em đọc 1 lần rồi bỏ cho rồi.

Nếu em hiểu đúng thì ý anh là ở cái cách thiết kế giao diện chuơng trình, nếu giờ em chon COM1, nhưng chưa connect, lát trong máy có thằng nào đó nó chiếm mất, đến khi em bấm connect thì boong, lỗi.

Vậy Bắc nên để cái phần cấu hình ở 1 dialog connect, mỗi khi load dialog này nó tìm tất cả port nào còn thể hiện cho người dùng, người ta chọn xong cũng là connect luôn.

@Anh Falleaf: Em thấy đã là phần mềm thì kể gì ngôn ngữ miễn sao người thiết kế có được sự dễ dàng tiện lợi, đáp ứng được yêu cầu của người sử dụng. Nếu nói viết phần mềm đk chỉ nên chú trọng vào VC6 thì có hơi bảo thủ ko anh F?

falleaf
29-05-2007, 05:10 PM
Không phải, giữa VC++ 6 và VC++.net, thì phần biên dịch của nó thông qua cái bộ cân bằng các runtime giữa các ngôn ngữ khác nhau. Chính vì vậy, một solution trên .net có thể viết nhiều ngôn ngữ khác nhau.

Học C# thì không cần phải học các ngôn ngữ khác nữa. Học Java thì không cần phải lo về platform,... Đó là ý tưởng của bọn nó.

Còn khi mà đã chạy cái đồng bộ runtime, thì rõ ràng quá trình dịch dài hơn. Giữa .net và VC6 hoàn toàn không khác gì nhau về mặt điều khiển cả, nhưng chính vì phần dịch có thêm một bước, cho nên những người làm khoa học, kỹ thuật, kể cả các công ty lớn, họ cũng yêu cầu phải dùng VC++6.

Làm .net là vì có bản 2005 student, khi đó sinh viên mình né được chuyện bản quyền. Đó cũng là lý do mà F cho Bắc làm cái .net này. Còn thực tế, người ta vẫn chỉ dùng bản 6. cho điều khiển thôi.

Chúc vui.

falleaf
29-05-2007, 05:12 PM
Anh Hùng ui, anh nhớ gõ tiếng Việt có dấu bằng telex hoặc vni, vì bộ gõ trên diễn đàn hoạt động tốt, không cần cài bộ gõ khác. Hoặc trên diễn đàn cũng có để bộ download Unikey sẵn rồi.

Chúc vui.

hungbkhn
29-05-2007, 06:58 PM
he he, xin lỗi thực ra vì cái bàn phím đánh ko quen nen nhác đánh tiếng Việt.
:)
Với giải pháp của Bắc và bvk thì:

nếu cứ hiện kết quả detect ra:
- người sử dụng (giả sử hiểu COMx là cái gì) chẳng may bấm nhầm số cổng đã kết nối vẫn báo lỗi.
- nếu ko hiểu COM là cái gì (ví dụ anh :)) thì ko biết bấm cái gì

Nên trên giao diện chỉ có các nút Connect và DisConnect.

Giải pháp đọc thanh ghi lưu giá trị cổng là một cái. Còn giải pháp nào nữa thì anh cũng chưa biết :).
Cũng chưa chạy cái của Bắc nhưng giao diện a nhìn thì chắc chắc mắc lỗi trên.

Hi vọng giờ thì rõ rùi.


Nếu em hiểu đúng thì ý anh là ở cái cách thiết kế giao diện chuơng trình, nếu giờ em chon COM1, nhưng chưa connect, lát trong máy có thằng nào đó nó chiếm mất, đến khi em bấm connect thì boong, lỗi.

Vậy Bắc nên để cái phần cấu hình ở 1 dialog connect, mỗi khi load dialog này nó tìm tất cả port nào còn thể hiện cho người dùng, người ta chọn xong cũng là connect luôn.

ngohaibac
29-05-2007, 11:42 PM
:D Em hiểu ý anh mà.

Vấn đề này chẳng có gì là khó cả. Trong hàm ngắt của nút Connect thì sẽ kiểm tra thử xem có mở được cổng mà người dùng chọn hay không? Nếu không thì báo là không mở được. Chứ không Buzz một cái đâu anh ạ :D. Thế thì chán lắm.

Anh yên tâm, vấn đề này em đều đã suy nghĩ cả rùi.

Như đã nói ở trên em scan posts bằng cách pollling, thử mở tất cả xem cái nào mở được thì cho vào list thôi. Anh chờ cái em update lại nhé :D.

Chúc anh thành công.

hungbkhn
30-05-2007, 01:35 AM
Cái này đến đoạn a với e đang nói a nghĩ ko dễ đâu. Tất nhiên là bọn Tây nó làm cả rồi. OK a đợi, nhưng để xem e code vấn đề này có nhanh bằng a trước đây ko :)



:D Em hiểu ý anh mà.

Vấn đề này chẳng có gì là khó cả. Trong hàm ngắt của nút Connect thì sẽ kiểm tra thử xem có mở được cổng mà người dùng chọn hay không? Nếu không thì báo là không mở được. Chứ không Buzz một cái đâu anh ạ :D. Thế thì chán lắm.

Anh yên tâm, vấn đề này em đều đã suy nghĩ cả rùi.

Như đã nói ở trên em scan posts bằng cách pollling, thử mở tất cả xem cái nào mở được thì cho vào list thôi. Anh chờ cái em update lại nhé :D.

Chúc anh thành công.

ngohaibac
30-05-2007, 02:14 AM
Chào các bạn.

Mình đã đóng gói bằng Installed Shield và đã cài đặt thử trên máy tính khác. Chạy ngon lành rùi nên upload lên cho anh em.

Do ứng dụng đòi hỏi phải có nhiều file cài vào hệ thống (do sử dụng liên kết động) nên mặc dù file chạy ứng dụng nhỏ nhưng các file cần copy vào System không nhỏ.

Anh em download về dùng thử và cho ý kiến, cải thiện dần nhé.

Cách dùng: Các bạn download toàn bộ 9 phần về rùi giải nén ra một thư mục rùi chạy file setup.exe để cài đặt nhé.

Giao diện hơi mới một tí của chương trình:


http://i36.photobucket.com/albums/e46/ngohaibac/Serial%20Port/BAC_0014.gif


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

hungbkhn
30-05-2007, 04:17 AM
hi e, chắc anh là người đầu tiên chạy thử :), vì lệch múi giờ mà. Em update nhanh quá.
Theo anh hiểu thì để test thì đơn giản dùng cái Hyperterminal là đủ rồi, nên ct e viết là để ứng dụng hay để test. ? hay là để mang tên PICVN hi :)
Nếu để ứng dụng anh đưa ra một cái lưu đồ a viết, em xem thế nào nhé.

Mục đích của "chương trình ứng dụng" mà người lập trình cần xử lí với thằng RS232 là khi USER ấn CONNECT thì chương trình
hoặc hoạt động OK
hoặc báo thiết bị chưa CONNECT
hoặc báo chưa CONNECT đúng cổng

Xuất phát từ 2 trường hợp:
1. thiết bị dùng cổng COM cố định
2. thiết bị tạo cổng COM ảo

Giải quyết:
1. Trong hàm của “CONNECT” phải dùng cổng available. Có 2 khả năng: hoạt động hoặc không có tín hiệu.
1.1 Nếu hoạt động: ok
1.2 Nếu không có tín hiệu: ở đây mình cần thông báo chưa CONNECT đúng cổng

2. Thiết bị tạo cổng COM ảo
Đọc thanh ghi chứa các cổng RS232 khi ứng dụng khởi động và khi ấn nút CONNECT, nếu có khác nhau thì so sánh và tìm ra cổng mới được cập nhật và mở cổng. Nếu ko thay đổi thì thông báo chưa CONNECT.

Nếu ghép lại để biện luận chung thì:
hoặc OK,
hoặc chương trình sẽ báo: “Bạn chưa kết nối đúng cổng hoặc chưa kết nối thiết bị !”.



Chào các bạn.

Mình đã đóng gói bằng Installed Shield và đã cài đặt thử trên máy tính khác. Chạy ngon lành rùi nên upload lên cho anh em.

Do ứng dụng đòi hỏi phải có nhiều file cài vào hệ thống (do sử dụng liên kết động) nên mặc dù file chạy ứng dụng nhỏ nhưng các file cần copy vào System không nhỏ.

Anh em download về dùng thử và cho ý kiến, cải thiện dần nhé.

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

Mecha
30-05-2007, 06:43 AM
Theo anh nghĩ, mình không phải dân gõ code chuyên nghiệp như ITers nên chỉ cần dùng được hai chú VB6.0 và VC++6.0 là đủ sài cho các ứng dụng có liên quan đến điều khiển rồi. Anh thấy trong VB làm giao diện nhanh hơn nhưng code viết trong VC mang tính chuyên nghiệp hơn.

Mecha
30-05-2007, 06:58 AM
Bác Hùng và Bắc còn thiếu một trường hợp: giả sử kết nối trên cổng COM hiện thời đang okie thì Mecha rút cái cáp ra :), sau đó cắm vào một cổng COM khác => cry.
Giải pháp: có thể dùng Timer quét cổng để phát hiện "mất kết nối", sau đó tiếp túc quét tất cả các cổng COM cho đến khi phát hiện có kết nối mới.

ngohaibac
30-05-2007, 09:30 AM
Cảm ơn anh Mecha.

Em sẽ chú ý thêm trường hợp này. Em còn nhiều cái phải viết thêm vào mà.

Code này hoàn toàn có thể chuyển về bản VC++ 6.0 anh ạ. Em nghĩ chạy vô tư ngay :D.

Còn một số chức năng nữa cần phải hoàn thiện.

@hungbkhn: đúng rùi đó anh. Nhưng em chưa viết cho thiết bị dùng cổng COM ảo. Vì em không có cáp chuyển đổi :D nên chưa test được xem thế nào cả.Có gì xin trợ giúp của anh :D.

Chúc các anh thật là mạnh khỏe.

hungbkhn
30-05-2007, 02:06 PM
hẹn em và mọi người 1 thời gian nữa nhé sẽ tham gia nhiều trên diễn đàn,
giờ thì đạng bận,
mà cái của Bắc cài ra ko thấy chỗ Uninstall hay tại máy anh nó ko vào.
Chúc em thi học kì tốt.



Cảm ơn anh Mecha.

Em sẽ chú ý thêm trường hợp này. Em còn nhiều cái phải viết thêm vào mà.

Code này hoàn toàn có thể chuyển về bản VC++ 6.0 anh ạ. Em nghĩ chạy vô tư ngay :D.

Còn một số chức năng nữa cần phải hoàn thiện.

@hungbkhn: đúng rùi đó anh. Nhưng em chưa viết cho thiết bị dùng cổng COM ảo. Vì em không có cáp chuyển đổi :D nên chưa test được xem thế nào cả.Có gì xin trợ giúp của anh :D.

Chúc các anh thật là mạnh khỏe.

ngohaibac
30-05-2007, 05:16 PM
Để uninstall phần mềm này. Anh chạy lại file setup.exe rùi chọn chức năng Remove là được anh ạ.

Mọi người chú ý: các bạn download toàn bộ 9 file về rùi giải nén vào một thư mục và cài đặt bình thường.

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

ngohaibac
09-06-2007, 11:16 PM
Chương trình mình có lỗi nhỏ. Do trong hàm ngắt nhận xử lý nhiều quá nên nó nhận có thể bi mất dữ liệu do truyền tốc độ cao.

Các bạn download tạm phiên bản cũ về nhé.
http://bmnhy.dieukhien.net/NOHB/RS232Communication%20(.Net%20Project).rar

Mình sẽ sửa lại phần này cho ok.

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

kid81
13-08-2007, 03:18 AM
Chào các bạn.

Mình đã làm xong cơ bản giao diện chương trình giao tiếp RS232 bằng Visual C++.Net...........................



Bắc ơi, chương trình mà Bắc viết bằng VC++, giờ muốn gởi dữ liệu ra VĐK thì phải viết thế nào vì VDK chỉ thao tác trên số Hex hay Binary thôi, đúng không?ví dụ giờ muốn VĐK (89c52) hiểu là số 1 thì phải gởi thế nào?có phải gởi chuổi "0x31" như thế này ra bằng lệnh m_mscomm.SetOutput((COleVariant)m_mstransfer) là VDK nó hiểu được đây 0x31 ~số 1 không, hay phải làm sao
Mong giúp đỡ.

toikhongtutin
21-08-2007, 11:17 AM
em cam on cac tai lieu cua cac anh, em dang lam luan van ve truyen du lieu khong day theo chuan "CDMA" nhung khong co tai lieu va huong giai quyet nhu the nao co ai biet thi giup do em, em thanh that cam on.
Neu biet goi mail cho em nha. cuong.1032869@student.ctu.edu.vn

dotuanphong
28-08-2007, 10:31 AM
Chào các bạn!
Tôi có chương trình cân lấy dữ liệu từ đồng hồ cân qua công com máy tính, chương trình viêt bằng fox 2.6 win chạy trên Win 98, nay tôi cài upgrade win XP thì chương trình không còn đọc được dữ liệu qua cổng com nữa. Như vây mình có thể khắc phục được không, xin các bạn giúp dùm nhé!

hoan_spkt
13-11-2007, 08:39 PM
Mỉnh cũng tạo giao diện Cổng Com nhưng dùng visual 2005.net.Mình truyền đc data (dạng text) rùi nhưng nếu dùng lisbox để nhận & hiện thị data thì chỉ hiện đc 1/2 thôi.
nếu mình muốn truuyền 1 file thì có đc ko ? Xin các bác chỉ giáo nha......thanks !

hovanminh
14-11-2007, 04:22 PM
Chao cac bao , no chang khac chi Terminal cua Win ca. Upload code len cho anh e, dung co le tot hon

rmitoday
16-11-2007, 10:47 AM
Chương trình của Bắc có xài overlapped I/O không? Có sử dụng multithread để xử lý riêng biệt không? Mình cũng hay viết chương trình giao tiếp bằng VC nay muốn chuyển qua .NET nên quan rất quan tâm vấn đề này. Còn chuyện tự động detect COM (physical or virtual) plug/unplug thì cũng đơn giản thui hè. Tốt nhất nên share source code để anh em cùng đóng góp kinh nghiệm.

rmitoday
16-11-2007, 10:54 AM
Chào các bạn!
Tôi có chương trình cân lấy dữ liệu từ đồng hồ cân qua công com máy tính, chương trình viêt bằng fox 2.6 win chạy trên Win 98, nay tôi cài upgrade win XP thì chương trình không còn đọc được dữ liệu qua cổng com nữa. Như vây mình có thể khắc phục được không, xin các bạn giúp dùm nhé!
Trong window 95/97/98 cho phép chương trình truy xuất phần cứng trực tiếp bằng các hàm in/out port. Còn từ windows 2000/XP trở đi việc truy xuất phần cứng phải thông qua driver hoặc hàm API của windows. Chương trình cân viết bằng Foxpro 2.6 của bạn có lẽ phải viết lại phần giao tiếp với cổng COM.

dangtq84
25-04-2008, 03:12 AM
Em đang làm đồ án về mobile robot. Em muốn viết một chương trình điều khiển để điều khiển robot thực hiện một số chức năng đơn giản như: tiến,lùi,rẽ trái,rẽ phải. Trên giao diện điều khiển chỉ cần các nút button để thực hiện các chức năng trên. Em thông qua cổng COM để giao tiếp với vi xử lý . Nhưng giờ em không biết xuất tín hiệu điều khiển như thể nào cả. Xuất các string thi em làm được rồi còn cái điều khiển thì chịu. Em đang dùng VC++ để viết code. Bác giúp em đi ạ, mail của em là: dangtq84@gmail.com

ngohaibac
28-04-2008, 11:24 PM
Em đang làm đồ án về mobile robot. Em muốn viết một chương trình điều khiển để điều khiển robot thực hiện một số chức năng đơn giản như: tiến,lùi,rẽ trái,rẽ phải. Trên giao diện điều khiển chỉ cần các nút button để thực hiện các chức năng trên. Em thông qua cổng COM để giao tiếp với vi xử lý . Nhưng giờ em không biết xuất tín hiệu điều khiển như thể nào cả. Xuất các string thi em làm được rồi còn cái điều khiển thì chịu. Em đang dùng VC++ để viết code. Bác giúp em đi ạ, mail của em là: dangtq84@gmail.com

Điều khiển là nhiệm vụ của cấp dưới ở phần mạch chịu trách nhiệm chứ. Còn ở trên PC cậu chỉ phải gửi code lệnh thôi.

Ví dụ: thằng PIC chẳng hạn nhận dc kí tự A thì tiến chẳng hạn. Thế thôi.

Đó là bắt tay của 2 phần mà.

katadfg
14-05-2008, 12:57 AM
Cậu có thể cho mình xin tài liệu về vấn đề này mà viết bang VC++ ko Bắc, nếu có thì mình cảm ơn. Email của minh: hanhkhucbachkhoa@gmail.com

phucvinh885
12-07-2008, 03:22 PM
bó tay
lúc thì VC++ 6, lúc thì VC++.net, lúc thì basic...
em chả hiểu là nên dùng caí nào
cái nào có thể truyền và nhận dữ liệu qua PIC 16f877a và điều khiển thông qua PIC
em thấy các anh nói triền miêm ,
mà cái nào cũng dở dang
bọn em đã gà thì chớ
chả hiểu gì hết

Billinstructor
24-12-2008, 11:14 AM
Cậu có thể hướng dẫn mình cách làm chương trình thường trú trong windows với Visual Basic 6.0 không? vì mình muốm viết một chương trình thường trú đọc dữ liệu từ RS232. Chi tiết đoạn code càng tốt. Cảm ơn nhiều

nhuhuynhcd
05-04-2009, 12:04 PM
anh ơi có phần mạch test ko? e dang làm phần giao tiếp rs232 dùng VC++ a có thể gửi cho e phần mạch test mach nguyên lý với hướng dẫn k? mail của e là thienduongxanh836@yahoo.com thank

tinhgiac_vp
16-04-2009, 06:39 PM
Em đang làm giao tiếp RS232 sử dụng C#. Nhưng chương trình không xử lý lệnh serialport1.close(). Mong mọi người chỉ giáo.
Đây là code C#.

using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace viduRS232
{
public partial class Form1 : Form
{
public string s;
public ArrayList arr = new ArrayList();
public int id;
public Form1()
{
InitializeComponent();
id = 0;
}

private void Form1_Load(object sender, EventArgs e)
{
serialPort1.Close();
}

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
this.Invoke(new EventHandler(display));
}
private void display(object sender, EventArgs e)
{
int flag;
int c;
c = serialPort1.ReadChar();
//string s1 = "";
s = "";
flag = 0;
if (c == 's')
{
flag = 1;
while (flag == 1)
{
c =serialPort1.ReadChar();
if (c == 'S')
{
//textBoxdisplay.Text = s1;
flag = 0;
}
else
s += Convert.ToChar(c);
}
arr.Add(s);
id++;
if (id == 2)
{
serialPort1.Write("S");
}
//serialPort1.Write("s");

//this.textBoxdisplay.Text = s;
}
}

private void buttonRead_Click(object sender, EventArgs e)
{
try
{
serialPort1.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
serialPort1.DataReceived +=new System.IO.Ports.SerialDataReceivedEventHandler(ser ialPort1_DataReceived);
serialPort1.Write("s");
//id = 1;
//while (id == 1) ;
}

private void buttonClose_Click(object sender, EventArgs e)
{
//this.Dispose();
//this.serialPort1.Close();
this.Close();
}

private void buttondisplay_Click(object sender, EventArgs e)
{
this.textBoxdisplay.Text = Convert.ToString(arr[0]);
this.textBox1.Text = Convert.ToString(arr[1]);
this.textBox2.Text = Convert.ToString(id);
//serialPort1.Write("s");
this.serialPort1.Close();
}
}
}

Còn đây là code PIC

#include <18f4331.h>
#device *=16 ADC=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP
#use delay(clock=20000000)
#use rs232(baud = 9600,parity = n,xmit = pin_C6,rcv=pin_C7)
#include <LMB162A.c>
int flag;
void lcd_putstr(char *buffer);
#int_rda
void ngat_rs232()
{
if(flag==0)
{
printf("sxyzS");
}
if(flag==1)
{
printf("sabcS");
}
if(flag==2)
{
printf("s123S");
}
if(flag==3)
{
printf("s456S");
}
putc('\0');
flag++;
}
void main()
{
int id;
char c;
char s[] = "hello";
//char s1[] ="s123456789S";
//char s2[] = "s987654321";
enable_interrupts(global);
enable_interrupts(int_rda);
delay_ms(50);
lcd_init();
delay_ms(10);
printf(lcd_putc,"hello");
flag = 0;
//while(flag==0)
//{
// printf("s123456S");
//}
//lcd_putc('\f');
id = 1;
while(id==1)
{
c = getc();
if(c=='S')
{
id = 0;
//sable_interrupts(int_rda);
}
}
//able_interrupts(int_timer1);
printf(lcd_putc,"xong");
}
void lcd_putstr(char *buffer)
{
unsigned int i = 0;
while (buffer[i] != '\0')
{
lcd_putc(buffer[i]); /* calling another function */
/* to write each char to the lcd module */
i++;
delay_us(10);

}
}


Cho em hỏi thêm là hàm ngắt RDA hình như ngắt liên tục không dừng. Em disable_interrupts(int_rda) thì nó không chạy được hàm lcd_putc(), hình như nó tắt timer gì đó. Các cao thủ giải thích vấn đề này giúp em với, và khắc phục nó như thế nào?

namqn
16-04-2009, 07:14 PM
...
Cho em hỏi thêm là hàm ngắt RDA hình như ngắt liên tục không dừng. Em disable_interrupts(int_rda) thì nó không chạy được hàm lcd_putc(), hình như nó tắt timer gì đó. Các cao thủ giải thích vấn đề này giúp em với, và khắc phục nó như thế nào?
Câu hỏi giống như thế này đã được tôi trả lời ở một luồng khác, nhưng tôi sẽ nói lại. Với PIC 8-bit, khi có ngắt nhận dữ liệu từ USART, bạn cần đọc thanh ghi RCREG để giải phóng nó và xóa cờ ngắt RCIF (đây là cách duy nhất để xóa cờ ngắt này). Nếu bạn không thực hiện việc đọc RCREG (đọc vào một biến tạm nào đó nếu không cần dùng giá trị thanh ghi) thì cờ ngắt RCIF sẽ không được xóa, dẫn đến ngắt nhận dữ liệu từ USART liên tục như bạn đã thấy.

Thân,

tinhgiac_vp
20-04-2009, 06:49 PM
cám ơn trưởng lão nhiều. Còn vấn đề lệnh Serialport1.close() không được thực hiện khi đặt lệnh đó trong hàm ngắt sự kiện data_receive, trưởng lão và các cao thủ có thể chỉ em nguyên nhân không ạ?

tannocdt06
23-05-2009, 04:46 AM
các bác có file.dll nào mà khi add vào thanh toolbox thì visual C++.net có thể giao tiếp ra bên ngoài qua cổng USB. có thì share cho mình nghen ,cám ơn rất nhiều .

Delfy_Coltech
24-05-2009, 01:14 PM
Chương trình của Bắc rất hay! Tuy nhiên cũng còn nhiều trường hợp cần bắt lỗi!
Đúng là ta nên thử nghiệm viết các ứng dụng trên các công cụ mới hơn.
Mình thấy hỗ trợ lớp Serial Port Communication của bộ Visual Studio 2005 là rất mạnh!
Hi vọng là sẽ được học hỏi nhiều ở các bạn và các A đi trước!

To tinhgiac_vp:
Ở đây mình thấy mấy chỗ bạn sử dụng lệnh serialPort1.close()
Không biết là chương trình mắc lỗi ở chỗ nào
- Mình cũng ko hiểu tại sao bạn lại close luôn kết nối khi load form vậy?

private void Form1_Load(object sender, EventArgs e)
{
serialPort1.Close();
}

Bạn nên gửi kèm file chương trình để mọi người cùng test thì tốt hơn!
Và một điều lưu ý khi lập trình đó là các câu lệnh được dịch theo thứ tự từ trên xuống dưới. Do vậy, có khi cả đoạn code là đúng nhưng chỉ là cái cần làm trước lại đặt ở sau thì chương trình cũng không cho kết quả chính xác!
Hihi! Thân chào.
Delfy

thanhtien293
05-03-2010, 07:57 AM
các bạn và các anh cho hỏi làm thế nào để add được lớp MSComm trong VC++2005. mình tìm không thấy

metghe1
08-05-2010, 01:21 PM
khi đã gửi dữ liệu từ máy tính rồi. Làm thế nào để nhận chuỗi rồi hiển thị lên led ma trận vậy các tiền bối

minhduc_bn
18-01-2011, 03:34 PM
e học cơ điện tử không đc học nhiều về vi điều khiển lắm. giờ em đang làm đề tài điều khiển động cơ giao tiếp với máy tính qua cổng com với pic 18f4431. dùng ngôn ngữ ccs c. moi người có thể giúp em phần giao tiếp với cổng com rs232 phần tài liệu đc ko. em xin cám ơn

ngohung.pro
21-02-2011, 10:39 PM
minh dang lam mach dieu khien led bang c++.noi dung :sang tat sen ke,sang don tat don,dem nhi phan va co nut nhan dieu khien ,neu nhan nut thi led se chay trang thai khac. mong cac pac giup minh voi.cam rat nhieu do!

ngohung.pro
21-02-2011, 11:11 PM
minh dang lam mach dieu khien led bang c++.noi dung :sang tat sen ke,sang don tat don,dem nhi phan va co nut nhan dieu khien ,neu nhan nut thi led se chay trang thai khac. mong cac pac giup minh voi.cam rat nhieu do!

lucky89
16-03-2011, 09:06 PM
Các anh các chị ơi ! a chị nào có tài liệu giao tiếp RS232 trên PC dùng C# ko ạ ?
Nếu anh chị nào có làm ơn gửi vào mail phamtuan.kc@gmail.com cho em với ạ !
E xin chân thành cảm ơn và hậu tạ anh chị !

thoapro89
10-09-2011, 12:05 PM
em dùng visual studio 9 2008 c++ thì làm sao anh ơi

boydt0990
29-09-2011, 11:09 PM
a co the giup e dc ko
e dan lam mach dem san pham hien thi lcd ma bay gio
ko biet bat dau tu dau a co the chi giao e ko

engineering
31-12-2011, 07:51 PM
Dạ em xin chào các anh trên 4rum và anh Bắc. Anh giúp em viết thêm tính năng vẽ đồ thị dữ liệu nhận được từ cổng COM do vi điều khiển gửi lên PC được không ạ. Em đang làm cái này cho luận văn, nhưng bị bí mất anh!
p/s: dữ liệu vđk sau khi thực hiện chuyển đổi ADC và truyền UART cho PC liên tục.

Em cảm ơn các anh nhiều!!!

daretowin
17-04-2012, 04:30 PM
Mình cũng đang làm truyền gửi dữ liệu để điều khiển Robot.

Ở trên máy tính mình viết code gửi xuống như sau: (để điều khiển rẻ trái rẻ phải, tới lùi...)

private void forward_Click(object sender, EventArgs e)
{
try
{
serialPort1.Write("0#");
STATUS.Text = "ROBOT FORWARD";
}
catch (Exception)
{
MessageBox.Show("Kết nối chưa được thiết lập", "Connection Error");
}

}
private void turnleft_Click(object sender, EventArgs e)
{
try
{
serialPort1.Write("1#");
STATUS.Text = "ROBOT TURN LEFT";
}
catch (Exception)
{
MessageBox.Show("Kết nối chưa được thiết lập", "Connection Error");
}

}

private void stop_Click(object sender, EventArgs e)
{
try
{
serialPort1.Write("2");
STATUS.Text = "ROBOT STOPPING";
}
catch (Exception)
{
MessageBox.Show("Kết nối chưa được thiết lập", "Connection Error");
}

}

private void turnright_Click(object sender, EventArgs e)
{
try
{
serialPort1.Write("3");
STATUS.Text = "ROBOT TURN RIGHT";
}
catch (Exception)
{
MessageBox.Show("Kết nối chưa được thiết lập", "Connection Error");
}

}




Bên vi điều khiển Pic mình viết code nhận như sau(không hiểu nhận như thế này có đúng không), mà kết quả mình nhận được là mạnh đứng chả có hiện tượng chi hết.

#include <16F877A.h>
#include <def_16F877A.h>
#device *=16
#fuses NOWDT,HS,NOPUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP, NOCPD,NOWRT //khai bao cac thiet dat cho PIC
#use delay(clock=4000000)
#bit rc0 = 0x07.0 //khai bao su dung thach anh 20MHz de su dung ham delay cua chuong trinh
#use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7)
/************************************************** ***********************************/
signed int8 y=0;
#INT_RDA
VOID RECEVICE()
{
y=getc();

}
void main()
{
rc3=0;
enable_interrupts(global);
enable_interrupts(INT_RDA);
while(true)
{
if(y==0)
{ rephai();
}
if(y==1)
{
retrai();
}
}
}............





Mong các cao thủ giúp mình, mình dùng lệnh gửi serialPort1.Write("2");
Thì lệnh nhận ở vi điều khiển if(y==2) có đúng không? Hay nó sẽ hiểu theo kiểu HEX của kí tự "2" ạ ?

daretowin
15-05-2012, 05:30 PM
Mình đã làm được cám ơn.........

magic_boy_1989
05-06-2012, 12:30 PM
cứu e với moi người ơi, e làm như tut của anh NHB nhưng vẫn không chạy .e dùng vs++2010 ,capusb to com dùng chip pl2303,chương trình gửi từ vdk lên thì nhận ( nếu dùng terminal hoặc chuong trinh vb ) nhưng code e làm theo anh NHB thì không đọc được ! E thử dùng ct của a NHB đóng gói nhưng vẫn không chạy .Mấy bác giúp e với e cần gấp gấp lắm !
code e post ở đây :
http://www.dientuvietnam.net/forums/tu-pic-toi-dspic-54/help-pc-khong-nhan-ki-tu-tu-pic-dung-vc-2010-a-123553/

IsIgnorant
07-10-2012, 02:15 AM
mình đang làm một chương trình nho nhỏ giao tiếp giữa rs232 và máy tính đơn giản là dùng phần mềm viết bằng c# để bật tắt đèn LED. Vậy ai có code hoặc có tài liệu liên quan thì send cho mình với ( vì mình cũng mới tìm hiểu về vi điều khiển cũng như PIC 16f887A) nếu có code c# và code mô phỏng trên proteus thì càng tốt . Mong mọi người giúp đỡ nha .