PDA

View Full Version : Gặp vấn đề với RS232 và VC++


entredosaguas
08-11-2010, 10:58 AM
Mình làm giao tiếp RS232 theo tutorial của anh Ngô Hải Bắc nhưng gặp chút rác rối mà không biết giải quyết ra sao. Truyền từ PC xuống PIC thì OK rồi, nhưng phần truyền từ PIC về PC thì có ký tự thì PC hiểu còn có ký tự thì không,và lần nào cũng đúng với ký tự đó,chắc ko phải là nhiễu.Mình đính kèm cái hình để mọi người rõ.
Cái file đính kèm đó là mình gửi các ký tự có mã ASCII từ 30H tới 60H.

Còn đây là phần code sự kiện ngắt nhận VC++:
case 2:// comEvReceive
VARIANT data = m_mscomm.GetInput();
m_strReceive += (CString)data.bstrVal;
Mình chạy thử trên VB và Hyper Terminal thì cũng OK luôn.
Cảm ơn mọi người.
Thân

entredosaguas
09-11-2010, 12:59 AM
Tình hình thế này, mình copy cai project đó sang cái laptop thì OK, truyền lên truyền uống đều OK ko vấn đề gì, vấn đề là ko biết tại sao trên PC lại bị như vậy?

xuanducdhcn
10-11-2010, 12:49 AM
Tình hình thế này, mình copy cai project đó sang cái laptop thì OK, truyền lên truyền uống đều OK ko vấn đề gì, vấn đề là ko biết tại sao trên PC lại bị như vậy?

Bạn thử thêm một số máy xem theo mình nghĩ do cổng COM của PC có vấn đề. Nếu mà không phải thì bạn xem kỹ có phải phần này không . do format kiểu dữ liệu.
/// Trich tai liệu ngô hải bắc
Các bạn để ý thấy rằng kiểu VARIANT dùng làm tham số cho hàm SetIn put và là kiểu trả về của hàm G etOutput. Mà với kiểu truyền kiểu d ạng Text chúng ta truyền dữ liệu r a cổng là dạng xâu kí tự thì ch ng ta chuyển đối giữ kiểu VARIANT sng kiểu kí tự CString như thế nà o?

‐ 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 ta b 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ó b iế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à xon g.
VARIANT data;
CString m_strData = (CString) data.bstrVal;



entredosaguas
10-11-2010, 10:24 AM
Chắc tại format kiểu dữ liệu trên PC vì mình thử chập chân 2 và 3 của cổng COM thì truyền tốt. Cũng chưa giải quyết được.

xuanducdhcn
23-11-2010, 11:50 PM
Mình làm giao tiếp RS232 theo tutorial của anh Ngô Hải Bắc nhưng gặp chút rác rối mà không biết giải quyết ra sao. Truyền từ PC xuống PIC thì OK rồi, nhưng phần truyền từ PIC về PC thì có ký tự thì PC hiểu còn có ký tự thì không,và lần nào cũng đúng với ký tự đó,chắc ko phải là nhiễu.Mình đính kèm cái hình để mọi người rõ.
Cái file đính kèm đó là mình gửi các ký tự có mã ASCII từ 30H tới 60H.

Còn đây là phần code sự kiện ngắt nhận VC++:
case 2:// comEvReceive
VARIANT data = m_mscomm.GetInput();
m_strReceive += (CString)data.bstrVal;
Mình chạy thử trên VB và Hyper Terminal thì cũng OK luôn.
Cảm ơn mọi người.
Thân
//
VARIANT data;
data = m_comm.GetInput();
CString strInput(data.bstrVal);
m_strReceive = strInput+m_strReceive;

// Nếu bạn truyền nhận được mà ký tự nhận được từ pic->PC bị lỗi thì bạn nên kiểm tra lại tốc độ baudrate của PIC và PC xem có khác nhau không ( để ý nếu PIC set là 9600 thì PC cũng là 9600 nếu không sẽ bị lỗi)

Nếu cả hai trường hợp trên đều không phải bạn nên kiểm tra lại MAX232.