Đề tài Lập trình giao tiếp máy tính qua cổng RS232

Cách thiết lập tối ưu cho ứng dụng 

Để  cho ứng dụng có thể đọc ngay dữ liệu khi bắt đầu có trong bộ đệm nhận thì các bạn 

nên đặt thuộc tính RthresHold = 1. 

Ngoài ra các bạn cần quan tâm đến các tham số: CommPort, Settings, Rthreshold, 

SthresHold,PortOpen, InputLen, InputBuffer, OutputBuffer, InBufferSize, InputMode, 

OutBufferSize. 

 

pdf78 trang | Chia sẻ: netpro | Lượt xem: 1728 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Đề tài Lập trình giao tiếp máy tính qua cổng RS232, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ện này.  comEvEOF  7  Xảy ra khi nhận được kí tự kết thúc file ( kí tự 26 trong  bảng mã ASCII)   + EOFEnable : object.EOFEnable [ = value ] quyết định các hành động nếu MSComm  tìm thấy kí tự kết thúc file. Nếu value=true khi tìm thấy kí tự kết thúc file thì sẽ gây lên sự  kiện comEvEOF trong OnCommEvent. Nếu value= false thì sẽ không gây lên sự kiện này.  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  7/78  + InBufferCout: trả lại số kí tự đang có trong bộ đệm nhận Bạn có thể xoá bộ đệm nhận  bằng cách đặt thuộc tính này =0 . Không nhầm với thuộc tính InBufferSize là tổng kích  thước của bộ đệm nhận.  + Input: nhận và xoá dữ liệu trong bộ đệm nhận.  Nếu InputMode là comInputModeText  thì giá trị trả về sẽ là một xâu tức có kiểu  String , dữ liệu dạng text trong một biến kiểu Variant. Nếu InputMode =  comInputModeBinary thì thuộc tính này sẽ trả lại dữ liệu dạng nhị phân dưới dạng một  mảng kiểu byte trong một biến Variant.  + OutBufferCount: trả lại số kí tự trong bộ đệm truyền.  + Output: ghi dữ liệu vào bộ đệm truyền. có thể truyền kiểu text hoặc kiểu nhị phân.  Nếu truyền bằng kiểu text thì cho một biến Variant = kiểu String, nếu truyền kiểu nhị phân  thì cho cho Output= variant = một mảng kiểu Byte.  Bắt tay( handshaking):   + Break : thiết lập hoặc xoá tín hiệu. object.Break [ = value] value = true hoặc false. Khi  set value= true thì thông số Break này sẽ gửi một tín hiệu break. Tín hiệu break trì hoàn  việc truyền dữ liệu và đưa đường truyền vào trạng thái break tới khi mà value = false.  + CDHolding: quết định xem sự truyền này đến đâu bằng cách truy vấn đường CD(  Carrier Detect). Carrier Detect là tín hiệu gửi từ modem tới máy tính kết nối với nó thống  báo rằng nó đang online. Nếu giá trị = true thì nó đường CD đang ở mức cao, nếu = false  thì đường dây này đang ở mức thấp. Tính chất này không có trong lúc thiết kế chỉ có trong  khi chạy chương trình.Carrier Detect được biết như là Receive Line Signal Detect (RLSD).  + CTSHolding: quết định khi nào bạn gửi dữ liệu bằng cách truy vấn trạng thái đường  Clear To Send (CTS). Thông thường tín hiệu CTS được gửi từ modem tới máy tính kết nối  với nó để báo rằng đang quá trình truyền dữ liệu. Thuộc tính Readonly chỉ xuất hiện khi  chạy chương trình. Đường Clear To Send dùng trong RTS/CTS (Request To Send/Clear To  Send) bắt tay phần cứng. CTSHolding cho bạn một cách để tự tay dò đường Clear To Send  nếu bạn cần biết trạng thái của nó.   + DSRHolding: biết trạng thái của đường Data Set Ready (DSR). Tín hiệu Data Set  Ready truyền từ modem tới máy tính nối với nó để thông báo rằng modem đã sẵn sàng  hoạt động. Tính chất này dùng khi viết Data Set Ready/Data Terminal Ready handshaking  routine cho máy Data Terminal Equipment (DTE)‐ máy trang bị đầu cuối dữ liệu.  + DTREnable: tính chất này quyết định khi nào cho phép đường Data Terminal Ready  (DTR) trong truyền thông. Tín hiệu DTR gửi từ máy tính tới modem đẻ báo rằng máy tính  sẵn sàng là nơi nhận dữ liệu. Khi DTREnable = true thì đường Data Terminal Ready set lên  cao khi cổng mở, và thấp khi cổng đóng. Nếu DTREnable = false thì đường đó luôn mức  thấp. Trong phần lớn trường hợp set đường Data Terminal Ready thành thấp để hang up  telephone.   Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  8/78  + Handshaking: thiết lập và trả lại giao thức bắt tay phần cứng. object.Handshaking [ =  value ].  Các giá trị của value:   comNone     0  (Mặc định) Không bắt tay  comXOnXOff  1  Bắt tay XON/XOFF  comRTS     2  Bắt tay RTS/CTS (Request To Send/Clear To Send)   comRTSXOnXOff  3  Dùng cả bắt tay Request To Send and XON/XOFF     Handshaking chỉ là giao thức truyền thông nội tại quyết định bởi dữ liệu nào được  truyền từ cổng phần cứng tới bộ đệm nhận. Khi kí tự của dữ liệu tới cổng nối tiếp, thiết bị  truyền thông sẽ chuyển nó vào trong bộ đệm nhận và chương trình của bạn có thể đọc  chúng. Nếu không có bộ đệm dữ liệu hoặc chương trình của bạn cần đọc kí tự trực tiếp từ  phần cứng , bạn có thể mất dữ liệu bởi vì kí tự từ phần cứng đến rất nhanh. Giao thức  Handshaking đảm bảo dữ liệu không bị mất, khi dữ liệu đến cổng quá nhanh thì thiết bị  truyền thông sẽ chuyển dữ liệu vào trong bộ đệm nhận.   + RTSEnable: quết định khi nào cho phép đường Request To Send (RTS), Tín hiệu RTS  từ máy tính tới modem để yêu cầu được tryền dữ liệu. Khi RTSEnable = true thì đường  RTS mức cao khi cổng mở, tích mức thấp khi cổng đóng. Và hiển nhiên khi RTSEnable thì  đường RTS luôn mức thấp.RTS dùng trong RTS/CTS hardware handshaking. RTSEnable  cho phép bạn dò đường RTS khi cần biết tình trạng của đường này.          Các tính chất trên không có lúc thiết kế giao diện mà chỉ có lúc chạy chương trình (  dùng trong viết code).  1.1.2. Điều khiển MSComm trong Visual C++         Trên đây là các tham số của điều khiển MSComm trong VB.   Trong Visual C++ , mỗi một điều khiển được định nghĩa trong một lớp riêng. Và  MSComm cũng không phải là ngoại lệ.   Với các tham số ở trên các bạn hoàn toàn có thể áp dụng rất là tốt cho lập trình với  VC++ bởi lẽ các tham số này bạn có thể lấy giá trị hoặc thiết lập tham số cho chúng tương  ứng bằng các hàm thành viên cửa lớp như Get_thuộctính hoặc Set_thuộctính.  Ví dụ, bạn muốn thiết lập dùng cổng COM1 chẳng hạn thì dùng thuộc tính CommPort  ở trên và chỉ thêm tiền tố Set_ nếu muốn thiết lập và Get_  nếu muốn lấy giá trị này.  Sau đây là lớp MSComm là một lớp kế thừa từ lớp cở sở CWnd, các bạn có thể tham  khảo. Các bạn chú ý về các kiều dữ liệu cửa các tham số và giá trị trả về của các hàm. Việc  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  9/78  chuyển đổi giữa các kiểu dữ liệu này các bạn có thể tham khảo tại  thư viện MSDN  Microsoft July 2001 bằng cách Search  Key Word: chính là các từ khoá chỉnh là các kiểu dữ liệu đó.( như CString,…)  class CMSComm : public CWnd  {  protected:    DECLARE_DYNCREATE(CMSComm)  public:    CLSID const& GetClsid()    {      static CLSID const clsid      = { 0x648a5600, 0x2c6e, 0x101b, { 0x82, 0xb6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x14 } };      return clsid;    }    virtual BOOL Create(LPCTSTR lpszClassName,      LPCTSTR lpszWindowName, DWORD dwStyle,      const RECT& rect,      CWnd* pParentWnd, UINT nID,      CCreateContext* pContext = NULL)    { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID);  }      BOOL Create(LPCTSTR lpszWindowName, DWORD dwStyle,      const RECT& rect, CWnd* pParentWnd, UINT nID,      CFile* pPersist = NULL, BOOL bStorage = FALSE,      BSTR bstrLicKey = NULL)    { return CreateControl(GetClsid(), lpszWindowName, dwStyle, rect, pParentWnd, nID,      pPersist, bStorage, bstrLicKey); }  // Attributes  public:  // Các phép toán  public:    void SetCDHolding(BOOL bNewValue);    BOOL GetCDHolding();    void SetCommID(long nNewValue);    long GetCommID();  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  10/78    void SetCommPort(short nNewValue);    short GetCommPort();    void SetCTSHolding(BOOL bNewValue);    BOOL GetCTSHolding();    void SetDSRHolding(BOOL bNewValue);    BOOL GetDSRHolding();    void SetDTREnable(BOOL bNewValue);    BOOL GetDTREnable();    void SetHandshaking(long nNewValue);    long GetHandshaking();    void SetInBufferSize(short nNewValue);    short GetInBufferSize();    void SetInBufferCount(short nNewValue);    short GetInBufferCount();    void SetBreak(BOOL bNewValue);    BOOL GetBreak();    void SetInputLen(short nNewValue);    short GetInputLen();    void SetNullDiscard(BOOL bNewValue);    BOOL GetNullDiscard();    void SetOutBufferSize(short nNewValue);    short GetOutBufferSize();    void SetOutBufferCount(short nNewValue);    short GetOutBufferCount();    void SetParityReplace(LPCTSTR lpszNewValue);    CString GetParityReplace();    void SetPortOpen(BOOL bNewValue);    BOOL GetPortOpen();    void SetRThreshold(short nNewValue);    short GetRThreshold();    void SetRTSEnable(BOOL bNewValue);    BOOL GetRTSEnable();    void SetSettings(LPCTSTR lpszNewValue);    CString GetSettings();    void SetSThreshold(short nNewValue);    short GetSThreshold();    void SetOutput(const VARIANT& newValue);    VARIANT GetOutput();    void SetInput(const VARIANT& newValue);  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  11/78    VARIANT GetInput();    void SetCommEvent(short nNewValue);    short GetCommEvent();    void SetEOFEnable(BOOL bNewValue);    BOOL GetEOFEnable();    void SetInputMode(long nNewValue);    long GetInputMode();  };  Các bạn xem kĩ các hàm, các phép toán trên có thể  thấy là kiểu dữ liệu dùng làm tham  số cho hàm hay giá trị trả về của các hàm hầu hết là các kiểu dữ liệu cơ bản như BOOL,  short,.. Chỉ đặc biết là có kiểu dữ liệu VARIANT.  VARIANT là một cấu trúc mà dữ liệu nó chứa là một kiểu union được định nghĩa như  sau:  typedef struct FARSTRUCT tagVARIANT VARIANT; typedef struct FARSTRUCT tagVARIANT VARIANTARG; typedef struct tagVARIANT { VARTYPE vt; unsigned short wReserved1; unsigned short wReserved2; unsigned short wReserved3; union { Byte bVal; Short iVal; long lVal; float fltVal; double dblVal; VARIANT_BOOL boolVal; SCODE scode; CY cyVal; DATE date; BSTR bstrVal; DECIMAL FAR* pdecVal IUnknown FAR* punkVal; IDispatch FAR* pdispVal; SAFEARRAY FAR* parray; Byte FAR* pbVal; short FAR* piVal; long FAR* plVal; float FAR* pfltVal; double FAR* pdblVal; VARIANT_BOOL FAR* pboolVal; SCODE FAR* pscode; CY FAR* pcyVal; DATE FAR* pdate; BSTR FAR* pbstrVal; IUnknown FAR* FAR* ppunkVal; IDispatch FAR* FAR* ppdispVal; SAFEARRAY FAR* FAR* pparray; VARIANT FAR* pvarVal; void FAR* byref; Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  12/78  char cVal; unsigned short uiVal; unsigned long ulVal; int intVal; unsigned int uintVal; char FAR * pcVal; unsigned short FAR * puiVal; unsigned long FAR * pulVal; // VT_BYREF|VT_UI4. int FAR * pintVal; unsigned int FAR * puintVal; }; }; Các bạn để  ý thấy rằng kiểu VARIANT dùng làm tham số cho hàm SetInput và là kiểu  trả về của hàm GetOutput. Mà với kiểu truyền kiểu dạng Text chúng ta truyền dữ liệu ra  cổng là dạng xâu kí tự thì chúng ta chuyển đối giữ kiểu VARIANT sang 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 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;  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  13/78  1.3. Cách thiết lập tối ưu cho ứng dụng  Để  cho ứng dụng có thể đọc ngay dữ liệu khi bắt đầu có trong bộ đệm nhận thì các bạn  nên đặt thuộc tính RthresHold = 1.  Ngoài ra các bạn cần quan tâm đến các tham số: CommPort, Settings, Rthreshold,  SthresHold,PortOpen, InputLen, InputBuffer, OutputBuffer, InBufferSize, InputMode,  OutBufferSize.  2. Lập trình  2.1. Mục đích yêu cầu  Chương trình này rất là đơn giản. Chúng ta sẽ tạo ra một chương trình có giao diện như  sau:  Hình 2.1: Giao diện chương trình     Chương trình có chức năng sau:  ‐ Nhập kí tự hoặc xâu kí tự vào EditBox Transfer, điều chỉnh tham số giao tiếp trên  các ComboBox. Nhấn nút Send để gửi dữ liệu ra cổng COM.   ‐ Đồng thời với nó nếu có dữ liệu truyền vê cổng Com thì dữ liệu sẽ được hiển thị  lên EditBox Receive. Khi bạn nhấn vào Clear thì sẽ xoá dữ liệu hiển thị trên EditBox này.  Chú ý:  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  14/78  Để có thể test luôn chương trình các bạn nối tắt chân 2 và chân 3 của RS232 lại với nhau  chính là nối chân RxD và TxD để chúng ta truyền dữ liệu ra RS232 sau đó nhận dữ liệu  luôn. Đây là ví dụ test đơn giản không có bắt tay phần cứng.  Hình 2.2: Sơ đồ đấu chân của RS232  2.2. Thiết kế giao diện cho chương trình   2.2.1. Tạo dự án “RS232TUT”  Khởi động Visual C++, chọn New từ menu File  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  15/78  Hình 2.3: Chọn New từ menu file  Hình 2.4: Chọn MFC Application(exe), tên dự án, nơi chứa dự án  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  16/78  Hình 2.5: Chọn Dialog based  Hình 2.6: Nhấn Next tiếp tục  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  17/78  Hình 2.7: chọn như mặc định, nhấn Next luôn  Hình 2.8: Kích finish để kết thúc việc tạo dự án  Giao diện của ứng dụng ban đầu như sau:   Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  18/78  Hình 2.9: Giao diện ban đầu  2.2.2. Thêm điều khiển ActiveX  Microsoft Communication 6.0  Đầu tiên bạn dùng nút Delete xoá 2  nút OK,Cancel và dòng văn bản tĩnh TODO  Từ menu Project chọn Add to Project. Menu con hiện ra bạn chọn Components  and Controls:  Hình 2.10: Chọn Components Controls  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  19/78  Hộp thoại Components and Control Gallery xuất hiện bạn chọn Regestered  ActiveX Controls(đây là thư mục chứa các điều khiển ActiveX):  Hình 2.11: Chọn thư mục đầu tiên  Trong thư mục Registered ActiveX Controls bạn chọn điều khiển mà mình cần  Microsoft Communications Control, version 6.0. Kích OK  Hình 2.12: Chọn Microsoft Communication Control, version 6.0  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  20/78  Hộp thoại yêu cầu bạn xác nhận có thêm điều khiển này vào không, chọn OK  Hình 2.13: Chọn OK để thêm điều khiển   Khi đó chúng ta sẽ có được một lớp mới CMSComm là lớp dẫn xuất của lớp cơ  sở CWnd. Lớp này được khai báo trong file MSComm.h và định nghĩa trong file  MSComm.cpp  Hình 2.14: Chọn tên lớp, tên header file, file thực thi như mặc định  Nhấn Close để đóng hộp thoại  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  21/78  Hình 2.15: Đóng cửa sổ Components and Controls Gallery  Bạn thêm điều khiển MSComm vào hộp giao diện bằng cách gắp thả như với các  điều khiển thông thường khác  Hình 2.16: Thêm điều khiển MSComm  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  22/78  Thế là các bạn đã cho được ứng dụng MSComm vào trong Dialog  2.2.3. Thêm các điều khiển khác  2.2.3.1. Thêm các Group Box  Hình 2.17: Thêm GroupBox1  Hình 2.18: Thêm GroupBox2  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  23/78  Hình 2.19: Thêm GroupBox3  Hình 2.20: Thêm GroupBox4  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  24/78  Hình 2.21: Thêm GroupBox5  Hình 2.22: Thêm GroupBox6  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  25/78  Hình 2.23: Thêm GroupBox7  Hình 2.24: Thêm GroupBox8  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  26/78  Hình 2.25: Thêm GroupBox9  Thay đổi thuộc tính cho GroupBox1:  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  27/78  Hình 2.26: Kích chuột vào GroupBox1 chọn Properties  Hình 2.27: Thiết lập thuộc tính Caption: Settings  Các bạn làm tương tự với các GroupBox khác, theo hình vẽ dưới đây:  Hình 2.28: Thiết lập thuộc tính cho GroupBox2  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  28/78  Hình 2.30: Thiết lập thuộc tính cho GroupBox3  Hình 2.31: Thiết lập thuộc tính cho GroupBox4  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  29/78  Hình 2.32: Thiết lập thuộc tính cho GroupBox5  Hình 2.33: Thiết lập thuộc tính cho GroupBox6  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  30/78  Hình 2.34: Thiết lập thuộc tính cho GroupBox7  Hình 2.34: Thiết lập thuộc tính cho GroupBox8  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  31/78  Hình 2.35: Thiết lập thuộc tính cho GroupBox9  Tiếp theo các bạn làm cho các GroupBox 4‐>9 có kích thước bằng nhau và căn lề đẹp hơn  Hình 2.36: Làm cho các GroupBox có cùng kích thước  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  32/78  Hình 2.37 Làm cho các GroupBox 7‐>9 có khoảng cách bằng nhau  Hình 2.38: Làm cho các GroupBox này thẳng hàng với nhau  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  33/78  Hình 2.39: Kết quả sau khi làm cho cùng kích thước  2.2.3.2. Thêm các EditBox  Hình 2.40: Thêm EditBox1  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  34/78  Hình 2.41: kích chuột phải, chọn Properties   Hình 2.42: Thiết lập ID cho EditBox1  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  35/78  Hình 2.43: Thiết lập thuộc tính ReadOnly và MultiLine  Hình 2.44: Thêm EditBox2  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  36/78  Hình 2.45: Chọn Properties  Hình 2.46: Thuộc tính của EditBox  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  37/78  2.2.3.3. Thêm các Button  Hình 2.47: Thêm Button1  Hình 2.48: Thêm Button2  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  38/78  Hình 2.49: Thêm Button3  Hình 2.50: Tạo 3 Button có cùng kích thước  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  39/78  Hình 2.51: Chọn Properties  Hình 2.52: Thuộc tính của Button1  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  40/78  Hình 2.53: Thuộc tính của Button2  Hình 2.54: Thuộc tính của Button3  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  41/78  2.2.3.4. Thêm các ComboBox  Hình 2.55: Thêm ComboBox1  Hình 2.56: Thêm ComboBox2  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  42/78  Hình 2.57: Thêm ComboBox3  Hình 2.58: Thêm ComboBox4  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  43/78  Hình 2.59: Thêm ComboBox5  Hình 2.60: Thêm ComboBox6  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  44/78  Hình 2.61: Tạo cho các comboBox có cùng chiều rộng  Chú ý:  Riêng với ComboBox thì các bạn phải kéo sao cho chiều cao của điều  khiển phải đủ lớn để chứa các dữ liệu nằm trong nó sau này nếu không thì bạn sẽ  chẳng thấy nó hiển thị gì hoặc là sẽ thấy có thanh cuộn. Tốt nhất là kéo dài thoải mái  đi.   Để điều chỉnh chiều cao của các ComboBox như sau:   Di chuột đến ComboBox để con trỏ chuột nằm trên nút xổ xuống của điều khiển  sau đó kích chuột trái 1 lần. Khi đó bạn sẽ có thể co dãn chiều cao của ComboBox  thoải mái  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  45/78  Hình 2.62: Co dãn chiều dài của ComboBox  Tiếp theo, thiết lập các tham số cho các ComboBox  Hình 2.63: Chọn thuộc tính Properties của ComboBox1  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  46/78  Hình 2.64: Thuộc tính ID của Combo1  Hình 2.65: Thuộc tính ID của Combo3  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  47/78  Hình 2.66: Thuộc tính ID của Combo5  Hình 2.67: Thuộc tính ID của Combo2  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  48/78  Hình 2.68: Thuộc tính ID của ComboBox 4  Hình 2.69: Thuộc tính ID của ComboBox6  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  49/78  Hình 2.70: Thuộc tính Type: DropList của các ComboBox chung  Các bạn sau kiểm tra các thuộc tính của các điều khiển bằng bảng sau:  STT  Đối tượng  Thuộc tính  Thiết lập  1  MSComm  ID  IDC_MSCOMM1  2  ComboBox  ID  Style  IDC_COMBO_COMPORT  Droplist  3      IDC_COMBO_BITRATE  Droplist  4      IDC_COMBO_DATABIT  Droplist  5      IDC_COMBO_PARITYBIT  Droplist  6      IDC_COMBO_STOPBIT  Droplist  7      IDC_COMBO_HANDSHAKING  Droplist  8  Button  ID  IDC_BUTTON_CLEAR  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  50/78  Caption  &Clear  9      IDC_BUTTON_SEND  &Send  10      IDC_BUTTON_EXIT  &Exit  11  EditBox  ID  Style  IDC_EDIT_RECEIVE  Read Only( check)  12      IDC_EDIT_TRANSFER  13  Group Box  ID  IDC_STATIC  Settings  14      IDC_STATIC  Receive  15      IDC_STATIC  Trasfer  2.3. Viết mã cho chương trình  2.3.1. Thêm các biến, các hàm thành viên  Để viết mã cho chương trình thì các bạn cần phải thêm các biến cho các điều  khiển. Từ menu View chọn Class Wizard. Chọn tab MemberVariables. Chọn lớp  CRS232TUTDlg  Hình 2.71: Chọn MFCClassWizard tab Member Variables, chọn AddVariable..  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  51/78  Xin lấy ví dụ thêm biến m_cboBitRate cho điều khiển có ID là  IDC_COMBO_BITRATE  Hình 2.72: Thêm biến điều khiển cho ComboBox BitRate  Các bạn thêm các biến cho các điều khiển tương tự như trên. Sau đây là hình minh hoạ  việc thêm các biến này:  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  52/78  Hình 2.73: Thêm biến điều khiển cho ComboBox ComPort  Hình 2.74: Thêm biến điều khiển cho ComboBox Data Bit  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  53/78  Hình 2.75: Thêm biến điều khiển cho Combo Handshaking  Hình 2.76: Thêm biến điều khiển cho Combo Parity Bit  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  54/78  Hình 2.77: Thêm biến điều khiển cho Combo Stop Bit  Hình 2.78: Thêm biến giá trị cho Edit Box Receive  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  55/78  Hình 2.79: Thêm biến giá trị cho EditBox Transfer  Hình 2.80: Thêm biến điều khiển cho MSComm  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  56/78  Hình 2.81: Kết quả cuối cùng trong của sổ MFC..   Thêm các hàm thành viên:   Đã xong phần thêm các biến. Bây giờ các bạn sẽ thêm một số hàm như sau:   void InitComboBox(void)   dùng khởi tạo cho các ComboBox  void Setting(void)    thiết lập tham số cho MSComm  CString getCurStrInCombobox(const CComboBox &a)   : hàm này dùng để lấy xâu đang được lựa chọn trong các ComboBox  Để làm được điều đó thì các bạn làm như sau: Chọn tab Class.. Kích chuột phải  vào lớp CRS232TUTDlg chọn Add Member Function:    Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  57/78  Hình 2.82: Chọn tab Class trong cửa sổ Workspace  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  58/78  Hình 2.83: Kích chuột phải chọn Add Member Function  Hình 2.84: Thêm hàm getCurStrInCombobox , chọn OK  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  59/78  Hình 2.85: Làm tương tự, thêm hàm InitComboBox  Hình 2.86: Thêm hàm Settings()  2.3.2. Viết mã cho từng hàm  Chúng ta sẽ viết mã lệnh cho một số hàm  2.3.2.1. Hàm getCurStrInCombobox: hàm có tác dụng lấy giá trị được chọn  của các ComboBox  Các bạn kích vào cửa sổ bên trái chọn tab Class, kích đúp chuột vào tên hàm, bên  phải sẽ hiện ra nơi định nghĩa hàm, các bạn thêm mã vào.  Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  60/78  Hình 2.87: Kích đúp vào tên hàm getCurStrInCombobox  bên trái để định nghĩa hàm  Thêm mã chương trình:  CString CRS232TUTDlg::getCurStrInCombobox(const CComboBox &a)  {      CString str;      a.GetLBText(a.GetCurSel(),str);      return str;  }  2.3.2.2. Hàm InitComboBox: dùng khởi tạo các giá trị cho ComboBox  Kích đúp chuột vào hàm InitComboBox( hàm này dùng khởi tạo các giá trị cho  ComboBox) trong của sổ bên trái tương tự như với hàm trên.   Người báo cáo:  Ngô Hải Bắc  Tài liệu:  TUT01.03  Ngày:  10/01/06  Trang:  61/78  Hình 2.88: Kích đúp vào tên hàm InitComboBox  Các bạn thêm đoạn mã này vào hàm:  void CRS232TUTDlg::InitComboBox()  {      // ComboBox ComPort      m_cboComPort.ResetContent();      m_cboComPort.AddString(ʺCOM1ʺ);      m_cboComPort.AddString(ʺCOM2ʺ);      m_cboComPort.SetCurSel(0);      // ComboBox BitRate      m_cboBitRate.ResetContent();      m_cboBitRate.InsertString(0,ʺ60

Các file đính kèm theo tài liệu này:

  • pdfLập Trình VB6 Giao Tiếp Với Cổng RS232.pdf