CHƯƠNG 3 XÂY DỰNG HỆ THỐNG CƠ SỞ DỮ LIỆU VÀ CẬP NHẬT ĐỘNG DỮ LIỆU MẠNG CẢM BIẾN KHÔNG DÂY LÊN WEBSITE
3.2. Chương trình nhúng cho các nút mạng
3.3.1. Truyền thông qua cổng COM
Để các thiết bị thu/phát có thể làm việc một cách hiệu quả không gặp rắc rối khi làm việc phối hợp với nhau, từ lâu người ta đã đặt ra các tiêu chuẩn ví dụ như về tiêu chuẩn tốc độ truyền, cách kiểm soát lỗi trong quá trình truyền, mức điện áp khi truyền cho các cổng tín hiệu vào/ra của các thiết bị. Cổng COM hay cổng nối tiếp là một cổng ghép nối đƣợc sử dụng rộng rãi để ghép các thiết bị ngoại vi với máy tính.
Giao tiếp 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à 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à 12.5 đến 25.4m, tốc độ 20kbit/s đôi khi là tốc độ 115kbit/s với một số thiết bị đặc biệt. Ý nghĩa của chuẩn truyền thông nối tiếp nghĩa là trong một thời điểm chỉ có một bit được gửi đi dọc theo đường truyền.
Các máy tính cá nhân thường có 1 hoặc 2 cổng nối tiếp theo chuẩn RS232 được gọi là cổng Com. Trên main máy tính chúng có loại 9 chân hoặc là loại 25 chân tùy vào đời máy và main máy tính. Chúng ta cũng hoàn toàn có thể sử dụng thiết bị chuyển đổi RS232 to USB để có thể kết nối dễ dàng với các máy tính không có cổng giao tiếp này.
Ta xét sơ đồ chân cổng Com 9 chân:
Hình 3.15: Sở đồ các chân của DB9 Trên là các kí hiệu chân và hình dạng của cổng DB9 Chức năng của các chân nhƣ sau:
- Chân 1 : Data Carrier Detect (DCD) Phát tín hiệu mang dữ liệu - Chân 2: Receive Data (RxD) Nhận dữ liệu
- Chân 3 : Transmit Data (TxD) Truyền dữ liệu
- Chân 4 : Data Termial Ready (DTR) Đầu cuối dữ liệu sẵn sàng đƣợc kích hoạt bởi bộ phận khi muốn truyền dữ liệu
- Chân 5 : Singal Ground ( SG) Mass của tín hiệu
- Chân 6 : Data Set Ready (DSR) Dữ liệu sẵn sàng, đƣợc kích hoạt bởi bộ truyền khi nó sẵn sàng nhận dữ liệu
- Chân 7 : Request to Send yêu cầu gửi,bô truyền đặt đường này lên mức hoạt động khi sẵn sàng truyền dữ liệu
- Chân 8 : Clear To Send (CTS) Xóa để gửi ,bô nhận đặt đường này lên mức kích hoạt động để thông báo cho bộ truyền là nó sẵn sàng nhận tín hiệu
- Chân 9 : Ring Indicate (RI) Báo chuông cho biết là bộ nhận đang nhận tín hiệu rung chuông
Quá trình truyền dữ liệu
Truyền dữ liệu qua cổng nối tiếp RS232 đƣợc thực hiện không đồng bộ. Do vậy nên tại một thời điểm chỉ có một bit đƣợc truyền (1 kí tự). Bộ truyền gửi một bit bắt đầu (bit start) để thông báo cho bộ nhận biết một kí tự sẽ đƣợc gửi đến trong lần truyền bit tiếp the . Bit này luôn bắt đầu bằng mức 0. Tiếp theo đó là các bit dữ liệu (bits data) được gửi dưới dạng mã ASCII( có thể là 5,6,7 hay 8 bit dữ liệu) Sau đó là một Parity bit ( Kiểm tra bit chẵn, lẻ hay không) và cuối cùng là bit dừng - bit stop có thể là 1, 1,5 hay 2 bit dừng.
Tốc độ Baud
Đây là một tham số đặc trƣng của RS232. Tham số này chính là đặc trƣng cho quá trình truyền dữ liệu qua cổng nối tiếp RS232 là tốc độ truyền nhận dữ liệu hay còn gọi là tốc độ bit. Tốc độ bit đƣợc định nghĩa là số bit truyền đƣợc trong thời gian 1 giây hay số bit truyền đƣợc trong thời gian 1 giây. Tốc độ bit này phải đƣợc thiết lập ở bên phát và bên nhận đều phải có tốc độ nhƣ nhau (Tốc độ giữa vi điều khiển và máy tính phải chung nhau 1 tốc độ truyền bit)
Ngoài tốc độ bit còn một tham số để mô tả tốc độ truyền là tốc độ Baud. Tốc độ Baud liên quan đến tốc độ mà phần tử mã hóa dữ liệu đƣợc sử dụng để diễn tả bit đƣợc truyền còn tôc độ bit thì phản ánh tốc độ thực tế mà các bit đƣợc truyền.Vì một phần tử báo hiệu sự mã hóa một bit nên khi đó hai tốc độ bit và tốc độ baud là phải đồng nhất
Một số tốc độ Baud thường dùng: 50, 75, 110, 150, 300, 600, 1200, 2400, 4800, 9600, 19200, 28800, 38400, 56000, 115200 … Trong thiết bị họ thường dùng tốc độ là 19200
Khi sử dụng chuẩn nối tiếp RS232 thì yêu cầu khi sử dụng chuẩn là thời gian chuyển mức logic không vƣợt quá 4% thời gian truyền 1 bit. Do vậy, nếu tốc độ bit càng cao thì thời gian truyền 1 bit càng nhỏ thì thời gian chuyển mức logic càng phải nhỏ. Điều này làm giới hạn tốc Baud và khoảng cách truyền.
Bit chẵn lẻ hay Parity bit
Đây là bit kiểm tra lỗi trên đường truyền. Thực chất của quá trình kiểm tra lỗi khi truyền dữ liệu là bổ xung thêm dữ liệu đƣợc truyền để tìm ra hoặc sửa một số lỗi trong quá trình truyền . Do đó trong chuẩn RS232 sử dụng một kỹ thuật kiểm tra chẵn lẻ.Một bit chẵn lẻ đƣợc bổ sung vào dữ liệu đƣợc truyền để cho thấy số lƣợng các bit
"1" đƣợc gửi trong một khung truyền là chẵn hay lẻ. Một Parity bit chỉ có thể tìm ra một số lẻ các lỗi chả hạn nhƣ 1,3,5,7,9... Nếu nhƣ một bit chẵn đƣợc mắc lỗi thì Parity bit sẽ trùng giá trị với trường hợp không mắc lỗi vì thế không phát hiện ra lỗi. Do đó trong kỹ thuật mã hóa lỗi này không được sử dụng trong trường hợp có khả năng một vài bit bị mắc lỗi.
3.3.1.2. Kết nối cổng COM cho CC1010
Vi điểu khiển CC1010 có 2 UARTs cho phép lập trình truyền thông nối tiếp không đồng bộ với máy tính thông qua cổng COM. Đầu tiên chúng ta sẽ thiết đặt các thông số cho kết nối này với tốc độ 57600 baud, tần số dao động thạch anh 14746Hz, không kiểm tra chẵn lẻ, kích hoạt truyền và nhận, 8 bit dữ liệu, 1 bit stop, chạy theo kiểu thăm dò (polled).
UART0_SETUP(57600, 14746, UART_NO_PARITY | UART_RX_TX | UART_POLLED);
Dựa trên cấu trúc khung dữ liệu của mạng WSN (xem hình 2.4) ta sẽ đƣa thông tin lên cổng COM, các dữ liệu đƣợc cách biệt nhau bằng ký tự tab \t và đƣợc đồng bộ với nhau bằng chuỗi ký tự END\n\r để tách biệt các khung.
printf("%u\t",rxDataBuffer.packet.source);
printf("NodeName\t");
printf("%u\t",rxDataBuffer.packet.target);
printf("%u\t",rxDataBuffer.packet.type);
printf("%u\t",rxDataBuffer.packet.dat);
printf("%u\t",rxDataBuffer.packet.bat);
printf("END\n\r");
3.3.1.3. Kết nối cổng COM trên PC
Để lập trình ghép nối cổng COM trên PC ta phải có thêm thành phần điều khiển truyền thông đã có sẵn trong bộ VS.NET 2008 là serial port.
Khai báo một Object Serial Port mới
private SerialPort comport = new SerialPort();
Khai báo hàm delegate bằng phương thức DataReceived của Object SerialPort, khi dữ liệu nhận đƣợc quả port, ta sẽ gọi hàm này lên
comport.DataReceived += new SerialDataReceivedEventHandler (port_DataReceived);
Tiếp theo ta sẽ thiết đặt các thông số cơ bản cho cổng COM thông qua phần thiết đặt cá nhấn và hiển thị thiết đặt này. Các thông số bao gồm: tốc độ BaudRate, Bit chẵn lẻ Parity, Bit dữ liệu và Bit Stop.
Các giá trị hợp lệ của tốc độ Baud 75
110 134 150 300 600
1200 1800 2400 4800 7200 9600
14400 19200 38400 57600 115200 128000
Giá trị chẵn lẻ (parity)
Giá trị ý nghĩa
Even Chẵn
Mark Dấu (Mark)
Nomal
Không kiểm tra (mặc định)
Old Lẻ (Old)
Space Trống (Space)
Số bit dữ liệu truyền (bit data ) 4
5 6
7
8 (mặc định)
Số bit dừng (bit stop) 1 1,5
2
Các thông số đƣợc thiết đặt thông qua phần setting.settings với các giá trị mặc định
Hình 3.16: Thiết đặt thông số cho Comport
Nghĩa là cổng COM đƣợc thiết lập với tốc độ 57600 baud, không kiểm tra chẵn lẻ, 8 bit dữ liệu, 1 bit stop, số hiệu cổng COM đây là COM1
Ta có thể thiết đặt các giá trị trực tiếp trên thanh công cụ properties (vào mục Items) hay code
Số hiệu cổng COM
cmbPortName. Items.AddRange("COM1", "COM2", "COM3", "COM4");
Tốc độ BaudRate
cmbBaudRate. Items.AddRange("1200", "2400", "4800", "9600", "19200",
"38400", "57600", "115200");
Giá trị Parity
cmbParity. Items.AddRange("None", "Odd", "Even");
Giá trị Data Bit
cmbDataBits. Items.AddRange("6", "7", "8");
Giá trị Bit Stop
cmbStopBits. Items.AddRange("1", "1.5", "2");
Nhận dữ liệu:
Trước tiên ta phải thiết đặt kích cỡ của Buffer. Thuộc tính ReadBufferSize bỏ qua bất kỳ giá trị nào nhỏ hơn so với 4069. Bởi vì nó chỉ đại diện cho bộ đệm của Windows tạo ra. Nó có thể trả về một giá trị nhỏ hơn so với thuộc tính BytesToRead cái mà đại diện cho cả bộ đệm SerialPort và bộ đệm Windows tạo ra.
comport.ReadBufferSize = 1024;
Thiết lập số byte có trong bộ đệm đầu vào trước khi một sự kiện DataReceived
comport.ReceivedBytesThreshold = 20;
Mở kết nối đến Port. Chỉ có thể có một kết nối mở tồn tại cho mỗi đối tƣợng SerialPort. Cách làm tốt nhất cho bất kỳ ứng dụng nào là để chờ một số thời gian sau khi gọi phương thức Close() trước khi cố gắng gọi phương thức Open(), như vậy Port không thể đóng ngay lập tức
comport.Open();
Đọc tất cả các dữ liệu đợi trong bộ đệm. Phương thức này cho phép đọc ngay lập tức tất cả byte có sẵn, dựa trên mã hóa, trong cả dòng và bộ đệm đầu vào của đối tƣợng SerialPort. Nó trả về nội dung của dòng và bộ đệm trong nhƣ là một chuỗi (string). Phương pháp này không sử dụng thời gian chờ và nó cũng có thể để lại byte dẫn đầu trong bộ đệm mà làm cho giá trị BytesToRead lớn hơn 0. Nếu nó là cần thiết để chuyển đổi giữa các văn bản và đọc dữ liệu nhị phân từng dòng, chọn một giao thức một cách cẩn thận để định nghĩa ranh giới giữa văn bản và dữ liệu nhị phân, chẳng hạn nhƣ đọc byte thủ công và mã hóa dữ liệu.
string data = comport.ReadExisting();
Gửi dữ liệu:
Để gửi dữ liệu thông qua SerialPort ta sử dụng hàm Write comport.Write(txtSendData.Text);
3.3.2. Chương trình giao diện cảnh báo