- 定義一個串口設備,以及串口接收緩衝BUFF
struct rt_device rtt_console;
char console_receive_buf[10] = {0};
int console_receive_count = 0;
int console_read_count = 0;
- 註冊串口設備,設備名要與
rtconfig.h
中修改的相同rt_device_register(&rtt_console, "usart1", RT_DEVICE_FLAG_ACTIVATED);
- 定義串口設備的讀寫函數
rt_size_t rtt_console_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) {
rt_hw_console_output(buffer);
return size;
}
rt_size_t rtt_console_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) {
rt_size_t ret= 0;
if (console_read_count != console_receive_count) {
*(char *)buffer = console_receive_buf[console_read_count++];
console_read_count %= 10;
ret = 1;
}
return ret;
}
- 初始化串口設備的ops
rtt_console.type = RT_Device_Class_Char;
rtt_console.rx_indicate = NULL;
rtt_console.tx_complete = NULL;
rtt_console.write = rtt_console_write;
rtt_console.read = rtt_console_read;
- 對應串口的中斷函數
void USART1_IRQHandler() {
uint8_t rch;
rt_interrupt_enter();
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
rch = USART_ReceiveData(USART1);
console_receive_buf[console_receive_count++] = rch;
console_receive_count %= 10;
rtt_console.rx_indicate(&rtt_console, 1);
}
rt_interrupt_leave();
}
- 編譯燒寫,測試
list_thread
命令
-