Khi checksum lỗi, không chính xác thì NAK sẽ phát yêu cầu truyền lại gói dữ liệu. Để giúp bên gửi dữ liệu, bên nhận gửi gói chuỗi dữ liệu tuần tự. Chuỗi dữ liệu có các giá trị sau:
- Số tuần tự nhận biết: Bên nhận đợi gói dữ liệu hoặc thông báo heartbeat. Trong trƣờng hợp này, Bên nhận không có thông báo tạm hoãn, tạm treo ( trên hình vẽ không có thông báo đƣợc đánh dấu), vì vậy không có trả lời ACK đã chờ đợi.
- Bên gửi dữ liệu: Đáp ứng gói NAK bằng việc yêu cầu phát lại dữ liệu. Khi không có gói dữ liệu bị treo heartbeat phải đƣợc truyền lại.
3.3.3.2 Giá trị thời gian của kết nối đường truyền
Thông số kết nối đƣờng truyền Giá trị Độ trễ tối đa giữa hai consecutive bytes of a message 50 ms Số lƣợng thông báo độc lập cho các thông báo, Thời gian đợi
truyền gói ACK.
1
Số lƣợng thực hiện lại trƣớc khi huỷ thông báo. Số này bao gồm số truyền lại sau khi nhận gói NAK.
2
Thời gian bắt đầu phát lại thông tin. Thời gian đƣợc tính sau byte cuối cùng đƣợc phát.
2 sec.
Thời gian truyền giữa 2 consecutive heartbeat 5 sec. Thời gian heartbeat time-out. Sau thời gian không nhận bất kỳ gói
dữ liệu nào
10 sec.
Độ dài gói dữ liệu tối đa 5000
bytes Thời gian thực hiện chức năng điều khiển từ xa < 0,5 sec.
CHƢƠNG 4
XÂY DỰNG PHẦN MỀM BIỂU QUYẾT
4.1 Chức năng đăng ký đại biểu
Để truy cập đƣợc hệ thống biểu quyết điện tử số DCN, đại biểu đƣợc gắn các quyền đăng nhập hệ thống nhƣ sau:
- Đăng ký tham dự.
- Kiểm tra quyền truy cập hệ thống. - Nhận biết đại biểu.
Các chức năng này dùng để phân quyền truy cập cho đại biểu: - Dự thính.
- Có quyền phát biểu với tƣ cách khách mời, không có quyền biểu quyết. - Đầy đủ các chức năng biểu quyết, phát biểu, truy cập hệ thống.
4.1.1 Đăng ký tham dự
Đăng ký tham dự là một ứng dụng cho phép điều khiển từ xa để giữ lại những dấu hiệu sự hiện diện của các đại biểu trong hệ thống nhƣ thời gian bắt đầu truy cập hệ thống (có mặt) và thời gian thoát khỏi hệ thống (vắng mặt).
- Để đăng nhập vào hệ thống biểu quyết điện tử, đại biểu phải tự đăng ký bằng cách sử dụng một trong những lựa chọn sau:
- Nhấn nút điểm danh ở vị trí của mình. - Nhập mã nhận dạng PIN ở vị trí của mình. - Cài ID-card vào thiết bị đọc thẻ.
- Để thoát khỏi hệ thống, đại biểu rút IC-card khỏi bộ đọc thẻ.
4.1.2 Điều khiển truy cập hệ thống
Để truy cập hệ thống biểu quyết điện tử số, Đại biểu phải thực hiện các bƣớc truy cập nhƣ sau:
- Vào mã PIN tại vị trí đại biểu.
- Cắm thẻ đại biểu ID – card vào hộp đại biểu.
4.1.3 Nhận biết đại biểu
Chức năng này cung cấp thông tin vị trí ngồi của đại biểu cho hệ thống biểu quyết nhận biết đại biểu thông qua kết qủa của việc nhập ID card vào hoặc rút chúng ra khỏi vị trí đại biểu.
Nhận biết đại biểu có 2 khả năng:
- Đại biểu ngồi đúng vị trí: Đại biểu phải ngồi đúng vị trí mới có quyền truy cập hệ thống: đăng ký phát biểu, phát biểu, biểu quyết.
- Đại biểu ngồi không đúng vị trí: đại biểu không ngồi đúng vị trí không có quyền truy cập hệ thống ngoại trừ hệ thống biểu quyết thiết lập chế độ ngồi tự do.
4.1.4 Kết hợp giữa đăng ký tham dự với truy cập hệ thống
Dựa vào có sự kết hợp này mà có thể kiểm soát đƣợc chặt chẽ hệ thống biểu quyết:
Khi “Mã hiện diện” đƣợc lựa chọn để đánh dấu sự có mặt, việc điều khiển đƣờng vào không thể hoạt động.
- Khi đại biểu ngồi sai vị trí việc đăng ký tham dự sử dụng Mã hiện diện là không thể.
4.1.5 Thông số chức năng
Thông số ameter
Ý nghĩa
SeatAttend Xác định vị trí nơi đăng ký: vị trí míc, vị trí chỗ ngồi.
SeatAccess Cho phép truy cập hay không đƣợc truy cập đến thiết bị.
ControlType Xác định đại biểu đăng nhập vào hệ thống bằng cách: Ấn phím điểm danh, vào mã PIN, cài thẻ đại biểu ID Card hoặc cài thẻ đại biểu ID và mã PIN.
4.2 Điều khiển microphone trong hệ thống biểu quyết điện tử số
4.2.1 Các bước đăng ký phát biểu
Khi đại biểu tham gia vào hội nghị, đại biểu có quyền đăng ký phát biểu, phát biểu thì đại biểu thực hiện các thao tác sau:
- Ấn phím đăng ký phát biểu “Mic” tại hộp đại biểu để vào danh sách đăng ký phát biểu.
- Hủy bỏ đăng ký phát biểu đại biểu ấn lại phím “Mic” tại hộp đại biểu. - Ngƣời quản trị hệ thống sẽ căn cứ vào chủ tọa điều hành mà điều khiển việc bật/ tắt microphone của đại biểu.
Lưu đồ điều khiển microphone như sau:
4.2.2 Chương trình kiểm soát danh sách đại biểu
Khi phát biểu thảo luận hội nghị, phần quan trọng để điều hành hội nghị phải kiểm soát đƣợc danh sách đại biểu đăng ký phát biểu và biết đại biểu nào đang phát biểu. Do đó, ta xây dựng phần mềm hiển thị danh sách đăng ký phát biểu và danh sách phát biểu nhƣ sau:
Thiết lập trạng thái Bắt đầu
Kiểm tra yêu cầu và trạng thái micro
Bật / tắt
Kiểm tra điều khiển bật/tắt
Kết thúc Dừng chƣơng trình
Không Có
Xây dựng giao diện chƣơng trình chính bằng ngôn ngữ Visual Basic 6.0 nhƣ trên hình 4.1.
Hình 4.1: Giao diện chính phần mềm biểu quyết.
+ Thiết kế form quản lý danh sách đăng ký và phát biểu nhƣ hình 4.2
4.3 Biểu quyết điện tử
4.3.1 Các kiểu loại biểu quyết điện tử số
-Biểu quyết điện tử số tuỳ vào thực tế sử dụng mà ngƣời ta chia làm nhiều kiểu loại khác nhau nhƣ sau:
-Biểu quyết nghị viện: Đại biểu tham dự biểu quyết với 3 trạng thái biểu quyết: tán thành, không tán thành, bỏ phiếu trống hoặc đại biểu không tham gia biểu quyết.
-Biểu quyết For/Againt: Đại biểu chỉ bỏ phiếu với 2 trạng thái: đồng ý hoặc phản đối.
-Biểu quyết đáp ứng một số vấn đề: có 5 loại câu hỏi để đại biểu trả lời: rất phản đối, phản đối, bỏ phiếu trống, đồng ý, rất đồng ý. Đại biểu lựa chọn các ý kiến. Hệ thống biểu quyết sẽ tính tỷ lệ để chỉ thị sự đồng ý với các trạng thái. Tại các kỳ họp Quốc hội nƣớc ta sử dụng kiểu biểu quyết nghị viện với 3 trạng thái biểu quyết: Tán thành, không tán thành, không biểu quyết.
4.3.2 Các bước thực hiện biểu quyết điện tử số
- Đặt các thông số biểu quyết: thời gian biểu quyết. - Chọn loại biểu quyết: nghị viện công khai.
- Khởi tạo biểu quyết.
- Hiển thị kết quả biểu quyết ra màn hình. - Kết thúc biểu quyết.
Quá trình biểu quyết điện tử số đƣợc thực hiện theo lƣu đồ sau:
Bắt đầu biểu quyết Kiểm tra biểu quyết Kiểm tra thời gian Thuật toán thống kê đƣa ra màn hình Kết thúc Hết thời gian Còn thời gian
4.3.3 Xây dựng chương trình hiển thị kết quả biểu quyết
+ Xây dựng form màn hình hiển thị biểu quyết như sau:
Hình 4.3: Giao diện hiển thị kết quả biểu quyết 4.4 Điều khiển MSComm trong Visual Basic
Visual Basic 6 là ngôn ngữ lập trình hƣớng đối tƣợng có nhiều tính năng trong đó có điều khiển ActiveX MSComm dùng truyền thông nối tiếp. Các tính chất của điều khiển này đƣợc dùng để thiết lập giao tiếp với các thiết bị ngoại vi qua cổng RS232.
Các tính chất của MSComm đƣợc sắp xếp theo chức năng:
Thiết lập tham số cho cổng:
+ CommID: trả lại handles đồng nhất tới thiết bị truyền thông, có kiểu
Long. Tính chất này không có lúc thiết kế mà chỉ có khi thi hành, thuộc tính này là ReadOnly.
+ CommPort: dạng object.CommPort = value. Value là chỉ số của cổng Com có giá trị từ 1 ‐> 16 và mặc định có giá trị =1. Thiết lập thông số này trƣớc khi mở cổng. Sẽ có lỗi error 68 (Device unavailable) nếu nhƣ không mở đƣợc cổng này.
+ InBuferSize: thiết lập hoặc trả lại kích thƣớc của bộ đệm nhận, tính = byte. Mặc định là 1024 byte.
+ InputLen: object.InputLen [= value] thiết lập hoặc trả lại số byte mỗi lần thuộc tính Input đọc trong bộ đệm nhận. Mặc định giá trị Value = 0 tức là thuộc tính Input sẽ đọc hết nội dung của bộ đệm nhận khi thuộc tính này đƣợc
gọi. Nếu số kí tự trong bộ đệm nhận không = InputLen thì thuộc tính Input sẽ trả lại kí tự rỗng. Vì thế, chọn cách kiểm tra InBufferCount để chắc chắn số kí tự yêu cầu đã có đủ trƣớc khi dùng lệnh Input. Tính chất này có ích khi đọc dữ liệu một máy mà dữ liệu ra đƣợc định dạng bằng các khối có kích thƣớc cố định.
+ InputMode: object.InputMode [ = value ].
Value = 0 hay = comInputModeText dữ liệu nhận đƣợc dạng văn bản kiểu kí tự theo chuẩn ANSI. Dữ liệu nhận đƣợc sẽ là một sâu.
Value =1 hay = comInputModeBinary dùng nhận mọi kiểu dữ liệu nhƣ kí tự điều khiển nhúng, kí tự NULL,.. Giá trị nhận đƣợc từ Input sẽ là một mảng kiểu Byte.
+ NullDiscard: object.NullDiscard [ = value ] tính chất này quyết định kí tự trống có đƣợc truyền từ cổng đến bộ đệm nhận hay không. Nếu value= True kí tự này không đƣợc truyền. value = false kí tự trống sẽ đƣợc truyền. Kí tự trống đƣợc định nghĩa theo chuẩn ASCII là kí tự 0 – chr$(0).
+ OutBuferSize: giống nhƣ InBuferSize, mặc định là 512.
+ ParityReplace: thiết lập và trả lại kí tự thay thế kí tự không đúng trong lỗi giống nhau.
+ PortOpen: thiết lập và trả lại tính trạng của cổng (đóng hoặc mở). object.PortOpen [ = value ]. value = true cổng mở. value =false cổng đóng và xóa toàn bộ dữ liệu trong bộ đệm nhận và truyền. Cần phải thiết lập thuộc tính CommPort đúng với tên của cổng trƣớc khi mở cổng giao tiếp. Thêm vào đó, cổng giao tiếp của thiết bị phải hỗ trợ giá trị trong thuộc tính Setting thì thiết bị mới hoạt động đúng, còn không thì chạy không tốt. Đƣờng DTR và RTS luôn giữ lại trạng thái của cổng.
+ RthresHold: object.Rthreshold [ = value ] value kiểu số nguyên. Thiết lập số kí tự nhận đƣợc trƣớc khi gây lên sự kiện comEvReceive. Mặc định = 0 tức là không có sự kiện OnComm khi nhận đƣợc dữ liệu.
Thiết lập = 1 tức là sự kiện OnComm xảy ra khi bất kì kí tự nào đƣợc chuyển đến bộ đệm nhận.
+ Settings: object.Settings [ = value ] thiết lập hoặc trả lại các thông số truyền: baudrate, bít dữ liệu, bít chẵn lẻ, bít stop. Nếu Value không có giá trị khi mở sẽ gây ra lỗi 380 (Invalidproperty value).
+ SThreshold: thiết lập và và trả lại số kí tự nhỏ nhất đƣợc cho phép trong bộ đệm gửi để xảy ra sự kiện OnComm = comEvSend . Theo mặc định giá trị này = 0 tức là khi truyền sẽ không gây ra sự kiện OnComm. Nếu thiết lập thông số này =1 thì sự kiện OnComm xảy ra khi bộ đệm truyền rỗng. Sự kiện
OnComm = comEvSend chỉ xảy ra khi mà số kí tự trong bộ đệm truyền nhỏ hơn hoặc = Sthreshold. Nếu số kí tự trong bộ đệm này luôn lớn hơn Sthreshold
thì sự kiện này không thể xảy ra.
Truyền nhận dữ liệu:
+ CommEvent: trả lại phần lớn sự kiện giao tiếp hoặc có lỗi.
Sau đây là một số hằng số lỗi:
Sự kiện Giá trị Miêu tả sự kiện
comEventBreak 1001 khi nhận đƣợc một tín hiệu Break.
comEventFrame 1004 Lỗi hệ thống. Phần cứng phát hiện ra một lỗi hệ thống
comEventOverrun 1006 Xảy ra khi cổng tự tràn( Overrun). Kí tự không đƣợc đọc từ phần cứng trƣớc khi kí tự tiếp theo tới và do đó kí tự này bị mất.
comEventRxOver 1008 Xảy ra khi bộ đệm nhận bị tràn. Không có đủ chỗ cho dữ liệu trong bộ đệm nhận.
comEventRxParity 1009 Lỗi Parity. Phần cứng phát hiện ra một lỗi Parity.
comEventTxFull 1010 Xảy ra khi bộ đệm truyền bị đầy. Bộ đệm truyền bị đầy trong khi ghi dữ liệu lớn vào bộ đệm
comEventDCB 1011 Một lỗi không mong muốn khi đang khôi phục lại khối điều khiển thiết bị( DCB – Device Control Block) cho cổng
Bảng 1.5: Sự kiện comevent
Một số sự kiện :
Sự kiện Giá trị Miêu tả sự kiện
comEvSend 1 Xảy ra khi số kí tự trong bộ đệm truyền nhỏ hơn giá trị SthresHold.
comEvReceive 2 Xảy ra khi bộ đệm nhận đƣợc số kí tự bằng giá trị RthresHold. Sự kiện này đƣợc tạo ra liên tục cho tới khi dùng thuộc tính Input để lấy hết dữ liệu từ trong bộ đệm nhận.
RcomEvCTS 3 Xảy ra khi có thay đổi trong đƣờng CTS( Clear To Send) comEvDSR 4 Xảy ra khi thay đổi trong đƣờng DSR( Data Set Ready). Sự
comEvCD 5 Xảy ra khi có thay đổi trong đƣờng CD( Carrier Detect)
comEvRing 6 Phát hiện chuông (Ring).Một số UART không hỗ trợ sự kiệ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)
Bảng 1.6: Bảng các sự kiện
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.
+ InBufferCout: trả lại số kí tự đang có trong bộ đệm nhậ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 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: quyế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 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.
+ 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 =