Truyền thông qua cổng COM

Một phần của tài liệu Lưu và cập nhật động dữ liệu lên website cho mạng cảm biến không dây (Trang 43)

3.3.1.1 Giới thiệu chuẩn giao tiếp RS232

Để 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.

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 truyn d liu

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 chn 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 xẩy ra

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

Một phần của tài liệu Lưu và cập nhật động dữ liệu lên website cho mạng cảm biến không dây (Trang 43)