Giáo trình Đo lường và điều khiển bằng máy tính - Chương 8: Lập trình giao tiếp nối tiếp

Ngôn ngữ Visual Basic có module phần mềm MSCOMM.OCX
phục vụ cho truyền thông, với Visual Basic 4.0 là MSCOMM16.OCX
còn với Visual Basic 6.0 là MSCOMM32.OCX
Muốn cài trình đơn truyền thông vào thanh công cụ ta vào
Project- Components – Controls chọn Microsoft Comm Control
6.0/ OK (Hình 8.1), biểu tượng hình điện thoại sẽ hiện trên thanh
công cụ. Có thể nhắp chuột kép để đưa vào form của chương
trình. Các bước trên có thể làm tắt bằng phím Ctrl T. Thành
phần Comm khi mới đưa vào form thường được gán tên MSComm1
cho cổng Com1 và ta có thể sửa tên hay thay đổi cổng com tùy ý. 
pdf 25 trang xuanthi 24/12/2022 3660
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Đo lường và điều khiển bằng máy tính - Chương 8: Lập trình giao tiếp nối tiếp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfgiao_trinh_do_luong_va_dieu_khien_bang_may_tinh_chuong_8_lap.pdf

Nội dung text: Giáo trình Đo lường và điều khiển bằng máy tính - Chương 8: Lập trình giao tiếp nối tiếp

  1. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 211 Các tính chất chính của trình đơn là Commport, DTREnable, EOFEnable, Handshaking, InBuffersize, InputLen, InputMode, NullDiscard, OutBuffersize, ParityReplace, Rthreshold, RTSEnable, Settmgs, Sthreshold được đặt khi viết chương trình, có thể thay đổi khi chạy chương trình bằng các lệnh điều khiển. Tính chất CommPort Đặt cổng com được sử dụng Object.CommPort [= Value] Value = 1 đến 16, mặc định là 1 khi khởi động Visual Basic. Tính chất này phải đặt trước khi mở cổng, nếu biểu thức trong ngoặc không có thì trả về số cổng com đang hoạt động. Thành phố Hồ Chí Minh, tháng 4 năm 2006
  2. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 213 Mở cổng Object.PortOpen [= True/ False] Value = True : mở cổng Value = False : đóng cổng và xóa bộ đệm truyền thu, Cổng tự động đóng khi kết thúc chương trình áp dụng. Nhập dữ liệu String$= Object.Input Dữ liệu chuỗi ở bộ đệm thu được đọc vào biến String$ . Liên quan đến đọc dữ liệu có các lệnh sau: Object.InputLen [= numByte%] InputLen: qui định số ký tự đọc bởi Input. Chọn InputLen = 0 sẽ cho đọc toàn bộ vùng bộ đệm. Object.InbufferSize = [numbyte%] InBufferSize đặt và trả về kích thước theo byte của đệm thu, mặc định là 1024. Object.InbufferCount [= Count%] InbufferCount: cho biết số ký hiệu có trong bộ đệm nhận. Xóa bộ đệm bằng cách cho InbufferCount = 0 Object.InputMode [= value] InputMode: cho biết loại dữ liệu là văn bản hay nhị phân Value = 0 : ComInputModeText Value = 1 : ComInputModeBinary Ví dụ: Dim Buffer as Variant Dim Arr() as Byte MSComm1.CommPort = 1 MSComm1.PortOpen = True ‘Set InputMode to read binary data MSComm1.InputMode = comInputModeBinary Do Until MSComm1.InBufferCount > 10 DoEvents Loop Buffer = MSComm1.Input ' Assign to byte array for processing Thành phố Hồ Chí Minh, tháng 4 năm 2006
  3. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 215 object. CTS Holding True: mức 1, False: mức 0 Đặt thời gian chờ CTS Khi DTE gởi RTS thì modem phải gởi trả lại CTS, tính chất object. CTSTimeout định thời gian chờ, nếu quá thời gian đó mà không có CTS thì tạo sự kiện CTSTO. Đọc DSR object. DSRHolding Đặt thời gian chờ DSR object. DSRTimeout Điều khiển DTR object. DTREnable [=True/False] nếu True thì DTR mức 1 khi mở cổng và mức 0 khi đóng cổng, nếu False thì DTR ở mức 0 Điều khiển RTS object. RTSEnable [ =True/False] Khi True RTS sẽ ở mức 1 khi mở cổng và mức 0 khi đóng cổng Sthreshold: đặt số byte có trong bộ đệm truyền để báo sự kiện. Nếu Sthreshold = 1 thì sẽ gọi onComm khi bộ đệm truyền rỗng. Nếu Sthreshold = 0 thì không gọi. Đặt số byte của bộ đệm thu tối thiểu để báo sự kiện object. Rthreshold [= value] Nếu đặt bằng 1 thì sẽ gọi onComm khi nhận được 1 ký tự. Nếu đặt bằng 0 thì không gọi. Giao thức bắt tay object.Handshaking [= value] Value = 0 không bắt tay Value = 1 bắt tay theo RTS/CTS = 2 XON/XOFF = 3 RTS/XON/XOFF Ví dụ: Private Sub Form_Load ( ) Dim Buffer$ as string Thành phố Hồ Chí Minh, tháng 4 năm 2006
  4. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 217 Case ComEvEOF ‘Nhận ký tự EOF kết thúc file (mã ASCII 26) trong chuỗi nhập End Select End Sub. Các lỗi khi sử dụng MSComm trình bày trong bảng sau Lỗi Gía trị Miêu tả comInvalidPropertyValue 380 Sai thuộc tính comSetNotSupported 383 Thuộc tính chỉ đọc comGetNotSupported 394 Thuộc tính chỉ đọc comPortOpen 8000 Không thực hiện khi cổng đã mở 8001 Gía trị Timeout phải lớn hơn 0 comPortInvalid 8002 Số cổng không giá trị 8003 Thuộc tính chỉ có khi chương trình chạy 8004 Thuộc tính chỉ đọc khi chương trình chạy comPortAlreadyOpen 8005 Cổng đã mở rồi 8006 Số nhận dạng thiết bị không phù hợp 8007 Vận tốc truyền không phù hợp 8008 Số byte đã đặt không giá tri 8009 Thông số mặc định sai 8010 Thiết bị không có sẵn 8011 The function cannot allocate the queues comNoOpen 8012 Thiết bị không mở 8013 Thiết bị đã mở 8014 Could not enable comm notification comSetCommStateFailed 8015 Không thể đặt trạng thái truyền thông 8016 Không thể đạt mặt nạ che comPortNotOpen 8018 Hoạt động chỉ thực hiện khi cổng mở 8019 Thiết bị bận comReadError 8020 Error reading comm device comDCBError 8021 Internal error retrieving device control block for the port Ví dụ: chương trình quay số điện thoại qua modem Option Explicit ' Variable names beginning with A through Z default to Integer. DefInt A-Z Thành phố Hồ Chí Minh, tháng 4 năm 2006
  5. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 219 MSComm1.Output = "ATH" + vbCr End Sub Private Sub DialButton_Click() Dim Number$, Temp$ DialButton.Enabled = False QuitButton.Enabled = False CancelButton.Enabled = True ' Get the number to dial. Number$ = InputBox$("Enter phone number:", , Default$) If Number$ = "" Then DialButton.Enabled = True QuitButton.Enabled = True CancelButton.Enabled = False Exit Sub End If Temp$ = Status Default$ = Number$ Status = "Dialing - " + Number$ ' Dial the selected phone number. Dial Number$ DialButton.Enabled = True QuitButton.Enabled = True CancelButton.Enabled = False Status = Temp$ End Sub Private Sub Form_Load() Default$ = "8654357" MSComm1.CommPort = 1 MSComm1.Settings = "9600,N,8,1" On Error Resume Next MSComm1.PortOpen = True If Err Then MsgBox "COM1: not available. Change the CommPort property to another port." Exit Sub End If MSComm1.InBufferCount = 0 MSComm1.InputLen = 0 End Sub Private Sub QuitButton_Click() Thành phố Hồ Chí Minh, tháng 4 năm 2006
  6. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 221 LED3: CJNE A,#33H,NEXT CPL P0.2 ACALL SUB_TXD SJMP INDEX LED4: CJNE A,#34H,NEXT CPL P0.3 ACALL SUB_TXD SJMP INDEX LED5: CJNE A,#35H,NEXT CPL P0.4 ACALL SUB_TXD SJMP INDEX LED6: CJNE A,#36H,NEXT CPL P0.5 ACALL SUB_TXD SJMP INDEX LED7: CJNE A,#37H,NEXT CPL P0.6 ACALL SUB_TXD SJMP INDEX NEXT: RET TXD : MOV SBUF,#43 JNB TI,$ CLR TI RET END Chương trình máy tính Thành phố Hồ Chí Minh, tháng 4 năm 2006
  7. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 223 Private Sub Command2_Click() MSComm1.Output = "2" valLED2 = Not valLED2 End Sub Private Sub Command3_Click() MSComm1.Output = "3" valLED3 = Not valLED3 End Sub Private Sub Command4_Click() MSComm1.Output = "4" valLED4 = Not valLED4 End Sub Private Sub Command5_Click() MSComm1.Output = "5" valLED5 = Not valLED5 End Sub Private Sub Command6_Click() MSComm1.Output = "6" valLED6 = Not valLED6 End Sub Private Sub Command7_Click() MSComm1.Output = "7" valLED7 = Not valLED7 End Sub Private Sub Command9_Click() MSComm1.Output = "0" valLED = Not valLED End Sub Private Sub MSComm1_OnComm() Select Case MSComm1.CommEvent Case comEvReceive Dim Buffer As Variant Buffer = MSComm1.Input Label2.Caption = "Return = " & Buffer If Buffer = "C" Then If valLED = True Then For x = 0 To 7 Step 1 Shape1(x).FillColor = &HFFFFFF Next Shape1(0).FillColor = &HFF& valLED1 = False valLED2 = False valLED3 = False valLED4 = False valLED5 = False valLED6 = False valLED7 = False Thành phố Hồ Chí Minh, tháng 4 năm 2006
  8. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 225 8.3 LẬP TRÌNH DÙNG DELPHI 5.0 VÀ VISUAL C++6.0 MSComm có thể cài trong Delphi theo các bước sau: Vào menu Component – Import ActiveX Control Microft Comm Control 6.0 – Install để cài MSComm vào ActiveX. Sau đó vào toolbar ActiveX. tìm icon điện thoại để kéo vào Form. Các lệnh MSComm trong Delphi tương tự trong Visual Basic Đối với Visual C thì lập trình MSComm phức tạp hơn, sau đây là ví dụ cài đặt MSComm trong Visual C Thành phố Hồ Chí Minh, tháng 4 năm 2006
  9. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 227 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); VARIANT GetInput(); void SetCommEvent(short nNewValue); short GetCommEvent(); void SetEOFEnable(BOOL bNewValue); BOOL GetEOFEnable(); void SetInputMode(long nNewValue); long GetInputMode(); Thành phố Hồ Chí Minh, tháng 4 năm 2006
  10. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 229 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() { if(m_ctlMSCOMM1.GetCommEvent()==2) { m_receive +=Get_str(); UpdateData(FALSE); } . } CString CSerialDlg::Get_str() { CHAR str[256]; VARIANT datain; Thành phố Hồ Chí Minh, tháng 4 năm 2006
  11. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 231 stri: string; Procedure Close_Com; Procedure Open_Com (nCom: byte); Procedure Set_Com (baud:Dword; Prt:byte; Stpbits:byte; dtbits: byte); Procedure Gan_chuoi (Str: string); Procedure Dial (phone: string); Procedure Hang_up; Procedure Flush_Com; Function Send_Com (send_str: string; dWByte: Dword): Boolean; Function Get_Com_Buffer: longint; Function Receive_Com (dwByte: Dword): Boolean; Procedure doi_chuoi (ch: byte); Implementation { $R *.DFM} Procedure Close_Com; begin if hPort –1 then Close Com; hPort := CreateFile (Pchar (sCom), GENERIC_READ OR GENERIC_WRITE, 0, NIL, OPEN_EXISTING; FILE_ATTRIBUTE_NORMAL, longint (0)); end; Procedure Set_Com(baud: Dword, Prt: byte; Stpbits:byte;dtbits: byte); var dcbPort:TDCB; // khai bao kieu DCB begin if hPort <> –1 then begin if GetCommState (hPort, dcbPort) then begin dcbPort. BaudRate:= baud; dcbPort. Bytesize: = dtBits; dcbPort. Parity : = prt; dcbPort.StopBits : = DtpBits; dcbPort. Elags : = dcbport.flags or (RTS_CONTROL_ENABLE) OR (DTR_CONTROL_ENABLE): Thành phố Hồ Chí Minh, tháng 4 năm 2006
  12. Chương 8: LẬP TRÌNH GIAO TIẾP NỐI TIẾP Trang 233 s := ‘ATDT’ + Phone+#13; Flush_Com; Send_Com (s, length (s)); end; Function Get_Com_Buffer : longint; var statPort : TCOMSTAT; dwErrorCode : dWord; begin Result := 0; if hPort dwByte then begin result := false; exit; end else result := true; end; end; Procedure Hang_Up: var s : string; begin s := ‘ATH0’ +#13; Open_Com (cong); Set_Com (tdo, parity, stopbit, databit); Flush_Com; Send_Com (s, length (s)); Close_Com; end; Procedure doi_chuoi (ch : byte); var f : byte; Thành phố Hồ Chí Minh, tháng 4 năm 2006