RS232 là một chuẩn giao tiếp nối tiếp dùng định dạng không đồng bộ, kết nối nhiều nhất là với 2 thiết bị, chiều dài kết nối lớn nhất cho phép để đảm bảo dữ liệu là 50 – 100 feet ( 12.7 đến 25.4 m), tốc độ 20kBíts đôi khi là tốc độ 115 k Bíts với một số thiết bị đặc biệt. Để biết được các tham số của chuẩn giao tiếp RS232 trong hệ điều hành của bạn như thế nảo thì bạn kích phải chuột vào biểu tượng My Computer , chọn Properties, chọn Tab HardWare chọn Device Manager sẽ có một tree hiện ra. Bạn chọn Port( Com LPT), kích chuột phải vào Communication Port( COM1). Chuyển sang tab Port Setting sẽ thấy được các tham số mà chúng ta cần thiết lập bao gồm tần số bus, Data Bits, Parity Bits, Stop Bits, Handshaking,..
Tóm tắt: Vấn giao tiếp PC vi điều khiển quan trong ứng dụng điều khiển, đo lường, thực tế Do xin giới thiệu cho bạn viết chương trình PC dùng MSComm Tôi xin đưa số vấn đề sau: ‐ Giới thiệu chuẩn giao tiếp RS232 điều khiển Active X Microsoft Communication 6.0( MSComm): cách tính chất cách thiết lập tham số tối ưu cho điều khiển ‐ Lập trình ứng dụng giao tiếp sở sử dụng phần mềm Visual C++ công cụ Visual ‐ Studio 6.0 Microsft: + Thiết kế giao diện chương trình + Viết mã cho chương trình Điều khiển MSComm 1.1 Chuẩn giao tiếp RS232 RS232 chuẩn giao tiếp nối tiếp dùng định dạng không đồng bộ, kết nối nhiều với thiết bị, chiều dài kết nối lớn cho phép để đảm bảo liệu 50 – 100 feet ( 12.7 đến 25.4 m), tốc độ 20kBít/s tốc độ 115 k Bít/s với số thiết bị đặc biệt Để biết tham số chuẩn giao tiếp RS232 hệ điều hành bạn nảo bạn kích phải chuột vào biểu tượng My Computer , chọn Properties, chọn Tab HardWare chọn Device Manager có tree Bạn chọn Port( Com & LPT), kích chuột phải vào Communication Port( COM1) Chuyển sang tab Port Setting thấy tham số mà cần thiết lập bao gồm tần số bus, Data Bits, Parity Bits, Stop Bits, Handshaking, Hình 1.1: Chọn My Computer ‐> Properties Hình 1.2: Chọn Device Manager Hình 1.3: Chọn Properties Communication Port( COM1) Hình 1.4: Chọn thẻ Port Setting để biết tham số Đó lí lại chọn tham số đưa vào ComboBox chương trình 1.2 Các thuộc tính MSComm MSComm điều khiển ActiveX dùng truyền thông nối tiếp Các tính chất điều khiển dùng để thiết lập giao tiếp với thiết bị ngoại vi qua cổng RS232 Do xin giới thiệu với bạn điều khiển Visual Basic cách gọi thuộc tính đơn giản VB Từ lấy làm sở để lập trình Visual C++ 1.2.1 Điều khiển MSComm Visual Basic Tất tính chất bạn tìm thư viện MSDN July 2001 theo đường dẫn sau tab contents: MSDN Library ‐ July 2001 / Visual Tools and Languages/ Visual Studio 6.0 Documentation / Visual Basic Documentation / Reference/ Control Reference / ActiveX Control/ MSComm Control Các tính chất MSComm xếp theo chức năng: Thiết lập tham số cho cổng: + CommID: trả lại handles đồng tới thiết bị truyền thông, có kiểu Long Tính chất lúc thiết kế mà có thi hành, thuộc tính ReadOnly + CommPort: dạng object.CommPort = value Value số cổng Com có giá trị từ ‐> 16 mặc định có giá trị =1 Các bạn cần phải thiết lập thông số trước mở cổng Sẽ có lỗi error 68 (Device unavailable) không mở cổng + InBuferSize: thiết lập trả lại kích thước đệm nhận, tính = byte Mặc định 1024 byte Các bạn không nhầm lẫn với đặc tính InBufferCount số byte chờ đệm nhận + InputLen : object.InputLen [ = value ] thiết lập trả lại số byte lần thuộc tính Input đọc đệm nhận Mặc định giá trị Value=0 tức thuộc tính Input đọc hết nội dung đệm nhận thuộc tính gọi Nếu số kí tự đệm nhận không = InputLen thuộc tính Input trả lại kí tự rỗng “” Ví bạn cần phải chọn cách kiểm tra InBufferCount để chắn số kí tự yêu cầu có đủ trước dùng lệnh Input Tính chất có ích đọc liệu máy mà liệu định dạng khối có kích thước cố định + InputMode: object.InputMode [ = value ] Value = hay = comInputModeText liệu nhận dạng văn kiểu kí tự theo chuẩn ANSI Dữ liệu nhận sâu Value=1 hay = comInputModeBinary dùng nhận kiểu liệu kí tự điều khiển nhúng, kí tự NULL, Giá trị nhận từ Input mảng kiểu Byte + NullDiscard: object.NullDiscard [ = value ] tính chất định kí tự trống có truyền từ cổng đến đệm nhận hay không Nếu value= True kí tự không truyền value = false kí tự trống truyền Kí tự trống định nghía theo chuẩn ASCII kí tự – chr$(0) + OutBuferSize: giống InBuferSize, mặc định 512 + ParityReplace: thiết lập trả lại kí tự thay kí tự không lỗi giống + PortOpen: thiết lập trả lại tính trạng cổng(đóng mở) object.PortOpen [ = value ] value = true cổng mở value =false cổng đóng xóa toàn liệu đệm nhận truyền Cần phải thiết lập thuộc tính CommPort với tên cổng trước mở cổng giao tiếp Thêm vào đó, cổng giao tiếp thiết bị bạn phải hỗ trợ giá trị thuộc tính Setting thiết bị bạn hoạt động đúng, không hoạt động dở không nói chạy không tốt Đường DTR RTS giữ lại trạng thái cổng + RthresHold: object.Rthreshold [ = value ] value kiểu số nguyên Thiết lập số kí tự nhận trước gây lên kiện comEvReceive Mặc định = tức kiện OnComm nhận liệu Thiết lập = tức kiện OnComm xảy kí tự chuyển đến đệm nhận + Settings: object.Settings [ = value ] thiết lập trả lại thông số tần số baud, bít liệu, bít chẵn lẻ, bít stop Nếu Value giá trị mở gây lỗi 380 (Invalid property value) + SThreshold: thiết lập và trả lại số kí tự nhỏ cho phép đệm gửi để xảy kiện OnComm = comEvSend Theo mặc định giá trị = tức truyền không gây kiện OnComm Nếu thiết lập thông số =1 kiện OnComm xảy đệm truyền rỗng Sự kiện OnComm = comEvSend xảy mà số kí tự đệm truyền nhỏ = Sthreshold Nếu số kí tự đệm lớn Sthreshold kiện xảy Truyền nhận liệu: + CommEvent: trả lại phần lớn kiện giao tiếp có lỗi CommEvent xảy có lỗi xảy kiện Sau số số lỗi: Sự kiện Giá trị Miêu tả kiện comEventBreak 1001 Xảy nhận tín hiệu Break comEventFrame 1004 Lỗi hệ thống Phần cứng phát lỗi hệ thống comEventOverru n 1006 comEventRxOver 1008 comEventRxParity 1009 Xảy cổng tự tràn( Overrun) Một kí tự không đọc từ phần cứng trước kí tự tới kí tự bị Xảy đệm nhận bị tràn Không có đủ chỗ cho liệu đệm nhận Lỗi Parity Phần cứng phát lỗi Parity comEventTxFull 1010 comEventDCB 1011 Một lỗi không mong muốn khôi phục lại khỗi điều khiển thiết bị( DCB – Device Control Block) cho cổng Giá trị Miêu tả kiện comEvSend Xảy số kí tự đệm truyền nhỏ giá trị SthresHold comEvReceive RcomEvCTS comEvDSR comEvCD comEvRing comEvEOF xảy đệm truyền bị đầy Bộ đệm truyền bị đầy ghi liệu lớn vào đệm Một số kiện : Sự kiện Xảy đệm nhận số kí tự giá trị RthresHold Sự kiện tạo liên tục bạn dùng thuộc tính Input để lấy hết liệu từ đệm nhận Xảy có thay đổi đường CTS( Clear To Send) Xảy thay đổi đường DSR( Data Set Ready) Sự kiện xảy đường DSR thay đổi từ ‐> Xảy có thay đổi đường CD( Carrier Detect) Phát chuông (Ring).Một số UART không hỗ trợ kiện Xảy nhận kí tự kết thúc file ( kí tự 26 bảng mã ASCII) + EOFEnable : object.EOFEnable [ = value ] định hành động MSComm tìm thấy kí tự kết thúc file Nếu value=true tìm thấy kí tự kết thúc file gây lên kiện comEvEOF OnCommEvent Nếu value= false không gây lên kiện + InBufferCout: trả lại số kí tự có đệm nhận Bạn xoá đệm nhận cách đặt thuộc tính =0 Không nhầm với thuộc tính InBufferSize tổng kích thước đệm nhận + Input: nhận xoá liệu đệm nhận Nếu InputMode comInputModeText giá trị trả xâu tức có kiểu String , liệu dạng text biến kiểu Variant Nếu InputMode = comInputModeBinary thuộc tính trả lại liệu dạng nhị phân dạng mảng kiểu byte biến Variant + OutBufferCount: trả lại số kí tự đệm truyền + Output: ghi liệu vào đệm truyền truyền kiểu text kiểu nhị phân Nếu truyền kiểu text cho biến Variant = kiểu String, truyền kiểu nhị phân cho cho Output= variant = mảng kiểu Byte Bắt tay( handshaking): + Break : thiết lập xoá tín hiệu object.Break [ = value] value = true false Khi set value= true thông số Break gửi tín hiệu break Tín hiệu break trì hoàn việc truyền liệu đưa đường truyền vào trạng thái break tới mà value = false + CDHolding: quết định xem truyền đến đâu cách truy vấn đường CD( Carrier Detect) Carrier Detect tín hiệu gửi từ modem tới máy tính kết nối với thống báo online Nếu giá trị = true đường CD mức cao, = false đường dây mức thấp Tính chất lúc thiết kế có chạy chương trình.Carrier Detect biết Receive Line Signal Detect (RLSD) + CTSHolding: quết định bạn gửi liệu cách truy vấn trạng thái đường Clear To Send (CTS) Thông thường tín hiệu CTS gửi từ modem tới máy tính kết nối với để báo trình truyền liệu Thuộc tính Readonly xuất chạy chương trình Đường Clear To Send dùng RTS/CTS (Request To Send/Clear To Send) bắt tay phần cứng CTSHolding cho bạn cách để tự tay dò đường Clear To Send bạn cần biết trạng thái + DSRHolding: biết trạng thái đườ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 để thông báo modem sẵn sàng hoạt động Tính chất dùng viết Data Set Ready/Data Terminal Ready handshaking routine cho máy Data Terminal Equipment (DTE)‐ máy trang bị đầu cuối liệu + DTREnable: tính chất định cho phép đường Data Terminal Ready (DTR) truyền thông Tín hiệu DTR gửi từ máy tính tới modem đẻ báo máy tính sẵn sàng nơi nhận liệu Khi DTREnable = true đường Data Terminal Ready set lên cao cổng mở, thấp cổng đóng Nếu DTREnable = false đường 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 + Handshaking: thiết lập trả lại giao thức bắt tay phần cứng object.Handshaking [ = value ] Các giá trị value: comNone Bắt tay XON/XOFF (Mặc định) Không bắt tay comXOnXOff comRTS comRTSXOnXOff Bắt tay RTS/CTS (Request To Send/Clear To Send) Dùng bắt tay Request To Send and XON/XOFF Handshaking giao thức truyền thông nội định liệu truyền từ cổng phần cứng tới đệm nhận Khi kí tự liệu tới cổng nối tiếp, thiết bị truyền thông chuyển vào đệm nhận chương trình bạn đọc chúng Nếu đệm liệu chương trình bạn cần đọc kí tự trực tiếp từ phần cứng , bạn liệu kí tự từ phần cứng đến nhanh Giao thức Handshaking đảm bảo liệu không bị mất, liệu đến cổng nhanh thiết bị truyền thông chuyển liệu vào đệm nhận + RTSEnable: quết định 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 tryền liệu Khi RTSEnable = true đường RTS mức cao cổng mở, tích mức thấp cổng đóng Và hiển nhiên RTSEnable đường RTS mức thấp.RTS dùng RTS/CTS hardware handshaking RTSEnable cho phép bạn dò đường RTS cần biết tình trạng đường Các tính chất lúc thiết kế giao diện mà có lúc chạy chương trình ( dùng viết code) 1.1.2 Điều khiển MSComm Visual C++ Trên tham số điều khiển MSComm VB Trong Visual C++ , điều khiển định nghĩa lớp riêng Và MSComm ngoại lệ Với tham số bạn hoàn toàn áp dụng tốt cho lập trình với VC++ lẽ tham số bạn lấy giá trị thiết lập tham số cho chúng tương ứng hàm thành viên cửa lớp Get_thuộctính Set_thuộctính Ví dụ, bạn muốn thiết lập dùng cổng COM1 chẳng hạn dùng thuộc tính CommPort thêm tiền tố Set_ muốn thiết lập Get_ muốn lấy giá trị Sau lớp MSComm lớp kế thừa từ lớp cở sở CWnd, bạn tham khảo Các bạn ý kiều liệu cửa tham số giá trị trả hàm Việc chuyển đổi kiểu liệu bạn tham khảo thư viện MSDN Microsoft July 2001 cách Search Key Word: từ khoá chỉnh kiểu liệu đó.( 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(); 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); Bạn kích đúp vào hàm Settings ( hàm dùng thiết lập tham số cho MSComm) Hình 2.90: Kích đúp chuột vào tên hàm Settings bên trái Thêm đoạn mã vào hàm void CRS232TUTDlg::Settings() { // cổng mở đóng cổng để thiết lập tham số if( m_mscomm.GetPortOpen()) m_mscomm.SetPortOpen(false); // Thiết lập tên cổng m_mscomm.SetCommPort(m_cboComPort.GetCurSel()+ 1); // Thiết lập bắt tay m_mscomm.SetHandshaking(m_cboHandshaking.GetCurSel()); // Thiết lập tần số, bit liệu, bít stop CString strBitRate = getCurStrInCombobox(m_cboBitRate); CString strParity = getCurStrInCombobox(m_cboParityBit); CString strDataBit = getCurStrInCombobox(m_cboDataBit); CString strStopBit = getCurStrInCombobox(m_cboStopBit); CString strSetting; strSetting.Format(ʺ%s,%c,%s, %sʺ,strBitRate,strParity[1],strDataBit,strStopBit); m_mscomm.SetSettings(strSetting); // Thiết lập khác m_mscomm.SetRThreshold(1); m_mscomm.SetInputLen(1); // lần đọc kí tự m_mscomm.SetInBufferSize(1024); m_mscomm.SetInputMode(0); // – Text Mode , 1‐ Binary Mode m_mscomm.SetOutBufferSize(1024); m_mscomm.SetPortOpen(true); // mở cổng } 2.3.2.4 Hàm khởi tạo cho hộp thoại Hàm OnInitDialog() hàm nằm lớp CRS232TUTDialog, ứng dụng load thiết lập bạn hàm chạy Đầu tiên bạn phải thêm hàm vào cách mở MFC ClassWizard(ấn tổ hợp phím Ctr + W), chọn tab Message Maps: Hình 2.91: Thêm hàm InitDialog Tiếp theo, bạn kích vào Edit Code , khung bên phải VC++ hàm OnInitDialog()để bạn thêm code vào: Hình 2.92: Chọn EditCode để viết thêm vào hàm Thêm đoạn mã vào: BOOL CRS232TUTDlg::OnInitDialog(){ …………………………… // TODO: Add extra initialization here InitComboBox(); return TRUE; // return TRUE unless you set the focus to a control } 2.3.2.5 Các hàm cho nút Button đáp ứng kiện Click: Các bước làm hoàn toàn tương tự trên: thêm hàm, viết mã lệnh cho hàm Hàm OnButtonExit() Hình 2.93: Thêm hàm cho nút Exit Hình 2.94: Đồng ý với tên hàm OnButtonExit Hình 2.95: Nhấn EditCode để viết mã cho hàm Hình 2.96: Cửa sổ code để thêm code void CRS232TUTDlg::OnButtonExit() { // TODO: Add your control notification handler code here // Nếu cổng mở đóng lại if ( m_mscomm.GetPortOpen() ) m_mscomm.SetPortOpen(false); OnOK(); } Hàm OnButtonSend: Hình 2.97: Thêm hàm cho nút Send Hình 2.98: Đồng ý với tên hàm OnButtonSend Hình 2.99: Nhấn EditCode để viết hàm Hình 2.100: Cửa sổ thêm code void CRS232TUTDlg::OnButtonSend() { // TODO: Add your control notification handler code here UpdateData(); Settings(); // send data m_mscomm.SetOutput((COleVariant)m_strTransfer); UpdateData(false); } Hàm OnButtonClear: Hình 2.101: Thêm hàm cho nút Clear Hình 2.102: Đồng ý với tên hàm OnButtonClear Hình 2.103: Cửa sổ thêm code void CRS232TUTDlg::OnButtonClear() { // TODO: Add your control notification handler code here UpdateData(); m_strReceive = ʺʺ; UpdateData(false); } Hàm OnOnCommMscomm1: dùng ngắt ngắt nhận, bạn dùng ngắt khác tuỳ ý Do thiết lập InputLen = 1, nên lần nhận kí tự, bạn dùng điều để kiểm tra thông tin nhận từ vi điều khiển, ví dụ kí tự báo hiệu chẳng hạn Hình 2.104: Thêm hàm cho MSComm1 Hình 2.105: Đồng ý với tên hàm OnOnCommMscomm1 Hình 2.106: Cửa số thêm mã void CRS232TUTDlg::OnOnCommMscomm1() { // TODO: Add your control notification handler code here UpdateData(); switch( m_mscomm.GetCommEvent()){ case 1: // comEvSend break; case 2:// comEvReceive VARIANT data = m_mscomm.GetInput(); m_strReceive += (CString)data.bstrVal; break; case 3:// comEvCTS break; case 4://comEvDSR break; case 5: //comEvCD break; case 6://comEvRing break; case 7: //comEvEOF break; }; UpdateData(false); } Thế xong Bây bạn dịch( có lỗi sửa lại cho đúng) chạy chương trình để xem kết Hình 2.107: Dịch chương trình Hình 2.108: Kiểm tra sửa lỗi chương trình đến lỗi Hình 2.109: Chạy chương trình Hình 2.110: Ứng dụng chạy Bạn đánh vài kí tự vào ô Transfer thiết lập tham số truyền thử để kiểm tra chương trình ... tính MSComm MSComm điều khiển ActiveX dùng truyền thông nối tiếp Các tính chất điều khiển dùng để thiết lập giao tiếp với thiết bị ngoại vi qua cổng RS232 Do xin giới thiệu với bạn điều khiển Visual... trạng cổng( đóng mở) object.PortOpen [ = value ] value = true cổng mở value =false cổng đóng xóa toàn liệu đệm nhận truyền Cần phải thiết lập thuộc tính CommPort với tên cổng trước mở cổng giao tiếp. .. To Send and XON/XOFF Handshaking giao thức truyền thông nội định liệu truyền từ cổng phần cứng tới đệm nhận Khi kí tự liệu tới cổng nối tiếp, thiết bị truyền thông chuyển vào đệm nhận chương