1.问题背景
对于串口的使用,在大多数时候一帧都是10位,也就是10bit(一位起始一位停止和八位数据)。那么发一帧的大小范围就是0~255,但是如果我要发送几千几万大小的数怎么办呢?很明显一帧解决进不了那就两帧,这样就可以发送0~65535这个范围的数了。
2.发送16位数据
如下这个代码是1个字节发送,最大255。(这个函数前面的参数表示是哪个串口,后面是数据,重点知道这个函数是向DR寄存器写数据的就行了)
void uart_write_byte (uart_index_enum uart_n, const uint8 dat)
{
uart_index[uart_n]->TDR = dat; // 写入发送数据
while(!(uart_index[uart_n]->CSR & (0x00000001))); // 等待发送完成
}
然后这个是将一个16位的数拆分为一个高八位和一个低八位的函数:
/*************************************************************
*数据转换,将一个16位的数据转化为一个高八位和一个低八位的数据。
**************************************************************/
void data_conver(uint8 *high_data,uint8 *low_data,uint16 my_data)
{
*high_data= (my_data >> 8) & 0xff; //高八位
*low_data= my_data & 0xff; //低八位
}
举个例子,十进制的500经过(500 >> 8) & 0xff后十进制就是1,经过500 & 0xff后十进制是244。
那么实际上我发送的500如下:
/*************************************************************
*数据转换,将一个16位的数据转化为一个高八位和一个低八位的数据。
**************************************************************/
void data_conver(uint8 *high_data,uint8 *low_data,uint16 my_data)
{
*high_data= (my_data >> 8) & 0xff; //高八位
*low_data= my_data & 0xff; //低八位
}
void uart_write_byte (uart_index_enum uart_n, const uint8 dat)
{
uart_index[uart_n]->TDR = dat; // 写入发送数据
while(!(uart_index[uart_n]->CSR & (0x00000001))); // 等待发送完成
}
int main()
{
uint16 my_data = 500;
uint8 h_data = 0;
uint8 l_data = 0;
while(1)
{
data_conver(&h_data,&l_data,my_data);
uart_write_byte(UART1,h_data);
uart_write_byte(UART1,l_data);
}
}
h_data = 1,l_data = 244。
接收16位数据
说完发送,然后就是接收了。直接上代码:
//这里就不贴里面具体的了,只需要知道这个是接收一个数据的,前面是串口号,后面是接收到的数据。
uint8 uart_query_byte (uart_index_enum uart_n, uint8 *dat);
uint8 get_data[2];
//这里是中断接收,因为要接收两个数据,使用是小于2,大于等于2清零。
void uart_rx_interrupt (void)
{
if(num < 2)
{
uart_query_byte(UART_1,&get_data[num]);
}
num++;
if(num >= 2) num = 0;
}
//然后重点来了,这里就是将得到的两个8位数据合并成16位数据
uint16 my_data = (get_data[0] << 8) | get_data[1];