ไมโครคอนโทรลเลอร์รับตัวอักษรผ่าน RS232 โค๊ดตัวอย่างการรับค่า String คอมพิวเตอร์ส่งไปที่ไมโครคอนโทรลเลอร์ ผ่าน RS232
การสื่อสารระหว่างไมโครคอนโทรลเลอร์ กับคอมพิวเตอร์ ด้วย RS232 ยังเป็นที่นิยม เนื่องจากเป็นโปรโตคอลที่ง่าย และสะดวกรวดเร็ว เนื่องจากรับส่งข้อมูลที่ไม่ต้องการปริมาณมากๆ บ่อยครั้งที่เรามักจะใช้ RS232 ในการส่งคำสั่งบางอย่างลงไปที่ไมโครคอนโทรลเลอร์ เพื่อให้ไมโครคอนโทรลเลอร์ทำงานตามคำสั่งบางอย่างให้กับเรา
ตัวอย่างต่อไปนี้ เป็นการติดต่อสื่อสารระหว่างไมโครคอนโทรลเลอร์ และคอมพิวเตอร์ ผ่าน RS232 โดยใช้ interrupt
ของไมโครคอนโทรลเลอร์เป็นตัวคอยเช็คว่ามีข้อมูลถูกส่งมาจากคอมพิวเตอร์หรือยัง
Function name : void get_string(char* s, unsigned int8 max) Complier : CCS C Complier Purpose : Recieve data from RS232 protocal by interrupt /*--------------------- get string from RS232 -----------------------------*/ void get_string(char* s, unsigned int8 max) { unsigned int8 len; char c; --max; len=0; do { c=getc(); if(c==8) { // Backspace if(len>0) { len--; //putc(c); //putc(' '); //putc(c); } } else if ((c>=' ')&&(c<='~')) if(len<=max) { s[len++]=c; //putc(c); } } while(c!=13); s[len]=0; }
การประยุกต์ใช้งาน
ตัวอย่างต่อไปนี้ เป็นการแสดงการรับส่งข้อมูลจากคอมพิวเตอร์ ผ่านพอร์ตอนุกรม โดยส่งข้อความไปที่ไมโครคอนโทรลเลอร์ผ่าน RS232 โดยในการสาธิตนี้ เราได้ทำการจำลองการทำงานผ่านโปรแกรม Proteus และใช้โปรแกรม Virtual Serial Port Emulator เมื่อทำการเชื่อมต่อพอร์ตอนุกรม ได้แล้ว จึงทำการส่งข้อมูลที่เป็นตัวอักษรผ่าน Hyper Terminal ของโปรแกรม Windows
โค๊ด main ของโปรเจค
#include <16F877.h> // Configuration #fuses NOWDT,HS, NOPUT, NOPROTECT,NOLVP,BROWNOUT #use delay (clock=10000000) // Crystal 10MHz #define TxD PIN_C6 // Define Transmitted Data #define RxD PIN_C7 // Define Received Data #use rs232(baud=9600, xmit=TxD,rcv=RxD,stream=PC_COM) // Use serial I/O port (RS232) //External library #include "lcd1.c" // Global variables #define STRING_SIZE 6 // The number of characters allowed to input char input_str[STRING_SIZE]; BOOLEAN extREQ = FALSE; // Function prototype void get_string(char* s, unsigned int8 max); // Interrupt service routine #int_rda void rs232_isr() { get_string(input_str,STRING_SIZE); // gets the string extREQ = TRUE; } // ======================== Main ====================================// void main(void) { enable_interrupts(INT_RDA); // Enable interrupt RS232 recieve data enable_interrupts(GLOBAL); lcd_init(); delay_ms(1000); printf(lcd_putc,"\fRS232 Simple\n"); lcd_putc(".........By Mr.P"); delay_ms(1000); while(TRUE) { lcd_gotoxy(1,1); printf(lcd_putc,"Waiting for cmd ",); if(extREQ) { lcd_gotoxy(1,1); printf(lcd_putc,"\fyou put string"); lcd_gotoxy(1,2); printf(lcd_putc,"%s",input_str); delay_ms(1000); extREQ = FALSE; lcd_gotoxy(1,2); printf(lcd_putc," "); } } } /*--------------------- get string from RS232 -----------------------------*/ void get_string(char* s, unsigned int8 max) { unsigned int8 len; char c; --max; len=0; do { c=getc(); if(c==8) { // Backspace if(len>0) { len--; putc(c); putc(' '); putc(c); } } else if ((c>=' ')&&(c<='~')) if(len<=max) { s[len++]=c; putc(c); } } while(c!=13); s[len]=0; } อย่าลืมดาวน์โหลดไฟล์ lcd1.c ที่แนบไว้นี้ เข้าไปไว้ที่เดียวกันกับในโฟวเดอร์ซอร์สไฟล์ของเราด้วยครับ
|