时间触发嵌入式系统设计模式 第18章 笔记
PC上 软件 例子:
参考 : Axelson(1998)
Serial Port Complete: Programming and Circuits for Rs-232 and Rs-485 Links and Networks
E:\Nu_LB_Nuc140\Nu_LB_NUC140_BSP\SampleCode\Nu-LB-NUC140\Sched_PC_UART_Menu
代码:
2 实现方式 用到了 循环缓冲区
没有用到 串口中断,
是通过轮询的方式,将缓冲区中的数据通过串口一个一个发送出去的。
static unsigned char Recv_buffer[RECV_BUFFER_LENGTH];
static unsigned char Tran_buffer[TRAN_BUFFER_LENGTH];
//PC_LINK_Get_Char的返回值,如果缓冲区中没有字符
/*------------------------------------------------------------------*-
PC_LINK_IO_Update()
在 UART (硬件)接收缓冲区中检查字符发送软件,发送缓冲区中的下一个字符
-*------------------------------------------------------------------*/
void PC_LINK_IO_Update(void)
{
// 这里处理发送字节
// 是否有数据准备发送 ?
if (Out_written_index_G < Out_waiting_index_G)
{
if( UART_IS_TX_EMPTY(UART0) == 1){
PC_LINK_IO_Send_Char(Tran_buffer[Out_written_index_G]);
Out_written_index_G++;
}
}
else
{
// 没有数据需要发送- 仅仅复位缓冲区指针
Out_waiting_index_G = 0;
Out_written_index_G = 0;
}
// 这里只处理接收字节
// -> 检查 RI 标志
if (UART_IS_RX_READY(UART0) == 1)
{
// 只有当接收到一个有效的停止位时 ,接收标志RI才置1
// -> 已有数据需要被读取到接收缓冲区中,
// 如果旧的数据已经读取,希望读取指针 0
// (简单的循环缓冲区)
if (In_waiting_index_G == In_read_index_G)
{
In_waiting_index_G = 0;
In_read_index_G = 0;
}
// 从USART 缓冲区中读取数据
Recv_buffer[In_waiting_index_G] = UART_READ(UART0);
if (In_waiting_index_G < RECV_BUFFER_LENGTH)
{
// 加1 且缓冲区不溢出
In_waiting_index_G++;
}
}
}
In_waiting_index_G 进入buffer的字符索引
In_read_index_G 从buffer读出的索引
循环缓冲区,当In_waiting_index_G == In_read_index_G 的时候,设置为0
(稍后补充)— 需要针对 循环缓冲区的实现 整理一个文档