PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Giao tiếp cổng COM và LPT (http://www.picvietnam.com/forum/forumdisplay.php?f=44)
-   -   Hỏi về cách ép kiểu trong VC++(Hiển thị trong giao tiếp RS232) (http://www.picvietnam.com/forum/showthread.php?t=3547)

saoxathu 17-02-2009 02:42 PM

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!

namqn 17-02-2009 06:04 PM

Trích:

Nguyên văn bởi saoxathu (Post 22666)
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,

saoxathu 17-02-2009 06:16 PM

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!

namqn 17-02-2009 07:34 PM

Trích:

Nguyên văn bởi saoxathu (Post 22676)
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,

saoxathu 18-02-2009 12:19 PM

Ý 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!

namqn 18-02-2009 03:59 PM

Trích:

Nguyên văn bởi saoxathu (Post 22704)
Ý 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,

saoxathu 19-02-2009 07:09 PM

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

namqn 19-02-2009 08:48 PM

Trích:

Nguyên văn bởi saoxathu (Post 22753)
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,

saoxathu 19-02-2009 11:21 PM

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ỉ?

namqn 19-02-2009 11:31 PM

Trích:

Nguyên văn bởi saoxathu (Post 22767)
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,

saoxathu 20-02-2009 07:41 AM

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!

OHayNhi 20-02-2009 09:47 AM

:(. 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ở :D. Vừa làm vừa tìm hiểu thêm :D

namqn 20-02-2009 11:53 PM

Trích:

Nguyên văn bởi saoxathu (Post 22774)
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,

saoxathu 22-02-2009 09:25 PM

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.

namqn 22-02-2009 09:39 PM

Trích:

Nguyên văn bởi saoxathu (Post 22877)
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,


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

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam