瑞薩RA0單片機(jī)連載——實(shí)現(xiàn)串口重定向之printf
1 目的
本文引用地址:http://2s4d.com/article/202411/464858.htm在單片機(jī)的調(diào)試中,我們?nèi)粘5娜罩据敵?,通常是通過串口來實(shí)現(xiàn),而通過串口重定向來實(shí)現(xiàn)又是常規(guī)的操作之一。這次我在前面的基礎(chǔ)之上增加了printf 的面向?qū)ο蟮脑黾舆@項功能。
2 實(shí)現(xiàn)步驟
1.在工程中添加printf.c 函數(shù),并把他加入到libs的分組之中。
2.在工程的設(shè)置中,打開Use MincroLIB庫。
3.在printf.c中,添加對輸入輸出的系統(tǒng)頭文件<stdio.h>的引用,當(dāng)然由于我需要調(diào)用驅(qū)動庫要添加<devices.h>以及<hal_data.h>的引用。
4.重寫fputc輸出,在此函數(shù)中,我先查找Log 這個串口的驅(qū)動,如果查找到,則使用他的write 進(jìn)行串口輸出,代碼如下:
view plaincopy to clipboardprint?
1. int fputc(int ch, FILE *f)
2. {
3. (void)f;
4. struct UartDev *pLogDevice = UartDeviceFind
(“Log”);
5. pLogDevice->Write(pLogDevice, (unsigned
char*)&ch, 1);
6. return ch;
7. }
5.重寫scanf 函數(shù),在這個函數(shù)中,我也一樣先查找以”Log”命名的串口,如果查找到,則使用這個驅(qū)動的write 進(jìn)行輸出。其代碼如下:
view plaincopy to clipboardprint?
1. int fgetc(FILE *f)
2. {
3. uint8_t ch;
4.
5. (void)f;
6. struct UartDev *pLogDevice = UartDeviceFind
7. /* 啟動接收字符 */
8. while(pLogDevice->Read(pLogDevice,
(unsigned char*)&ch, 1) != 1)
9. {}
10. /* 回顯 */
11. {
12. fputc(ch, &__stdout);
13.
14. /* 回車之后加換行 */
15. if (ch == ‘r’)
16. {
17. fputc(‘n’, &__stdout);
18. }
19. }
20.
21. return (int)ch;
22. }
6. 驅(qū)動設(shè)置好后,就可以在工程中使用printf 進(jìn)行串口輸出了。
添加測試代碼如下:
view plaincopy to clipboardprint?
1. void led_blink(void)
2. {
3. uint32_t cnt;
4. UartDevicesRegister();
5.
6. LedDevice *pLED = LedGetDevice();
7. if(NULL == pLED)
8. {
9. printf(“Error. There is no LED device!rn”);
10. return;
11. }
12. pLED->Init(pLED);
13.
14. while(1)
15. {
16. cnt++;
17. pLED->On(1);
18. R_BSP_SoftwareDelay(1,BSP_DELAY_
UNITS_SECONDS);
19. pLED->Off (1);
20. R_BSP_SoftwareDelay(1,BSP_DELAY_
UNITS_SECONDS);
21. pLED->On(2);
22. R_BSP_SoftwareDelay(1,BSP_DELAY_
UNITS_SECONDS);
23. pLED->Off (2);
24. R_BSP_SoftwareDelay(1,BSP_DELAY_
UNITS_SECONDS);
25. printf(“run cnt %drn”,cnt);
26.
27. }
28. }
測試結(jié)果如下:
3 總結(jié)
使用面向?qū)ο笾幊?,可以?shí)現(xiàn)代碼的快遞移植,當(dāng)然重寫printf 也是非常之簡單。
(本文來源于《EEPW》2024年11期)
評論