PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > Giao tiếp cổng COM và LPT

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Tìm Kiếm Bài Trong Ngày Ðánh Dấu Ðã Ðọc Vi điều khiển

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...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 17-02-2009, 02:42 PM   #1
saoxathu
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 15
:
Hỏi về cách ép kiểu trong VC++(Hiển thị trong giao tiếp RS232)

Trong một TUT của anh Ngo Hai Bac có nói về phần ép kiểu trong VC++. Nội dung như sau:

Chuyển từ kiểu CString ‐> VARIANT: tôi dùng lớp ColeVariant ( các bạn có thể tra trong MSDN dùng tab Index) là dạng đóng gói của kiểu cấu trúc VARIANT, lớp này có hàm khởi tạo COleVariant( CString& strSrc ); và do đó nó có thể làm tham số cho hàm SetInput của MSComm. Vì vậy chúng ta chỉ cần khai báo một biến ColeVariant là xong.
CString data_tosend = “Example”; CodeVariant temp(data_tosend); m_mscomm1.SetInput(temp);
‐ Chuyển từ kiểu VARIANT sang kiểu CString. Các bạn xem lại định nghĩa cấu trúc
VARIANT ở trên xem có biến nào có kiểu trả về kiểu tương thích với kiểu CString( tức có
thể ép kiểu để trở thành kiểu CString).
Tôi thấy có thành phần
BSTR bstrVal;
Do đó ta chỉ việc ép kiểu là xong.
VARIANT data;
CString m_strData = (CString) data.bstrVal;


Cho mình hỏi các hàm ép kiểu dữ liệu khác như thế nào, như chuyển qua ascii hay hexa...
Xin cảm ơn!
saoxathu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2009, 06:04 PM   #2
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi saoxathu View Post
Trong một TUT của anh Ngo Hai Bac có nói về phần ép kiểu trong VC++. Nội dung như sau:

Chuyển từ kiểu CString ‐> VARIANT: tôi dùng lớp ColeVariant ( các bạn có thể tra trong MSDN dùng tab Index) là dạng đóng gói của kiểu cấu trúc VARIANT, lớp này có hàm khởi tạo COleVariant( CString& strSrc ); và do đó nó có thể làm tham số cho hàm SetInput của MSComm. Vì vậy chúng ta chỉ cần khai báo một biến ColeVariant là xong.
CString data_tosend = “Example”; CodeVariant temp(data_tosend); m_mscomm1.SetInput(temp);
‐ Chuyển từ kiểu VARIANT sang kiểu CString. Các bạn xem lại định nghĩa cấu trúc
VARIANT ở trên xem có biến nào có kiểu trả về kiểu tương thích với kiểu CString( tức có
thể ép kiểu để trở thành kiểu CString).
Tôi thấy có thành phần
BSTR bstrVal;
Do đó ta chỉ việc ép kiểu là xong.
VARIANT data;
CString m_strData = (CString) data.bstrVal;


Cho mình hỏi các hàm ép kiểu dữ liệu khác như thế nào, như chuyển qua ascii hay hexa...
Xin cảm ơn!
Bạn muốn chuyển từ kiểu gì sang ASCII hay hexadecimal? Hexadecimal thực ra chỉ là một kiểu biễu diễn số nhị phân, chứ không nên gọi là kiểu dữ liệu.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2009, 06:16 PM   #3
saoxathu
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 15
:
Cảm ơn anh Nam, ý của em là khi nhận một dữ liệu rồi hiển thị với nhiều kiểu biểu diễn khác nhau, ascii,hexa,nhị phân ...(với cách hướng dẫn như anh Bắc).
Xin cảm ơn!

thay đổi nội dung bởi: saoxathu, 17-02-2009 lúc 06:21 PM.
saoxathu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-02-2009, 07:34 PM   #4
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi saoxathu View Post
Cảm ơn anh Nam, ý của em là khi nhận một dữ liệu rồi hiển thị với nhiều kiểu biểu diễn khác nhau, ascii,hexa,nhị phân ...(với cách hướng dẫn như anh Bắc).
Xin cảm ơn!
Vẫn chưa rõ bạn ạ. Bạn nhận dữ liệu từ một cảm biến, từ thiết bị giao tiếp người-máy, hay từ cái gì khác? Kiểu dữ liệu bạn nhận được là kiểu gì.

