Microcontroller C Code Sample

ไมโครคอนโทรลเลอร์รับตัวอักษรผ่าน 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;
}


คลิปวีดีโอสาธิตการส่งข้อมูลผ่าน RS232 กับ PIC16F877


อย่าลืมดาวน์โหลดไฟล์ lcd1.c ที่แนบไว้นี้ เข้าไปไว้ที่เดียวกันกับในโฟวเดอร์ซอร์สไฟล์ของเราด้วยครับ 

ċ
lcd1.c
(6k)
วิสิทธิ์ แผ้วกระโทก,
25 พ.ค. 2556 18:34
Comments