物理层聚焦于通信系统中具备机械、电子功能部分的特性,保障原始数据在物理媒介上的传输;协议层则主要规范通信逻辑,统一收发双方的数据打包与解包标准。 串口通讯结构图在上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。
原理图: 输出结果: 代码: - /* 调试串口 UART4 初始化 */
- void Debug_UART4_Init(void)
- {
- fsp_err_t err = FSP_SUCCESS;
- err = R_SCI_UART_Open (&g_uart4_ctrl, &g_uart4_cfg);
- assert(FSP_SUCCESS == err);
- }
回调: - /* 发送完成标志 */
- volatile bool uart_send_complete_flag = false;
- /* 串口中断回调 */
- void debug_uart4_callback (uart_callback_args_t * p_args)
- {
- switch (p_args->event)
- {
- case UART_EVENT_RX_CHAR:
- {
- /* 把串口接收到的数据发送回去 */
- R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&(p_args->data), 1);
- break;
- }
- case UART_EVENT_TX_COMPLETE:
- {
- uart_send_complete_flag = true;
- break;
- }
- default:
- break;
- }
- }
重定向: - /* 重定向 printf 输出 */
- #if defined __GNUC__ && !defined __clang__
- int _write(int fd, char *pBuffer, int size); //防止编译警告
- int _write(int fd, char *pBuffer, int size)
- {
- (void)fd;
- R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)pBuffer, (uint32_t)size);
- while(uart_send_complete_flag == false);
- uart_send_complete_flag = false;
- return size;
- }
- #else
- int fputc(int ch, FILE *f)
- {
- (void)f;
- R_SCI_UART_Write(&g_uart4_ctrl, (uint8_t *)&ch, 1);
- while(uart_send_complete_flag == false);
- uart_send_complete_flag = false;
- return ch;
- }
- #endif
串口助手输出结果:
|