PIC ส่วนใหญ่มี hardware UART อยู่ 1 port ครับสามารถรับส่งข้อมูลแบบ Full Duplex
(รับส่งได้ในขณะเดียวกัน )ดู ต.ย. ที่
http://www.thaimicrotron.com/CCS-628/EXAM/RS232.htm มี ต.ย.ให้ดูทั้ง2 แบบ และ
http://www.thaimicrotron.com/CCS-628/Referrence/RS232.htmนอกนั้นก็สามารถ ใช้เป็น software UART ได้ทุก port
และสามารถใช้ได้อีกหลาย port ด้วย เวลาจะใช้ port ใดก็ให้ระบุ port ที่จะส่งนั้น
แต่จะเป็นแบบ Half Duplex (เป็นการส่งและรับข้อมูลแบบสลับกัน)
หากเป็น RA4 ต้องต่อ R pull up เพราะเป็นแบบ open dain
PIC16F877 ก็มี Hardware port อยู่ 1 port คือ RC6 เป็น TX และ RC7 เป็น RX
- เมื่อใช้คำสั่ง #use rs232 โดยกำหนดขา TX,RX ให้ตรงกับ hardware ของ PIC
คอมไพเลอร์จะรู้ว่า เราต้องการที่จะใชพอร์ตอนุกรมแบบ hardware
- หากกำหนด ขาอื่นที่ไม่ใช้ Hardware port
คอมไพเลอร์ ก็จะสร้างคำสั่งให้เองเลย เราไม่ต้องเขียนคำสั่งขึ้นมาใหม่
การกำหนด hardware port ของ PIC16F877
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8
- เพราะ RC6,RC7 เป็น hardware port ของ PIC
การกำหนด software port ของ pic16f877
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8
- เพราะ RA0,RA1 ไม่ได้เป็น hardware port ของ PIC
ต.ย. การใช้งาน
ใช้ Hardware Port
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8
printf("HW PORT\r\n");
และเมื่อจะเปลี่ยนไปเป็น software port
#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8
printf("SW PORT\r\n");
ในกรณีของคุณการรับ ควรใช้ Hardware port เพราะถือว่าสำคัญกว่า เพราะไม่รู้ว่าจะมีการส่ง ข้อมูลมาเมื่อไร
ส่วนการส่งออกไปอีก port นั้น ให้เป็น soft ware port เพราะเรามักจะรู้ว่าเราจะส่งเมื่อไร
ใน help ของ CCS ก็มี ต.ย. ให้ดูครับ
ใน topic How can I use two or more RS-232 ports on one PIC
ซึ่งการใช้ก็จะต่างกันออกไปอีกแบบ คือกำหนด STREAM=COM_A, และ STREAM=COM_B
และใช้ฟังก์ชั่น fprintf();
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7, STREAM=COM_A)
#USE RS232(BAUD=9600, XMIT=PIN_A0, RCV=PIN_A1, STREAM=COM_B)
main()
{
char c;
fprintf(COM_A,"Online port1 \n\r");
fprintf(COM_B,"Online port2 \n\r");
while(TRUE)
{
c = fgetc(COM_A);
fputc(c, COM_A);
fputc(c, COM_B);
}
}