Tóm lại, để biết có thể ép kiểu hay không, cần biết kiểu dữ liệu ở đầu vào, và kiểu dữ liệu cần có ở đầu ra. Nếu không tương thích thì phải chuyển đổi, còn nếu tương thích thì có thể ép kiểu. Ép kiểu chẳng qua là để trình biên dịch có thể biên dịch đúng, ví dụ, string và array of byte có thể coi là tương thí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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-02-2009, 12:19 PM   #5
saoxathu
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 15
:
Ý của em đơn giản hơn anh Nam nghĩ nhiều.
Em ví dụ nhé:
Em gửi lên máy tính số 32( thập phân), trên giao diện em muốn nó hiển thị kết quả nhật dưới dạng:hexa 0x20,oct 40,Bin 00100000, ascii A ...
Em dùng VC++
Cảm ơn anh!
saoxathu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 18-02-2009, 03:59 PM   #6
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi saoxathu View Post
Ý của em đơn giản hơn anh Nam nghĩ nhiều.
Em ví dụ nhé:
Em gửi lên máy tính số 32( thập phân), trên giao diện em muốn nó hiển thị kết quả nhật dưới dạng:hexa 0x20,oct 40,Bin 00100000, ascii A ...
Em dùng VC++
Cảm ơn anh!
Để hiển thị một byte ở dạng:
- Hexadecimal: chia số cần hiển thị thành từng cụm 4 bit liên tiếp (từ bit thấp nhất đi ngược lên), rồi giải mã để hiển thị (một cụm số như vậy sẽ là 1 hexa digit), như vậy sẽ có 2 cụm.
- Octal: chia số cần hiển thị thành từng cụm 3 bit liên tiếp (từ bit thấp nhất đi ngược lên), rồi giải mã để hiển thị (một cụm số như vậy sẽ là 1 octal digit), như vậy sẽ có 3 cụm (cụm cao nhất chỉ có 2 bit).
- Binary: test lần lượt từng bit để hiển thị thành '1' hay '0', như vậy sẽ có 8 lần test cho 8 vị trí bit.
- ASCII: sử dụng toàn bộ 8 bit để tra bảng mã ASCII.

Không cần ép kiểu ở đây, bạn chỉ muốn hiển thị ở những format khác nhau mà thôi.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-02-2009, 07:09 PM   #7
saoxathu
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 15
:
Biến nhận của em khai báo là VARIANT data;vậy chia kiểu gì anh Nam, em nghĩ kiểu gì cũng phải ép kiểu chứ.
saoxathu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-02-2009, 08:48 PM   #8
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi saoxathu View Post
Biến nhận của em khai báo là VARIANT data;vậy chia kiểu gì anh Nam, em nghĩ kiểu gì cũng phải ép kiểu chứ.
Tôi không thấy có lý do để dùng kiểu VARIANT. Như bạn ví dụ, bạn muốn gửi giá trị 32 thập phân lên máy tính. Như vậy có thể dùng một biến kiểu char, hay byte để chứa giá trị đó. Ở phía máy tính, khi nhận được nó thì sử dụng các phương pháp mà tôi đã nêu để hiển thị ở những format khác nhau.

Nếu bạn muốn gửi những giá trị > 256 thập phân, bạn vẫn có thể làm theo cách trên, gửi nhiều byte liên tiếp của giá trị đó, sau đó dùng các phương pháp đã nêu để hiển thị giá trị nhiều byte này ở những format khác nhau.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-02-2009, 11:21 PM   #9
saoxathu
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 15
:
Cám ơn anh Nam, em sẽ thử, em bị ảnh hưởng bởi cách xử lý của anh Bắc, nên mới định giải quyết theo hướng đó. Nhưng anh Nam xem lại xem, người ta có thường phải viết một hàm chỉ để biểu diễn kiểu đó không nhỉ?
saoxathu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 19-02-2009, 11:31 PM   #10
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi saoxathu View Post
Cám ơn anh Nam, em sẽ thử, em bị ảnh hưởng bởi cách xử lý của anh Bắc, nên mới định giải quyết theo hướng đó. Nhưng anh Nam xem lại xem, người ta có thường phải viết một hàm chỉ để biểu diễn kiểu đó không nhỉ?
Tư tưởng của tôi khi thiết kế là dùng phương pháp đơn giản nhất có thể có để giải quyết bài toán. Sự đơn giản sẽ giúp giảm được các lỗi phát sinh trong quá trình hiện thực (vì không phải qua nhiều khâu trung gian), sửa lỗi dễ dàng hơn, code nhìn mạch lạc hơn, ...

