Lập trình truyền thông qua cỗng COM trên VisualC++

Một phần của tài liệu tài liệu ghép nối cực hay (Trang 49 - 53)

VisualC++

Ngôn ngữ Visual C++ có module phần mềm MSComm phục vụ cho truyền thông giữa PC với thiết bị ngoại vi thông qua cỗng COM.

Đối với Visual C++ thì lập trình MSComm phức tạp hơn Visual Basic, sau đây là ví dụ cài đặt MSComm trong Visual C++.

1. Cài đặt MSCOMM trong Visual C++

Nếu muốn thêm component truyền thông nối tiếp vào project ta vào menu Project -> Add to Project -> Components and Controls Gallery.

Chọn mục Registered ActiveX Controls -> Microsoft Communication Controls, version 6.0 -> Insert. Hình biểu tượng điện thoại xuất hiện trên thanh Control.

Cách khác:

Kích phải -> Insert ActiveX Control…-> chọn Microsoft Communication Controls, version 6.0 trong cửa sổ Insert ActiveX Control -> OK sẽ có biểu tượng xuất hiện trên giao diện thiết kế Dialog.

2. Lập trình MSCOMM trong Visual C++

Lập trình MSCOMM trong Visual C++ phức tạp hơn lập trình trong Visual Basic và Delphi, các hàm của lớp CMScomm được định nghĩa trong mscomm.h. Sau đây là một đoạn trong file này cần tham khảo để gọi hàm cho đúng.

void SetCDHolding(BOOL bNewValue); BOOL GetCDHolding();

void SetCommID(long nNewValue); long GetCommID();

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(); (adsbygoogle = window.adsbygoogle || []).push({});

void SetInput(const VARIANT& newValue); VARIANT GetInput();

void SetCommEvent(short nNewValue); short GetCommEvent();

void SetEOFEnable(BOOL bNewValue); BOOL GetEOFEnable();

void SetInputMode(long nNewValue); long GetInputMode();

Ví dụ muốn truyền chuỗi what ta dùng đoạn lệnh sau: CString strOutput = "What";

UCHAR myData = 0x00; strOutput += myData;

m_Comm.SetPortOpen(true); // mở cổng m_Comm.SetOutput(COleVariant(strOutput));

Sau đây trình bày phần chính của chương trình serialDlg.cpp giao tiếp qua cổng COM:

// serialDlg.cpp : implementation file BOOL CSerialDlg::OnInitDialog() {

CDialog::OnInitDialog();

SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon

if(m_ctlMSCOMM1.GetPortOpen()) m_ctlMSCOMM1.SetPortOpen(FALSE); m_ctlMSCOMM1.SetCommPort(1); //đặt cấu hình port

m_ctlMSCOMM1.SetSettings("9600,n,8,1"); m_ctlMSCOMM1.SetInputMode(0); m_ctlMSCOMM1.SetRThreshold(1); m_ctlMSCOMM1.SetSThreshold(0); m_ctlMSCOMM1.SetInputLen(0); m_ctlMSCOMM1.SetPortOpen(TRUE); return TRUE; }

void CSerialDlg::OnExit() { m_ctlMSCOMM1.SetPortOpen(FALSE); OnOK(); } void CSerialDlg::OnSend() { UpdateData(TRUE); m_receive.Empty(); Send_str(m_send); UpdateData(FALSE); } void CSerialDlg::Send_str(CString str) {

LPCSTR pstr=str; //đặt con trỏ cho chuỗi

int i = str.GetLength();

BSTR bstr = SysAllocStringLen(0,i); //dành chỗ cho chuỗi Unicode bstr

MultiByteToWideChar(CP_ACP,0,pstr,i+1,bstr,i+1); //đổi sang mã Unicode

VARIANT dataout;

dataout.vt=VT_BSTR; dataout.bstrVal=bstr;

m_ctlMSCOMM1.SetOutput(dataout); //xuất chuỗi ra

} void CSerialDlg::OnMscomm1() void CSerialDlg::OnMscomm1() { if(m_ctlMSCOMM1.GetCommEvent()==2) { m_receive +=Get_str(); UpdateData(FALSE); } }

CString CSerialDlg::Get_str() { CHAR str[256]; VARIANT datain; datain.vt=VT_BSTR; datain=m_ctlMSCOMM1.GetInput(); WideCharToMultiByte(CP_ACP,0,datain.bstrVal,-1,str,256,NULL,NULL); return str; }

Một phần của tài liệu tài liệu ghép nối cực hay (Trang 49 - 53)