Nếu bạn muốn nói đến các hàm chuyển đổi format để hiển thị: đúng, cộng đồng thường có một thư viện liên quan đến việc này (với PIC thì có thể tham khảo ở PIClist http://www.piclist.com/techref/micro...adix/index.htm).

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-02-2009, 07:41 AM   #11
saoxathu
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 15
:
Làm quen VC++ không lâu nên còn một số thứ rất mơ hồ. Người ta send file như thế nào vậy anh Nam?
Cảm ơn anh!
saoxathu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-02-2009, 09:47 AM   #12
OHayNhi
Đệ tử 1 túi
 
Tham gia ngày: Sep 2007
Bài gửi: 12
:
. Cái này chỉ là định dạng kiểu hiển thị số liệu ra màn hình mà. Không fai dùng ép kiểu j cả, như trong c %d,hay%... Quan trọng là bạn hiển thị số liệu trên điều khiển nào. Edit, texbox hay... Nói chung là bạn lên xây dựng một lớp kế thừa từ các lớp điều khiển cơ sở . Vừa làm vừa tìm hiểu thêm
OHayNhi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-02-2009, 11:53 PM   #13
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi saoxathu View Post
Làm quen VC++ không lâu nên còn một số thứ rất mơ hồ. Người ta send file như thế nào vậy anh Nam?
Cảm ơn anh!
Nếu bạn muốn hỏi về việc xử lý file trên máy tính bằng C++ thì tôi không thạo lắm. Tôi chỉ có ít kinh nghiệm xử lý file trên máy tính bằng Pascal (cách đây khoảng hơn 10 năm). Gần đây tôi chỉ viết code cho vi điều khiển, chứ không còn viết code cho máy tính.

Bạn định gửi file từ đâu đến đâu?

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-02-2009, 09:25 PM   #14
saoxathu
Đệ tử 1 túi
 
Tham gia ngày: Aug 2007
Bài gửi: 15
:
Em định gửi một mảng dữ liệu từ vi điều khiển lên, dữ liệu và kết quả tính toán được đóng gói thành file lưu trên máy tính, và theo chiều ngược lại khi cần.
saoxathu vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 22-02-2009, 09:39 PM   #15
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi saoxathu View Post
Em định gửi một mảng dữ liệu từ vi điều khiển lên, dữ liệu và kết quả tính toán được đóng gói thành file lưu trên máy tính, và theo chiều ngược lại khi cần.
Như vậy thì rõ ràng bạn chỉ cần thao tác các file ở phía máy tính. Bạn có thể dùng file kiểu binary, hoặc text. Để dễ dàng kiểm tra sau này thì có lẽ bạn nên dùng kiểu text, và bạn tự quy định khuôn dạng dữ liệu được lưu (như 1 dòng cho một hay vài giá trị dữ liệu, dữ liệu ở dạng ASCII thập phân, hay hexadecimal, hay dạng khác). Nếu đi theo con đường này thì ở phía máy tính bạn cần chuyển đổi dữ liệu binary được gửi từ vi điều khiển đến máy tính thành dạng ASCII được chọn để lưu ra file, và chuyển đổi dạng dữ liệu ASCII của file lưu trữ thành dữ liệu binary để gửi từ máy tính đến vi điều khiển. Nên làm theo hướng này để tận dụng sức mạnh tính toán của máy tính, và giảm gánh nặng tính toán cho vi điều khiển.

Có nhiều thuật toán chuyển đổi dữ liệu qua lại giữa binary và ASCII (dành cho máy tính) có thể tìm thấy trên internet bằng google. Việc thao tác trên file văn bản đã được hỗ trợ bởi các hàm thư viện của C++.

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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 07:32 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam